builder: support -m32/-m64 flags for msvc (#8819)
							parent
							
								
									1891ebf22d
								
							
						
					
					
						commit
						51dd22bcc0
					
				|  | @ -41,7 +41,7 @@ pub fn new_builder(pref &pref.Preferences) Builder { | ||||||
| 	if pref.use_color == .never { | 	if pref.use_color == .never { | ||||||
| 		util.emanager.set_support_color(false) | 		util.emanager.set_support_color(false) | ||||||
| 	} | 	} | ||||||
| 	msvc := find_msvc() or { | 	msvc := find_msvc(pref.m64) or { | ||||||
| 		if pref.ccompiler == 'msvc' { | 		if pref.ccompiler == 'msvc' { | ||||||
| 			verror('Cannot find MSVC on this OS') | 			verror('Cannot find MSVC on this OS') | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -51,7 +51,7 @@ fn (mut v Builder) find_win_cc() ? { | ||||||
| 		if v.pref.is_verbose { | 		if v.pref.is_verbose { | ||||||
| 			println('$v.pref.ccompiler not found, looking for msvc...') | 			println('$v.pref.ccompiler not found, looking for msvc...') | ||||||
| 		} | 		} | ||||||
| 		find_msvc() or { | 		find_msvc(v.pref.m64) or { | ||||||
| 			if v.pref.is_verbose { | 			if v.pref.is_verbose { | ||||||
| 				println('msvc not found, looking for thirdparty/tcc...') | 				println('msvc not found, looking for thirdparty/tcc...') | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | @ -8,7 +8,6 @@ import v.cflag | ||||||
| #flag windows -l shell32 | #flag windows -l shell32 | ||||||
| #flag windows -l dbghelp | #flag windows -l dbghelp | ||||||
| #flag windows -l advapi32 | #flag windows -l advapi32 | ||||||
| 
 |  | ||||||
| struct MsvcResult { | struct MsvcResult { | ||||||
| 	full_cl_exe_path    string | 	full_cl_exe_path    string | ||||||
| 	exe_path            string | 	exe_path            string | ||||||
|  | @ -79,7 +78,7 @@ struct WindowsKit { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Try and find the root key for installed windows kits
 | // Try and find the root key for installed windows kits
 | ||||||
| fn find_windows_kit_root(host_arch string) ?WindowsKit { | fn find_windows_kit_root(target_arch string) ?WindowsKit { | ||||||
| 	$if windows { | 	$if windows { | ||||||
| 		root_key := RegKey(0) | 		root_key := RegKey(0) | ||||||
| 		path := 'SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots' | 		path := 'SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots' | ||||||
|  | @ -113,8 +112,8 @@ fn find_windows_kit_root(host_arch string) ?WindowsKit { | ||||||
| 		kit_include_highest := kit_lib_highest.replace('Lib', 'Include') | 		kit_include_highest := kit_lib_highest.replace('Lib', 'Include') | ||||||
| 		C.RegCloseKey(root_key) | 		C.RegCloseKey(root_key) | ||||||
| 		return WindowsKit{ | 		return WindowsKit{ | ||||||
| 			um_lib_path: kit_lib_highest + '\\um\\$host_arch' | 			um_lib_path: kit_lib_highest + '\\um\\$target_arch' | ||||||
| 			ucrt_lib_path: kit_lib_highest + '\\ucrt\\$host_arch' | 			ucrt_lib_path: kit_lib_highest + '\\ucrt\\$target_arch' | ||||||
| 			um_include_path: kit_include_highest + '\\um' | 			um_include_path: kit_include_highest + '\\um' | ||||||
| 			ucrt_include_path: kit_include_highest + '\\ucrt' | 			ucrt_include_path: kit_include_highest + '\\ucrt' | ||||||
| 			shared_include_path: kit_include_highest + '\\shared' | 			shared_include_path: kit_include_highest + '\\shared' | ||||||
|  | @ -129,7 +128,7 @@ struct VsInstallation { | ||||||
| 	exe_path     string | 	exe_path     string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn find_vs(vswhere_dir string, host_arch string) ?VsInstallation { | fn find_vs(vswhere_dir string, host_arch string, target_arch string) ?VsInstallation { | ||||||
| 	$if !windows { | 	$if !windows { | ||||||
| 		return error('Host OS does not support finding a Visual Studio installation') | 		return error('Host OS does not support finding a Visual Studio installation') | ||||||
| 	} | 	} | ||||||
|  | @ -147,10 +146,10 @@ fn find_vs(vswhere_dir string, host_arch string) ?VsInstallation { | ||||||
| 	version2 := version // TODO remove. cgen option bug if expr
 | 	version2 := version // TODO remove. cgen option bug if expr
 | ||||||
| 	// println('version: $version')
 | 	// println('version: $version')
 | ||||||
| 	v := if version.ends_with('\n') { version2[..version.len - 2] } else { version2 } | 	v := if version.ends_with('\n') { version2[..version.len - 2] } else { version2 } | ||||||
| 	lib_path := '$res.output\\VC\\Tools\\MSVC\\$v\\lib\\$host_arch' | 	lib_path := '$res.output\\VC\\Tools\\MSVC\\$v\\lib\\$target_arch' | ||||||
| 	include_path := '$res.output\\VC\\Tools\\MSVC\\$v\\include' | 	include_path := '$res.output\\VC\\Tools\\MSVC\\$v\\include' | ||||||
| 	if os.exists('$lib_path\\vcruntime.lib') { | 	if os.exists('$lib_path\\vcruntime.lib') { | ||||||
| 		p := '$res.output\\VC\\Tools\\MSVC\\$v\\bin\\Host$host_arch\\$host_arch' | 		p := '$res.output\\VC\\Tools\\MSVC\\$v\\bin\\Host$host_arch\\$target_arch' | ||||||
| 		// println('$lib_path $include_path')
 | 		// println('$lib_path $include_path')
 | ||||||
| 		return VsInstallation{ | 		return VsInstallation{ | ||||||
| 			exe_path: p | 			exe_path: p | ||||||
|  | @ -162,7 +161,7 @@ fn find_vs(vswhere_dir string, host_arch string) ?VsInstallation { | ||||||
| 	return error('Unable to find vs exe folder') | 	return error('Unable to find vs exe folder') | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn find_msvc() ?MsvcResult { | fn find_msvc(m64_target bool) ?MsvcResult { | ||||||
| 	$if windows { | 	$if windows { | ||||||
| 		processor_architecture := os.getenv('PROCESSOR_ARCHITECTURE') | 		processor_architecture := os.getenv('PROCESSOR_ARCHITECTURE') | ||||||
| 		vswhere_dir := if processor_architecture == 'x86' { | 		vswhere_dir := if processor_architecture == 'x86' { | ||||||
|  | @ -171,8 +170,20 @@ fn find_msvc() ?MsvcResult { | ||||||
| 			'%ProgramFiles(x86)%' | 			'%ProgramFiles(x86)%' | ||||||
| 		} | 		} | ||||||
| 		host_arch := if processor_architecture == 'x86' { 'X86' } else { 'X64' } | 		host_arch := if processor_architecture == 'x86' { 'X86' } else { 'X64' } | ||||||
| 		wk := find_windows_kit_root(host_arch) or { return error('Unable to find windows sdk') } | 		mut target_arch := 'X64' | ||||||
| 		vs := find_vs(vswhere_dir, host_arch) or { return error('Unable to find visual studio') } | 		if host_arch == 'X86' { | ||||||
|  | 			if !m64_target { | ||||||
|  | 				target_arch = 'X86' | ||||||
|  | 			} | ||||||
|  | 		} else if host_arch == 'X64' { | ||||||
|  | 			if !m64_target { | ||||||
|  | 				target_arch = 'X86' | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		wk := find_windows_kit_root(target_arch) or { return error('Unable to find windows sdk') } | ||||||
|  | 		vs := find_vs(vswhere_dir, host_arch, target_arch) or { | ||||||
|  | 			return error('Unable to find visual studio') | ||||||
|  | 		} | ||||||
| 		return MsvcResult{ | 		return MsvcResult{ | ||||||
| 			full_cl_exe_path: os.real_path(vs.exe_path + os.path_separator + 'cl.exe') | 			full_cl_exe_path: os.real_path(vs.exe_path + os.path_separator + 'cl.exe') | ||||||
| 			exe_path: vs.exe_path | 			exe_path: vs.exe_path | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue