1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

v.builder: fix v -os wasm32_emscripten examples/2048 on windows

This commit is contained in:
Delyan Angelov 2022-12-04 17:49:33 +02:00
parent f5d0ba318e
commit d8d75ee67e
3 changed files with 26 additions and 8 deletions

View File

@ -185,7 +185,7 @@ fn (mut v Builder) setup_ccompiler_options(ccompiler string) {
ccoptions.guessed_compiler = v.pref.ccompiler ccoptions.guessed_compiler = v.pref.ccompiler
if ccoptions.guessed_compiler == 'cc' && v.pref.is_prod { if ccoptions.guessed_compiler == 'cc' && v.pref.is_prod {
// deliberately guessing only for -prod builds for performance reasons // deliberately guessing only for -prod builds for performance reasons
ccversion := os.execute('${os.quoted_path('cc')} --version') ccversion := os.execute('cc --version')
if ccversion.exit_code == 0 { if ccversion.exit_code == 0 {
if ccversion.output.contains('This is free software;') if ccversion.output.contains('This is free software;')
&& ccversion.output.contains('Free Software Foundation, Inc.') { && ccversion.output.contains('Free Software Foundation, Inc.') {
@ -412,7 +412,9 @@ fn (v &Builder) all_args(ccoptions CcompilerOptions) []string {
// normally msvc should use /volatile:iso // normally msvc should use /volatile:iso
// but it could have an impact on vinix if it is created with msvc. // but it could have an impact on vinix if it is created with msvc.
if !ccoptions.is_cc_msvc { if !ccoptions.is_cc_msvc {
if v.pref.os != .wasm32_emscripten {
all << '-Wl,-stack=16777216' all << '-Wl,-stack=16777216'
}
if !v.pref.is_cstrict { if !v.pref.is_cstrict {
all << '-Werror=implicit-function-declaration' all << '-Werror=implicit-function-declaration'
} }
@ -569,14 +571,14 @@ pub fn (mut v Builder) cc() {
all_args := v.all_args(v.ccoptions) all_args := v.all_args(v.ccoptions)
v.dump_c_options(all_args) v.dump_c_options(all_args)
str_args := all_args.join(' ') str_args := all_args.join(' ')
mut cmd := '${os.quoted_path(ccompiler)} ${str_args}' mut cmd := '${v.quote_compiler_name(ccompiler)} ${str_args}'
mut response_file := '' mut response_file := ''
mut response_file_content := str_args mut response_file_content := str_args
if !v.pref.no_rsp { if !v.pref.no_rsp {
response_file = '${v.out_name_c}.rsp' response_file = '${v.out_name_c}.rsp'
response_file_content = str_args.replace('\\', '\\\\') response_file_content = str_args.replace('\\', '\\\\')
rspexpr := '@${response_file}' rspexpr := '@${response_file}'
cmd = '${os.quoted_path(ccompiler)} ${os.quoted_path(rspexpr)}' cmd = '${v.quote_compiler_name(ccompiler)} ${os.quoted_path(rspexpr)}'
os.write_file(response_file, response_file_content) or { os.write_file(response_file, response_file_content) or {
verror('Unable to write to C response file "${response_file}"') verror('Unable to write to C response file "${response_file}"')
} }
@ -735,7 +737,7 @@ fn (mut b Builder) cc_linux_cross() {
cc_name = 'clang.exe' cc_name = 'clang.exe'
out_name = out_name.trim_string_right('.exe') out_name = out_name.trim_string_right('.exe')
} }
cc_cmd := '${os.quoted_path(cc_name)} ' + cc_args.join(' ') cc_cmd := '${b.quote_compiler_name(cc_name)} ' + cc_args.join(' ')
if b.pref.show_cc { if b.pref.show_cc {
println(cc_cmd) println(cc_cmd)
} }
@ -757,7 +759,7 @@ fn (mut b Builder) cc_linux_cross() {
$if windows { $if windows {
ldlld = 'ld.lld.exe' ldlld = 'ld.lld.exe'
} }
linker_cmd := '${os.quoted_path(ldlld)} ' + linker_args.join(' ') linker_cmd := '${b.quote_compiler_name(ldlld)} ' + linker_args.join(' ')
// s = s.replace('SYSROOT', sysroot) // TODO $ inter bug // s = s.replace('SYSROOT', sysroot) // TODO $ inter bug
// s = s.replace('-o hi', '-o ' + c.pref.out_name) // s = s.replace('-o hi', '-o ' + c.pref.out_name)
if b.pref.show_cc { if b.pref.show_cc {
@ -931,7 +933,7 @@ fn (mut v Builder) build_thirdparty_obj_file(mod string, path string, moduleflag
all_options << '-c ${os.quoted_path(cfile)}' all_options << '-c ${os.quoted_path(cfile)}'
cc_options := v.thirdparty_object_args(v.ccoptions, all_options).join(' ') cc_options := v.thirdparty_object_args(v.ccoptions, all_options).join(' ')
cmd := '${os.quoted_path(v.pref.ccompiler)} ${cc_options}' cmd := '${v.quote_compiler_name(v.pref.ccompiler)} ${cc_options}'
$if trace_thirdparty_obj_files ? { $if trace_thirdparty_obj_files ? {
println('>>> build_thirdparty_obj_files cmd: ${cmd}') println('>>> build_thirdparty_obj_files cmd: ${cmd}')
} }

View File

@ -6,13 +6,26 @@ module builder
import os import os
import v.pref import v.pref
pub fn (mut v Builder) quote_compiler_name(name string) string {
// some compiler frontends on windows, like emcc, are a .bat file on windows.
// Quoting the .bat file name here leads to problems with them, when they internally call python scripts for some reason.
// Just emcc without quotes here does work, but:
// |"emcc" -v| produces: python.exe: can't open file 'D:\programs\v\emcc.py': [Errno 2] No such file or directory
if name.contains('/') || name.contains('\\') {
return os.quoted_path(name)
}
return name
}
pub fn (mut v Builder) find_win_cc() ! { pub fn (mut v Builder) find_win_cc() ! {
$if !windows { $if !windows {
return return
} }
ccompiler_version_res := os.execute('${os.quoted_path(v.pref.ccompiler)} -v') cmd_version := '${v.quote_compiler_name(v.pref.ccompiler)} -v'
ccompiler_version_res := os.execute(cmd_version)
if ccompiler_version_res.exit_code != 0 { if ccompiler_version_res.exit_code != 0 {
if v.pref.is_verbose { if v.pref.is_verbose {
println('failed command: `${cmd_version}`')
println('${v.pref.ccompiler} not found, looking for msvc...') println('${v.pref.ccompiler} not found, looking for msvc...')
} }
find_msvc(v.pref.m64) or { find_msvc(v.pref.m64) or {

View File

@ -285,6 +285,9 @@ pub fn (p &Preferences) vcross_compiler_name() string {
return 'clang' return 'clang'
} }
if p.os == .wasm32_emscripten { if p.os == .wasm32_emscripten {
if os.user_os() == 'windows' {
return 'emcc.bat'
}
return 'emcc' return 'emcc'
} }
if p.backend == .c && !p.out_name.ends_with('.c') { if p.backend == .c && !p.out_name.ends_with('.c') {