v.builder: fix `-cc msvc -cflags /O2` and support CFLAGS and LDFLAGS env vars
parent
219a764a83
commit
2eeba4758a
|
@ -29,9 +29,6 @@ pub fn (mut b Builder) build_c(v_files []string, out_file string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut b Builder) compile_c() {
|
pub fn (mut b Builder) compile_c() {
|
||||||
if os.user_os() != 'windows' && b.pref.ccompiler == 'msvc' && !b.pref.out_name.ends_with('.c') {
|
|
||||||
verror('Cannot build with msvc on $os.user_os()')
|
|
||||||
}
|
|
||||||
// cgen.genln('// Generated by V')
|
// cgen.genln('// Generated by V')
|
||||||
// println('compile2()')
|
// println('compile2()')
|
||||||
if b.pref.is_verbose {
|
if b.pref.is_verbose {
|
||||||
|
|
|
@ -517,7 +517,7 @@ fn (mut v Builder) cc() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Cross compiling for Windows
|
// Cross compiling for Windows
|
||||||
if v.pref.os == .windows {
|
if v.pref.os == .windows && v.pref.ccompiler != 'msvc' {
|
||||||
$if !windows {
|
$if !windows {
|
||||||
v.cc_windows_cross()
|
v.cc_windows_cross()
|
||||||
return
|
return
|
||||||
|
@ -618,12 +618,10 @@ fn (mut v Builder) cc() {
|
||||||
v.ccoptions.post_args << libs
|
v.ccoptions.post_args << libs
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
$if windows {
|
|
||||||
if ccompiler == 'msvc' {
|
if ccompiler == 'msvc' {
|
||||||
v.cc_msvc()
|
v.cc_msvc()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
|
||||||
//
|
//
|
||||||
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)
|
||||||
|
|
|
@ -268,17 +268,23 @@ pub fn (mut v Builder) cc_msvc() {
|
||||||
r := v.cached_msvc
|
r := v.cached_msvc
|
||||||
if r.valid == false {
|
if r.valid == false {
|
||||||
verror('Cannot find MSVC on this OS')
|
verror('Cannot find MSVC on this OS')
|
||||||
return
|
|
||||||
}
|
}
|
||||||
out_name_obj := os.real_path(v.out_name_c + '.obj')
|
out_name_obj := os.real_path(v.out_name_c + '.obj')
|
||||||
out_name_pdb := os.real_path(v.out_name_c + '.pdb')
|
out_name_pdb := os.real_path(v.out_name_c + '.pdb')
|
||||||
out_name_cmd_line := os.real_path(v.out_name_c + '.rsp')
|
out_name_cmd_line := os.real_path(v.out_name_c + '.rsp')
|
||||||
|
//
|
||||||
|
env_cflags := os.getenv('CFLAGS')
|
||||||
|
env_ldflags := os.getenv('LDFLAGS')
|
||||||
|
mut a := [v.pref.cflags]
|
||||||
|
if env_cflags != '' {
|
||||||
|
a << env_cflags
|
||||||
|
}
|
||||||
// Default arguments
|
// Default arguments
|
||||||
// volatile:ms enables atomic volatile (gcc _Atomic)
|
// volatile:ms enables atomic volatile (gcc _Atomic)
|
||||||
// -w: no warnings
|
// -w: no warnings
|
||||||
// 2 unicode defines
|
// 2 unicode defines
|
||||||
// /Fo sets the object file name - needed so we can clean up after ourselves properly
|
// /Fo sets the object file name - needed so we can clean up after ourselves properly
|
||||||
mut a := ['-w', '/we4013', '/volatile:ms', '/Fo"$out_name_obj"']
|
a << ['-w', '/we4013', '/volatile:ms', '/Fo"$out_name_obj"']
|
||||||
if v.pref.is_prod {
|
if v.pref.is_prod {
|
||||||
a << '/O2'
|
a << '/O2'
|
||||||
a << '/MD'
|
a << '/MD'
|
||||||
|
@ -323,7 +329,7 @@ pub fn (mut v Builder) cc_msvc() {
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
if v.pref.sanitize {
|
if v.pref.sanitize {
|
||||||
println('Sanitize not supported on msvc.')
|
eprintln('Sanitize not supported on msvc.')
|
||||||
}
|
}
|
||||||
// The C file we are compiling
|
// The C file we are compiling
|
||||||
// a << '"$TmpPath/$v.out_name_c"'
|
// a << '"$TmpPath/$v.out_name_c"'
|
||||||
|
@ -332,7 +338,6 @@ pub fn (mut v Builder) cc_msvc() {
|
||||||
// Not all of these are needed (but the compiler should discard them if they are not used)
|
// Not all of these are needed (but the compiler should discard them if they are not used)
|
||||||
// these are the defaults used by msbuild and visual studio
|
// these are the defaults used by msbuild and visual studio
|
||||||
mut real_libs := ['kernel32.lib', 'user32.lib', 'advapi32.lib']
|
mut real_libs := ['kernel32.lib', 'user32.lib', 'advapi32.lib']
|
||||||
// sflags := v.get_os_cflags().msvc_string_flags()
|
|
||||||
sflags := msvc_string_flags(v.get_os_cflags())
|
sflags := msvc_string_flags(v.get_os_cflags())
|
||||||
real_libs << sflags.real_libs
|
real_libs << sflags.real_libs
|
||||||
inc_paths := sflags.inc_paths
|
inc_paths := sflags.inc_paths
|
||||||
|
@ -362,6 +367,9 @@ pub fn (mut v Builder) cc_msvc() {
|
||||||
a << '/OPT:ICF'
|
a << '/OPT:ICF'
|
||||||
}
|
}
|
||||||
a << lib_paths
|
a << lib_paths
|
||||||
|
if env_ldflags != '' {
|
||||||
|
a << env_ldflags
|
||||||
|
}
|
||||||
args := a.join(' ')
|
args := a.join(' ')
|
||||||
// write args to a file so that we dont smash createprocess
|
// write args to a file so that we dont smash createprocess
|
||||||
os.write_file(out_name_cmd_line, args) or {
|
os.write_file(out_name_cmd_line, args) or {
|
||||||
|
@ -371,12 +379,14 @@ pub fn (mut v Builder) cc_msvc() {
|
||||||
// It is hard to see it at first, but the quotes above ARE balanced :-| ...
|
// It is hard to see it at first, but the quotes above ARE balanced :-| ...
|
||||||
// Also the double quotes at the start ARE needed.
|
// Also the double quotes at the start ARE needed.
|
||||||
v.show_cc(cmd, out_name_cmd_line, args)
|
v.show_cc(cmd, out_name_cmd_line, args)
|
||||||
|
if os.user_os() != 'windows' && !v.pref.out_name.ends_with('.c') {
|
||||||
|
verror('Cannot build with msvc on $os.user_os()')
|
||||||
|
}
|
||||||
util.timing_start('C msvc')
|
util.timing_start('C msvc')
|
||||||
res := os.execute(cmd)
|
res := os.execute(cmd)
|
||||||
if res.exit_code != 0 {
|
if res.exit_code != 0 {
|
||||||
eprintln(res.output)
|
eprintln(res.output)
|
||||||
verror('msvc error')
|
verror('msvc error')
|
||||||
return
|
|
||||||
}
|
}
|
||||||
util.timing_measure('C msvc')
|
util.timing_measure('C msvc')
|
||||||
if v.pref.show_c_output {
|
if v.pref.show_c_output {
|
||||||
|
@ -394,7 +404,6 @@ fn (mut v Builder) build_thirdparty_obj_file_with_msvc(path string, moduleflags
|
||||||
msvc := v.cached_msvc
|
msvc := v.cached_msvc
|
||||||
if msvc.valid == false {
|
if msvc.valid == false {
|
||||||
verror('Cannot find MSVC on this OS')
|
verror('Cannot find MSVC on this OS')
|
||||||
return
|
|
||||||
}
|
}
|
||||||
// msvc expects .obj not .o
|
// msvc expects .obj not .o
|
||||||
mut obj_path := '${path}bj'
|
mut obj_path := '${path}bj'
|
||||||
|
@ -410,7 +419,12 @@ fn (mut v Builder) build_thirdparty_obj_file_with_msvc(path string, moduleflags
|
||||||
defines := flags.defines.join(' ')
|
defines := flags.defines.join(' ')
|
||||||
include_string := '-I "$msvc.ucrt_include_path" -I "$msvc.vs_include_path" -I "$msvc.um_include_path" -I "$msvc.shared_include_path" $inc_dirs'
|
include_string := '-I "$msvc.ucrt_include_path" -I "$msvc.vs_include_path" -I "$msvc.um_include_path" -I "$msvc.shared_include_path" $inc_dirs'
|
||||||
// println('cfiles: $cfiles')
|
// println('cfiles: $cfiles')
|
||||||
mut oargs := []string{}
|
env_cflags := os.getenv('CFLAGS')
|
||||||
|
env_ldflags := os.getenv('LDFLAGS')
|
||||||
|
mut oargs := [v.pref.cflags]
|
||||||
|
if env_cflags != '' {
|
||||||
|
oargs << env_cflags
|
||||||
|
}
|
||||||
if v.pref.is_prod {
|
if v.pref.is_prod {
|
||||||
oargs << '/O2'
|
oargs << '/O2'
|
||||||
oargs << '/MD'
|
oargs << '/MD'
|
||||||
|
@ -419,6 +433,9 @@ fn (mut v Builder) build_thirdparty_obj_file_with_msvc(path string, moduleflags
|
||||||
oargs << '/MDd'
|
oargs << '/MDd'
|
||||||
oargs << '/D_DEBUG'
|
oargs << '/D_DEBUG'
|
||||||
}
|
}
|
||||||
|
if env_ldflags != '' {
|
||||||
|
oargs << env_ldflags
|
||||||
|
}
|
||||||
str_oargs := oargs.join(' ')
|
str_oargs := oargs.join(' ')
|
||||||
cmd := '"$msvc.full_cl_exe_path" /volatile:ms $str_oargs $defines $include_string /c $cfiles /Fo"$obj_path"'
|
cmd := '"$msvc.full_cl_exe_path" /volatile:ms $str_oargs $defines $include_string /c $cfiles /Fo"$obj_path"'
|
||||||
// NB: the quotes above ARE balanced.
|
// NB: the quotes above ARE balanced.
|
||||||
|
@ -429,7 +446,6 @@ fn (mut v Builder) build_thirdparty_obj_file_with_msvc(path string, moduleflags
|
||||||
if res.exit_code != 0 {
|
if res.exit_code != 0 {
|
||||||
println('msvc: failed to build a thirdparty object; cmd: $cmd')
|
println('msvc: failed to build a thirdparty object; cmd: $cmd')
|
||||||
verror(res.output)
|
verror(res.output)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
println(res.output)
|
println(res.output)
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,10 +141,16 @@ pub fn (mut p Preferences) fill_with_defaults() {
|
||||||
fn (mut p Preferences) find_cc_if_cross_compiling() {
|
fn (mut p Preferences) find_cc_if_cross_compiling() {
|
||||||
if p.os == .windows {
|
if p.os == .windows {
|
||||||
$if !windows {
|
$if !windows {
|
||||||
|
// Allow for explicit overrides like `v -showcc -cc msvc -os windows file.v`,
|
||||||
|
// so that the flag passing can be debugged on other OSes too, not only
|
||||||
|
// on windows (building will stop later, when -showcc already could display all
|
||||||
|
// options).
|
||||||
|
if p.ccompiler != 'msvc' {
|
||||||
// Cross compiling to Windows
|
// Cross compiling to Windows
|
||||||
p.ccompiler = 'x86_64-w64-mingw32-gcc'
|
p.ccompiler = 'x86_64-w64-mingw32-gcc'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if p.os == .linux {
|
if p.os == .linux {
|
||||||
$if !linux {
|
$if !linux {
|
||||||
// Cross compiling to Linux
|
// Cross compiling to Linux
|
||||||
|
|
Loading…
Reference in New Issue