@@ -70,17 +70,70 @@ fn (mut p Preferences) setup_os_and_arch_when_not_explicitly_set() {
7070 if host_os == .macos && p.os == .linux {
7171 // Cross compilation from macos -> linux; assume AMD64 as the target architecture for now
7272 if p.arch == ._auto {
73- p.arch = .amd64
74- p.build_options << '-arch amd64'
73+ p.set_default_arch (.amd64 )
7574 }
7675 p.parse_define ('use_bundled_libgc' )
7776 }
7877 }
7978 }
80- if p.arch == ._auto {
81- p.arch = get_host_arch ()
82- p.build_options << '-arch ${p.arch} '
79+ }
80+
81+ fn (mut p Preferences) set_default_arch (arch Arch) {
82+ if p.arch != ._auto || arch == ._auto {
83+ return
84+ }
85+ p.arch = arch
86+ p.build_options << '-arch ${arch} '
87+ }
88+
89+ fn arch_from_ccompiler_name (ccompiler string ) Arch {
90+ name := os.file_name (ccompiler).to_lower_ascii ()
91+ if name.contains ('x86_64' ) || name.contains ('amd64' ) {
92+ return .amd64
93+ }
94+ if name.contains ('aarch64' ) || name.contains ('arm64-v8a' ) || name.contains ('arm64' ) {
95+ return .arm64
96+ }
97+ if name.contains ('armeabi-v7a' ) || name.contains ('armv7' )
98+ || name.contains ('arm-linux-androideabi' ) || name.contains ('arm32' ) {
99+ return .arm32
100+ }
101+ if name.contains ('riscv64' ) {
102+ return .rv64
103+ }
104+ if name.contains ('riscv32' ) {
105+ return .rv32
106+ }
107+ if name.contains ('i686' ) || name.contains ('i386' ) || name.contains ('x86' ) {
108+ return .i386
109+ }
110+ if name.contains ('s390x' ) {
111+ return .s390 x
112+ }
113+ if name.contains ('ppc64le' ) {
114+ return .ppc64 le
115+ }
116+ if name.contains ('loongarch64' ) {
117+ return .loongarch64
118+ }
119+ if name.contains ('sparc64' ) {
120+ return .sparc64
121+ }
122+ if name.contains ('ppc64' ) {
123+ return .ppc64
124+ }
125+ return ._auto
126+ }
127+
128+ fn (mut p Preferences) resolve_default_arch () {
129+ if p.arch != ._auto {
130+ return
131+ }
132+ host_os := if p.backend == .wasm { OS.wasi } else { get_host_os () }
133+ if p.os != host_os {
134+ p.set_default_arch (arch_from_ccompiler_name (p.ccompiler))
83135 }
136+ p.set_default_arch (get_host_arch ())
84137}
85138
86139pub fn (mut p Preferences) defines_map_unique_keys () string {
@@ -189,6 +242,7 @@ pub fn (mut p Preferences) fill_with_defaults() {
189242 p.default_cpp_compiler ()
190243 }
191244 p.find_cc_if_cross_compiling ()
245+ p.resolve_default_arch ()
192246 p.ccompiler_type = cc_from_string (p.ccompiler)
193247 p.disable_tcc_shared_backtraces ()
194248 p.is_test = p.path.ends_with ('_test.v' ) || p.path.ends_with ('_test.vv' )
0 commit comments