22
22
import (" core.base.option" )
23
23
import (" core.project.config" )
24
24
import (" detect.sdks.find_ifortenv" )
25
+ import (" detect.sdks.find_vstudio" )
25
26
import (" lib.detect.find_tool" )
26
27
28
+ -- attempt to check vs environment
29
+ function _check_vsenv (toolchain )
30
+
31
+ -- has been checked?
32
+ local vs = toolchain :config (" vs" ) or config .get (" vs" )
33
+ if vs then
34
+ vs = tostring (vs )
35
+ end
36
+ local vcvars = toolchain :config (" vcvars" )
37
+ if vs and vcvars then
38
+ return vs
39
+ end
40
+
41
+ -- find vstudio
42
+ local vs_toolset = toolchain :config (" vs_toolset" ) or config .get (" vs_toolset" )
43
+ local vs_sdkver = toolchain :config (" vs_sdkver" ) or config .get (" vs_sdkver" )
44
+ local vstudio = find_vstudio ({vcvars_ver = vs_toolset , sdkver = vs_sdkver })
45
+ if vstudio then
46
+
47
+ -- make order vsver
48
+ local vsvers = {}
49
+ for vsver , _ in pairs (vstudio ) do
50
+ if not vs or vs ~= vsver then
51
+ table.insert (vsvers , vsver )
52
+ end
53
+ end
54
+ table.sort (vsvers , function (a , b ) return tonumber (a ) > tonumber (b ) end )
55
+ if vs then
56
+ table.insert (vsvers , 1 , vs )
57
+ end
58
+
59
+ -- get vcvarsall
60
+ for _ , vsver in ipairs (vsvers ) do
61
+ local vcvarsall = (vstudio [vsver ] or {}).vcvarsall or {}
62
+ local vcvars = vcvarsall [toolchain :arch ()]
63
+ if vcvars and vcvars .PATH and vcvars .INCLUDE and vcvars .LIB then
64
+
65
+ -- save vcvars
66
+ toolchain :config_set (" vcvars" , vcvars )
67
+ toolchain :config_set (" vcarchs" , table .orderkeys (vcvarsall ))
68
+ toolchain :config_set (" vs_toolset" , vcvars .VCToolsVersion )
69
+ toolchain :config_set (" vs_sdkver" , vcvars .WindowsSDKVersion )
70
+
71
+ -- check compiler
72
+ local program
73
+ local paths
74
+ local pathenv = os.getenv (" PATH" )
75
+ if pathenv then
76
+ paths = path .splitenv (pathenv )
77
+ end
78
+ local tool = find_tool (" cl.exe" , {version = true , force = true , paths = paths , envs = vcvars })
79
+ if tool then
80
+ program = tool .program
81
+ end
82
+ if program then
83
+ return vsver , tool
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ -- check the visual studio
91
+ function _check_vstudio (toolchain )
92
+ local vs , cl = _check_vsenv (toolchain )
93
+ if vs then
94
+ if toolchain :is_global () then
95
+ config .set (" vs" , vs , {force = true , readonly = true })
96
+ end
97
+ toolchain :config_set (" vs" , vs )
98
+ toolchain :configs_save ()
99
+ cprint (" checking for Microsoft Visual Studio (%s) version ... ${color.success}%s" , toolchain :arch (), vs )
100
+ if cl and cl .version then
101
+ cprint (" checking for LLVM Clang C/C++ Compiler (%s) version ... ${color.success}%s" , toolchain :arch (), cl .version )
102
+ end
103
+ else
104
+ cprint (" checking for Microsoft Visual Studio (%s) version ... ${color.nothing}${text.nothing}" , toolchain :arch ())
105
+ end
106
+ return vs
107
+ end
108
+
27
109
-- check intel on windows
28
110
function _check_intel_on_windows (toolchain )
29
111
@@ -44,7 +126,7 @@ function _check_intel_on_windows(toolchain)
44
126
cprint (" checking for Intel Fortran Compiler (%s) ... ${color.success}${text.success}" , toolchain :arch ())
45
127
toolchain :config_set (" varsall" , ifortvarsall )
46
128
toolchain :configs_save ()
47
- return true
129
+ return _check_vstudio ( toolchain )
48
130
end
49
131
end
50
132
end
0 commit comments