Skip to content

Commit 35a403e

Browse files
committed
fixes
1 parent 09a0cc2 commit 35a403e

2 files changed

Lines changed: 88 additions & 5 deletions

File tree

vlib/v/pref/default.v

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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 .s390x
112+
}
113+
if name.contains('ppc64le') {
114+
return .ppc64le
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

86139
pub 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')

vlib/v/pref/pref_test.v

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,35 @@ fn test_cross_compile_keeps_explicit_cc() {
5252
assert second.ccompiler == custom_cc
5353
}
5454

55+
fn test_cross_compile_defaults_windows_to_the_cross_compiler_arch() {
56+
if pref.get_host_os() == .windows {
57+
return
58+
}
59+
target := os.join_path(vroot, 'examples', 'hello_world.v')
60+
prefs, _ := pref.parse_args_and_show_errors([], ['', '-os', 'windows', target], false)
61+
assert prefs.arch == .amd64
62+
assert prefs.ccompiler == 'x86_64-w64-mingw32-gcc'
63+
}
64+
65+
fn test_cross_compile_infers_android_arch_from_vcross_compiler_name() {
66+
target := os.join_path(vroot, 'examples', 'hello_world.v')
67+
old_cross_compiler := os.getenv('VCROSS_COMPILER_NAME')
68+
defer {
69+
os.setenv('VCROSS_COMPILER_NAME', old_cross_compiler, true)
70+
}
71+
for compiler_name, expected_arch in {
72+
'aarch64-linux-android21-clang': pref.Arch.arm64
73+
'armv7a-linux-androideabi21-clang': pref.Arch.arm32
74+
'i686-linux-android21-clang': pref.Arch.i386
75+
'x86_64-linux-android21-clang': pref.Arch.amd64
76+
} {
77+
os.setenv('VCROSS_COMPILER_NAME', compiler_name, true)
78+
prefs, _ := pref.parse_args_and_show_errors([], ['', '-os', 'android', target], false)
79+
assert prefs.arch == expected_arch
80+
assert prefs.ccompiler == compiler_name
81+
}
82+
}
83+
5584
fn test_musl_defaults_to_no_gc() {
5685
target := os.join_path(vroot, 'examples', 'hello_world.v')
5786
prefs, _ := pref.parse_args_and_show_errors([], ['', '-musl', target], false)

0 commit comments

Comments
 (0)