1 | ' $Id: configure.vbs 86249 2020-09-23 17:03:12Z vboxsync $
|
---|
2 | '' @file
|
---|
3 | ' The purpose of this script is to check for all external tools, headers, and
|
---|
4 | ' libraries VBox OSE depends on.
|
---|
5 | '
|
---|
6 | ' The script generates the build configuration file 'AutoConfig.kmk' and the
|
---|
7 | ' environment setup script 'env.bat'. A log of what has been done is
|
---|
8 | ' written to 'configure.log'.
|
---|
9 | '
|
---|
10 |
|
---|
11 | '
|
---|
12 | ' Copyright (C) 2006-2020 Oracle Corporation
|
---|
13 | '
|
---|
14 | ' This file is part of VirtualBox Open Source Edition (OSE), as
|
---|
15 | ' available from http://www.virtualbox.org. This file is free software;
|
---|
16 | ' you can redistribute it and/or modify it under the terms of the GNU
|
---|
17 | ' General Public License (GPL) as published by the Free Software
|
---|
18 | ' Foundation, in version 2 as it comes in the "COPYING" file of the
|
---|
19 | ' VirtualBox OSE distribution. VirtualBox OSE is distributed in the
|
---|
20 | ' hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
|
---|
21 | '
|
---|
22 |
|
---|
23 |
|
---|
24 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
25 | ' Header Files
|
---|
26 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
27 |
|
---|
28 | ''
|
---|
29 | ' Includes a vbscript file relative to the script.
|
---|
30 | sub IncludeFile(strFilename)
|
---|
31 | dim objFile, objFileSys
|
---|
32 | set objFileSys = WScript.CreateObject("Scripting.FileSystemObject")
|
---|
33 | dim strPath : strPath = objFileSys.BuildPath(objFileSys.GetParentFolderName(Wscript.ScriptFullName), strFilename)
|
---|
34 | set objFile = objFileSys.openTextFile(strPath)
|
---|
35 | executeglobal objFile.readAll()
|
---|
36 | objFile.close
|
---|
37 | set objFileSys = nothing
|
---|
38 | end sub
|
---|
39 |
|
---|
40 | IncludeFile "tools\win\vbscript\helpers.vbs"
|
---|
41 |
|
---|
42 |
|
---|
43 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
44 | ' Global Variables '
|
---|
45 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
46 | dim g_strPath, g_strEnvFile, g_strLogFile, g_strCfgFile
|
---|
47 | g_strPath = Left(Wscript.ScriptFullName, Len(Wscript.ScriptFullName) - Len("\configure.vbs"))
|
---|
48 | g_strEnvFile = g_strPath & "\env.bat"
|
---|
49 | g_strCfgFile = g_strPath & "\AutoConfig.kmk"
|
---|
50 | g_strLogFile = g_strPath & "\configure.log"
|
---|
51 | 'g_strTmpFile = g_strPath & "\configure.tmp"
|
---|
52 |
|
---|
53 |
|
---|
54 | ' kBuild stuff.
|
---|
55 | dim g_strPathkBuild, g_strPathkBuildBin, g_strPathDev, g_arrPathDev
|
---|
56 | g_strPathkBuild = ""
|
---|
57 | g_strPathkBuildBin = ""
|
---|
58 | g_strPathDev = ""
|
---|
59 | g_arrPathDev = Array(":placeholder:")
|
---|
60 |
|
---|
61 | dim g_strTargetArch, g_StrTargetArchWin
|
---|
62 | g_strTargetArch = ""
|
---|
63 | g_StrTargetArchWin = ""
|
---|
64 |
|
---|
65 | dim g_strHostArch, g_strHostArchWin
|
---|
66 | g_strHostArch = ""
|
---|
67 | g_strHostArchWin = ""
|
---|
68 |
|
---|
69 | ' Visual C++ info.
|
---|
70 | dim g_strPathVCC, g_strVCCVersion
|
---|
71 | g_strPathVCC = ""
|
---|
72 | g_strVCCVersion = ""
|
---|
73 |
|
---|
74 | ' SDK and DDK.
|
---|
75 | dim g_strPathSDK10, g_strPathPSDK, g_strVerPSDK, g_strPathDDK
|
---|
76 | g_strPathSDK10 = ""
|
---|
77 | g_strPathPSDK = ""
|
---|
78 | g_strVerPSDK = ""
|
---|
79 | g_strPathDDK = ""
|
---|
80 |
|
---|
81 | ' COM disabling.
|
---|
82 | dim g_blnDisableCOM, g_strDisableCOM
|
---|
83 | g_blnDisableCOM = False
|
---|
84 | g_strDisableCOM = ""
|
---|
85 |
|
---|
86 | ' Whether to try the internal stuff first or last.
|
---|
87 | dim g_blnInternalFirst
|
---|
88 | g_blnInternalFirst = True
|
---|
89 |
|
---|
90 | ' List of program files locations.
|
---|
91 | dim g_arrProgramFiles
|
---|
92 | if EnvGet("ProgramFiles(x86)") <> "" then
|
---|
93 | g_arrProgramFiles = Array(EnvGet("ProgramFiles"), EnvGet("ProgramFiles(x86)"))
|
---|
94 | else
|
---|
95 | g_arrProgramFiles = Array(EnvGet("ProgramFiles"))
|
---|
96 | end if
|
---|
97 |
|
---|
98 |
|
---|
99 |
|
---|
100 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
101 | ' Helpers: Logging and Logged operations '
|
---|
102 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
103 |
|
---|
104 | ''
|
---|
105 | ' Write a log header with some basic info.
|
---|
106 | sub LogInit
|
---|
107 | FileDelete g_strLogFile
|
---|
108 | LogPrint "# Log file generated by " & Wscript.ScriptFullName
|
---|
109 | for i = 1 to WScript.Arguments.Count
|
---|
110 | LogPrint "# Arg #" & i & ": " & WScript.Arguments.Item(i - 1)
|
---|
111 | next
|
---|
112 | if Wscript.Arguments.Count = 0 then
|
---|
113 | LogPrint "# No arguments given"
|
---|
114 | end if
|
---|
115 | LogPrint "# Reconstructed command line: " & GetCommandline()
|
---|
116 |
|
---|
117 | ' some Wscript stuff
|
---|
118 | LogPrint "# Wscript properties:"
|
---|
119 | LogPrint "# ScriptName: " & Wscript.ScriptName
|
---|
120 | LogPrint "# Version: " & Wscript.Version
|
---|
121 | LogPrint "# Build: " & Wscript.BuildVersion
|
---|
122 | LogPrint "# Name: " & Wscript.Name
|
---|
123 | LogPrint "# Full Name: " & Wscript.FullName
|
---|
124 | LogPrint "# Path: " & Wscript.Path
|
---|
125 | LogPrint "#"
|
---|
126 |
|
---|
127 |
|
---|
128 | ' the environment
|
---|
129 | LogPrint "# Environment:"
|
---|
130 | dim objEnv
|
---|
131 | for each strVar in g_objShell.Environment("PROCESS")
|
---|
132 | LogPrint "# " & strVar
|
---|
133 | next
|
---|
134 | LogPrint "#"
|
---|
135 | end sub
|
---|
136 |
|
---|
137 |
|
---|
138 | ''
|
---|
139 | ' Append text to the log file.
|
---|
140 | sub LogPrint(str)
|
---|
141 | FileAppendLine g_strLogFile, str
|
---|
142 | 'Wscript.Echo "dbg: " & str
|
---|
143 | end sub
|
---|
144 |
|
---|
145 |
|
---|
146 | ''
|
---|
147 | ' Checks if the file exists and logs failures.
|
---|
148 | function LogFileExists(strPath, strFilename)
|
---|
149 | LogFileExists = FileExists(strPath & "/" & strFilename)
|
---|
150 | if LogFileExists = False then
|
---|
151 | LogPrint "Testing '" & strPath & "': " & strFilename & " not found"
|
---|
152 | end if
|
---|
153 | end function
|
---|
154 |
|
---|
155 |
|
---|
156 | ''
|
---|
157 | ' Checks if the file exists and logs failures.
|
---|
158 | function LogFileExists1(strPath)
|
---|
159 | LogFileExists1 = FileExists(strPath)
|
---|
160 | if LogFileExists1 = False then
|
---|
161 | LogPrint "Testing '" & strPath & "': file not found"
|
---|
162 | end if
|
---|
163 | end function
|
---|
164 |
|
---|
165 |
|
---|
166 | ''
|
---|
167 | ' Checks if the directory exists and logs failures.
|
---|
168 | function LogDirExists(strPath)
|
---|
169 | LogDirExists = DirExists(strPath)
|
---|
170 | if LogDirExists = False then
|
---|
171 | LogPrint "Testing '" & strPath & "': not found (or not dir)"
|
---|
172 | end if
|
---|
173 | end function
|
---|
174 |
|
---|
175 |
|
---|
176 | ''
|
---|
177 | ' Finds the first file matching the pattern.
|
---|
178 | ' If no file is found, log the failure.
|
---|
179 | function LogFindFile(strPath, strPattern)
|
---|
180 | dim str, strOutput
|
---|
181 |
|
---|
182 | '
|
---|
183 | ' Yes, there are some facy database kinda interface to the filesystem
|
---|
184 | ' however, breaking down the path and constructing a usable query is
|
---|
185 | ' too much hassle. So, we'll do it the unix way...
|
---|
186 | '
|
---|
187 | if Shell("dir /B """ & DosSlashes(strPath) & "\" & DosSlashes(strPattern) & """", True, strOutput) = 0 _
|
---|
188 | And InStr(1, strOutput, Chr(13)) > 1 _
|
---|
189 | then
|
---|
190 | ' return the first word.
|
---|
191 | LogFindFile = Left(strOutput, InStr(1, strOutput, Chr(13)) - 1)
|
---|
192 | else
|
---|
193 | LogPrint "Testing '" & strPath & "': " & strPattern & " not found"
|
---|
194 | LogFindFile = ""
|
---|
195 | end if
|
---|
196 | end function
|
---|
197 |
|
---|
198 |
|
---|
199 | ''
|
---|
200 | ' Finds the first directory matching the pattern.
|
---|
201 | ' If no directory is found, log the failure,
|
---|
202 | ' else return the complete path to the found directory.
|
---|
203 | function LogFindDir(strPath, strPattern)
|
---|
204 | dim str, strOutput
|
---|
205 |
|
---|
206 | '
|
---|
207 | ' Yes, there are some facy database kinda interface to the filesystem
|
---|
208 | ' however, breaking down the path and constructing a usable query is
|
---|
209 | ' too much hassle. So, we'll do it the unix way...
|
---|
210 | '
|
---|
211 |
|
---|
212 | ' List the alphabetically last names as first entries (with /O-N).
|
---|
213 | if Shell("dir /B /AD /O-N """ & DosSlashes(strPath) & "\" & DosSlashes(strPattern) & """", True, strOutput) = 0 _
|
---|
214 | And InStr(1, strOutput, Chr(13)) > 1 _
|
---|
215 | then
|
---|
216 | ' return the first word.
|
---|
217 | LogFindDir = strPath & "/" & Left(strOutput, InStr(1, strOutput, Chr(13)) - 1)
|
---|
218 | else
|
---|
219 | LogPrint "Testing '" & strPath & "': " & strPattern & " not found"
|
---|
220 | LogFindDir = ""
|
---|
221 | end if
|
---|
222 | end function
|
---|
223 |
|
---|
224 |
|
---|
225 | ''
|
---|
226 | ' Wrapper around RegGetString that logs successes.
|
---|
227 | function LogRegGetString(strName)
|
---|
228 | LogRegGetString = RegGetString(strName)
|
---|
229 | if LogRegGetString <> "" then LogPrint "RegGetString(" & strName & ") -> " & LogRegGetString
|
---|
230 | end function
|
---|
231 |
|
---|
232 |
|
---|
233 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
234 | ' Helpers: Configuration and Batch Script Writers '
|
---|
235 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
236 |
|
---|
237 | ''
|
---|
238 | ' Initializes the config file.
|
---|
239 | sub CfgInit
|
---|
240 | FileDelete g_strCfgFile
|
---|
241 | CfgPrint "# -*- Makefile -*-"
|
---|
242 | CfgPrint "#"
|
---|
243 | CfgPrint "# Build configuration generated by " & GetCommandline()
|
---|
244 | CfgPrint "#"
|
---|
245 | CfgPrintAssign "VBOX_OSE", "1"
|
---|
246 | CfgPrintAssignRecursive "VBOX_VCC_WERR", "$(NO_SUCH_VARIABLE)"
|
---|
247 | end sub
|
---|
248 |
|
---|
249 |
|
---|
250 | ''
|
---|
251 | ' Prints a string to the config file.
|
---|
252 | sub CfgPrint(str)
|
---|
253 | FileAppendLine g_strCfgFile, str
|
---|
254 | end sub
|
---|
255 |
|
---|
256 | ''
|
---|
257 | ' Prints a simple assignment to the config file.
|
---|
258 | sub CfgPrintAssign(strVar, strValue)
|
---|
259 | if strValue = "" then
|
---|
260 | FileAppendLine g_strCfgFile, RightPad(strVar, 23) & " :="
|
---|
261 | else
|
---|
262 | FileAppendLine g_strCfgFile, RightPad(strVar, 23) & " := " & strValue
|
---|
263 | end if
|
---|
264 | end sub
|
---|
265 |
|
---|
266 | ''
|
---|
267 | ' Prints a recursive assignment to the config file.
|
---|
268 | sub CfgPrintAssignRecursive(strVar, strValue)
|
---|
269 | FileAppendLine g_strCfgFile, RightPad(strVar, 23) & " = " & strValue
|
---|
270 | end sub
|
---|
271 |
|
---|
272 |
|
---|
273 | ''
|
---|
274 | ' Initializes the environment batch script.
|
---|
275 | sub EnvInit
|
---|
276 | FileDelete g_strEnvFile
|
---|
277 | EnvPrint "@echo off"
|
---|
278 | EnvPrint "rem"
|
---|
279 | EnvPrint "rem Environment setup script generated by " & GetCommandline()
|
---|
280 | EnvPrint "rem"
|
---|
281 | end sub
|
---|
282 |
|
---|
283 |
|
---|
284 | ''
|
---|
285 | ' Prints a string to the environment batch script.
|
---|
286 | sub EnvPrint(str)
|
---|
287 | FileAppendLine g_strEnvFile, str
|
---|
288 | end sub
|
---|
289 |
|
---|
290 |
|
---|
291 | ''
|
---|
292 | ' Helper for EnvPrintPrepend and EnvPrintAppend.
|
---|
293 | sub EnvPrintCleanup(strEnv, strValue, strSep)
|
---|
294 | dim cchValueAndSep
|
---|
295 | FileAppendLine g_strEnvFile, "set " & strEnv & "=%" & strEnv & ":" & strSep & strValue & strSep & "=" & strSep & "%"
|
---|
296 | cchValueAndSep = Len(strValue) + Len(strSep)
|
---|
297 | FileAppendLine g_strEnvFile, "if ""%" & strEnv & "%""==""" & strValue & """ set " & strEnv & "="
|
---|
298 | FileAppendLine g_strEnvFile, "if ""%" & strEnv & ":~0," & cchValueAndSep & "%""==""" & strValue & strSep & """ set " & strEnv & "=%" & strEnv & ":~" & cchValueAndSep & "%"
|
---|
299 | FileAppendLine g_strEnvFile, "if ""%" & strEnv & ":~-" & cchValueAndSep & "%""==""" & strSep & strValue & """ set " & strEnv & "=%" & strEnv & ":~0,-" & cchValueAndSep & "%"
|
---|
300 | end sub
|
---|
301 |
|
---|
302 |
|
---|
303 | '' Use by EnvPrintPrepend to skip ';' stripping.
|
---|
304 | dim g_strPrependCleanEnvVars
|
---|
305 |
|
---|
306 | ''
|
---|
307 | ' Print a statement prepending strValue to strEnv, removing duplicate values.
|
---|
308 | sub EnvPrintPrepend(strEnv, strValue, strSep)
|
---|
309 | ' Remove old values and any leading separators.
|
---|
310 | EnvPrintCleanup strEnv, strValue, strSep
|
---|
311 | if InStr(1, g_strPrependCleanEnvVars, "|" & strEnv & "|") = 0 then
|
---|
312 | FileAppendLine g_strEnvFile, "if ""%" & strEnv & ":~0,1%""==""" & strSep & """ set " & strEnv & "=%" & strEnv & ":~1%"
|
---|
313 | FileAppendLine g_strEnvFile, "if ""%" & strEnv & ":~0,1%""==""" & strSep & """ set " & strEnv & "=%" & strEnv & ":~1%"
|
---|
314 | g_strPrependCleanEnvVars = g_strPrependCleanEnvVars & "|" & strEnv & "|"
|
---|
315 | end if
|
---|
316 | ' Do the setting
|
---|
317 | FileAppendLine g_strEnvFile, "set " & strEnv & "=" & strValue & strSep & "%" & strEnv & "%"
|
---|
318 | end sub
|
---|
319 |
|
---|
320 |
|
---|
321 | '' Use by EnvPrintPrepend to skip ';' stripping.
|
---|
322 | dim g_strAppendCleanEnvVars
|
---|
323 |
|
---|
324 | ''
|
---|
325 | ' Print a statement appending strValue to strEnv, removing duplicate values.
|
---|
326 | sub EnvPrintAppend(strEnv, strValue, strSep)
|
---|
327 | ' Remove old values and any trailing separators.
|
---|
328 | EnvPrintCleanup strEnv, strValue, strSep
|
---|
329 | if InStr(1, g_strAppendCleanEnvVars, "|" & strEnv & "|") = 0 then
|
---|
330 | FileAppendLine g_strEnvFile, "if ""%" & strEnv & ":~-1%""==""" & strSep & """ set " & strEnv & "=%" & strEnv & ":~0,-1%"
|
---|
331 | FileAppendLine g_strEnvFile, "if ""%" & strEnv & ":~-1%""==""" & strSep & """ set " & strEnv & "=%" & strEnv & ":~0,-1%"
|
---|
332 | g_strAppendCleanEnvVars = g_strAppendCleanEnvVars & "|" & strEnv & "|"
|
---|
333 | end if
|
---|
334 | ' Do the setting.
|
---|
335 | FileAppendLine g_strEnvFile, "set " & strEnv & "=%" & strEnv & "%" & strSep & strValue
|
---|
336 | end sub
|
---|
337 |
|
---|
338 |
|
---|
339 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
340 | ' Feature disabling '
|
---|
341 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
342 |
|
---|
343 | ''
|
---|
344 | ' No COM
|
---|
345 | sub DisableCOM(strReason)
|
---|
346 | if g_blnDisableCOM = False then
|
---|
347 | LogPrint "Disabled COM components: " & strReason
|
---|
348 | g_blnDisableCOM = True
|
---|
349 | g_strDisableCOM = strReason
|
---|
350 | CfgPrintAssign "VBOX_WITH_MAIN", ""
|
---|
351 | CfgPrintAssign "VBOX_WITH_QTGUI", ""
|
---|
352 | CfgPrintAssign "VBOX_WITH_VBOXSDL", ""
|
---|
353 | CfgPrintAssign "VBOX_WITH_DEBUGGER_GUI", ""
|
---|
354 | end if
|
---|
355 | end sub
|
---|
356 |
|
---|
357 |
|
---|
358 | ''
|
---|
359 | ' No UDPTunnel
|
---|
360 | sub DisableUDPTunnel(strReason)
|
---|
361 | if g_blnDisableUDPTunnel = False then
|
---|
362 | LogPrint "Disabled UDPTunnel network transport: " & strReason
|
---|
363 | g_blnDisableUDPTunnel = True
|
---|
364 | g_strDisableUDPTunnel = strReason
|
---|
365 | CfgPrintAssign "VBOX_WITH_UDPTUNNEL", ""
|
---|
366 | end if
|
---|
367 | end sub
|
---|
368 |
|
---|
369 |
|
---|
370 | ''
|
---|
371 | ' No SDL
|
---|
372 | sub DisableSDL(strReason)
|
---|
373 | if g_blnDisableSDL = False then
|
---|
374 | LogPrint "Disabled SDL frontend: " & strReason
|
---|
375 | g_blnDisableSDL = True
|
---|
376 | g_strDisableSDL = strReason
|
---|
377 | CfgPrintAssign "VBOX_WITH_VBOXSDL", ""
|
---|
378 | end if
|
---|
379 | end sub
|
---|
380 |
|
---|
381 |
|
---|
382 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
383 | ' Tool/Library Locating and Checking '
|
---|
384 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
385 |
|
---|
386 | ''
|
---|
387 | ' Generic helper for looking for a tools under g_strPathDev.
|
---|
388 | '
|
---|
389 | ' The callback function takes the '.../tools/win.arch/tool/version' dir and
|
---|
390 | ' varUser as arguments, returning an non-empty string if it was found suitable.
|
---|
391 | '
|
---|
392 | function SearchToolsEx(strTool, strVerPrefix, ByRef fnCallback, ByRef varUser, ByRef arrToolsDirs)
|
---|
393 | dim strToolsDir, arrDirs, strDir
|
---|
394 | SearchToolsEx = ""
|
---|
395 | for each strToolsDir in arrToolsDirs
|
---|
396 | arrDirs = GetSubdirsStartingWithRVerSorted(strToolsDir, strVerPrefix)
|
---|
397 | for each strDir in arrDirs
|
---|
398 | SearchToolsEx = fnCallback(strToolsDir & "/" & strDir, varUser)
|
---|
399 | if SearchToolsEx <> "" then
|
---|
400 | exit function
|
---|
401 | end if
|
---|
402 | next
|
---|
403 | next
|
---|
404 | end function
|
---|
405 |
|
---|
406 | '' Search under g_strPathDev for a tool, target arch only.
|
---|
407 | function SearchTargetTools(strTool, strVerPrefix, ByRef fnCallback, ByRef varUser)
|
---|
408 | dim i
|
---|
409 | redim arrToolsDirs(ArraySize(g_arrPathDev) - 1)
|
---|
410 | for i = 0 to UBound(g_arrPathDev)
|
---|
411 | arrToolsDirs(i) = g_arrPathDev(i) & "/win." & g_strTargetArch & "/" & strTool
|
---|
412 | next
|
---|
413 | SearchTargetTools = SearchToolsEx(strTool, strVerPrefix, fnCallback, varUser, arrToolsDirs)
|
---|
414 | end function
|
---|
415 |
|
---|
416 | '' Search under g_strPathDev for a tool, target arch and alternative arches.
|
---|
417 | function SearchTargetPlusTools(strTool, strVerPrefix, ByRef fnCallback, ByRef varUser)
|
---|
418 | dim i
|
---|
419 | redim arrToolsDirs(ArraySize(g_arrPathDev)*3 - 1)
|
---|
420 | for i = 0 to UBound(g_arrPathDev)
|
---|
421 | arrToolsDirs(i*3 + 0) = g_arrPathDev(i) & "/win." & g_strTargetArch & "/" & strTool
|
---|
422 | arrToolsDirs(i*3 + 1) = g_arrPathDev(i) & "/win.x86/" & strTool
|
---|
423 | arrToolsDirs(i*3 + 2) = g_arrPathDev(i) & "/win.amd64/" & strTool
|
---|
424 | next
|
---|
425 | SearchTargetPlusTools = SearchToolsEx(strTool, strVerPrefix, fnCallback, varUser, arrToolsDirs)
|
---|
426 | end function
|
---|
427 |
|
---|
428 | '' Search under g_strPathDev for a tool, host arch first.
|
---|
429 | function SearchHostTools(strTool, strVerPrefix, ByRef fnCallback, ByRef varUser)
|
---|
430 | dim i
|
---|
431 | redim arrToolsDirs(ArraySize(g_arrPathDev) * 3 - 1)
|
---|
432 | for i = 0 to UBound(g_arrPathDev)
|
---|
433 | arrToolsDirs(i*3 + 0) = g_arrPathDev(i) & "/win." & g_strHostArch & "/" & strTool
|
---|
434 | arrToolsDirs(i*3 + 1) = g_arrPathDev(i) & "/win.x86/" & strTool
|
---|
435 | arrToolsDirs(i*3 + 2) = g_arrPathDev(i) & "/win.amd64/" & strTool
|
---|
436 | next
|
---|
437 | SearchHostTools = SearchToolsEx(strTool, strVerPrefix, fnCallback, varUser, arrToolsDirs)
|
---|
438 | end function
|
---|
439 |
|
---|
440 | '' Search under g_strPathDev for a tool, common dir first.
|
---|
441 | function SearchCommonTools(strTool, strVerPrefix, ByRef fnCallback, ByRef varUser)
|
---|
442 | dim i
|
---|
443 | redim arrToolsDirs(ArraySize(g_arrPathDev) * 4 - 1)
|
---|
444 | for i = 0 to UBound(g_arrPathDev)
|
---|
445 | arrToolsDirs(i*4 + 0) = g_arrPathDev(i) & "/win.common/" & strTool
|
---|
446 | arrToolsDirs(i*4 + 1) = g_arrPathDev(i) & "/win." & g_strTargetArch & "/" & strTool
|
---|
447 | arrToolsDirs(i*4 + 2) = g_arrPathDev(i) & "/win.x86/" & strTool
|
---|
448 | arrToolsDirs(i*4 + 3) = g_arrPathDev(i) & "/win.amd64/" & strTool
|
---|
449 | next
|
---|
450 | SearchCommonTools = SearchToolsEx(strTool, strVerPrefix, fnCallback, varUser, arrToolsDirs)
|
---|
451 | end function
|
---|
452 |
|
---|
453 | ''
|
---|
454 | ' Checks the the path doesn't contain characters the tools cannot deal with.
|
---|
455 | '
|
---|
456 | sub CheckSourcePath
|
---|
457 | dim sPwd
|
---|
458 |
|
---|
459 | sPwd = PathAbsLong(g_strPath) ' Must check the long version.
|
---|
460 | if InStr(1, sPwd, " ") > 0 then
|
---|
461 | MsgError "Source path contains spaces! Please move it. (" & sPwd & ")"
|
---|
462 | end if
|
---|
463 | if InStr(1, sPwd, "$") > 0 then
|
---|
464 | MsgError "Source path contains the '$' char! Please move it. (" & sPwd & ")"
|
---|
465 | end if
|
---|
466 | if InStr(1, sPwd, "%") > 0 then
|
---|
467 | MsgError "Source path contains the '%' char! Please move it. (" & sPwd & ")"
|
---|
468 | end if
|
---|
469 | if InStr(1, sPwd, Chr(10)) > 0 _
|
---|
470 | or InStr(1, sPwd, Chr(13)) > 0 _
|
---|
471 | or InStr(1, sPwd, Chr(9)) > 0 _
|
---|
472 | then
|
---|
473 | MsgError "Source path contains control characters! Please move it. (" & sPwd & ")"
|
---|
474 | end if
|
---|
475 | Print "Source path: OK"
|
---|
476 | end sub
|
---|
477 |
|
---|
478 |
|
---|
479 | ''
|
---|
480 | ' Checks for kBuild - very simple :)
|
---|
481 | '
|
---|
482 | sub CheckForkBuild(strOptkBuild)
|
---|
483 | dim blnNeedEnvVars, strOutput
|
---|
484 | PrintHdr "kBuild"
|
---|
485 |
|
---|
486 | '
|
---|
487 | ' Check if there is a 'kmk' in the path somewhere without
|
---|
488 | ' any KBUILD_*PATH stuff around.
|
---|
489 | '
|
---|
490 | blnNeedEnvVars = True
|
---|
491 | g_strPathkBuild = strOptkBuild
|
---|
492 | g_strPathkBuildBin = ""
|
---|
493 | if (g_strPathkBuild = "") _
|
---|
494 | And (EnvGetFirst("KBUILD_PATH", "PATH_KBUILD") = "") _
|
---|
495 | And (EnvGetFirst("KBUILD_BIN_PATH", "PATH_KBUILD_BIN") = "") _
|
---|
496 | And (Shell("kmk.exe --version", True, strOutput) = 0) _
|
---|
497 | And (InStr(1,strOutput, "kBuild Make 0.1") > 0) _
|
---|
498 | And (InStr(1,strOutput, "KBUILD_PATH") > 0) _
|
---|
499 | And (InStr(1,strOutput, "KBUILD_BIN_PATH") > 0) then
|
---|
500 | '' @todo Need to parse out the KBUILD_PATH and KBUILD_BIN_PATH values to complete the other tests.
|
---|
501 | 'blnNeedEnvVars = False
|
---|
502 | MsgWarning "You've installed kBuild it seems. configure.vbs hasn't been updated to " _
|
---|
503 | & "deal with that yet and will use the one it ships with. Sorry."
|
---|
504 | end if
|
---|
505 |
|
---|
506 | '
|
---|
507 | ' Check for the KBUILD_PATH env.var. and fall back on root/kBuild otherwise.
|
---|
508 | '
|
---|
509 | if g_strPathkBuild = "" then
|
---|
510 | g_strPathkBuild = EnvGetFirst("KBUILD_PATH", "PATH_KBUILD")
|
---|
511 | if (g_strPathkBuild <> "") and (FileExists(g_strPathkBuild & "/footer.kmk") = False) then
|
---|
512 | MsgWarning "Ignoring incorrect kBuild path (KBUILD_PATH=" & g_strPathkBuild & ")"
|
---|
513 | g_strPathkBuild = ""
|
---|
514 | end if
|
---|
515 |
|
---|
516 | if g_strPathkBuild = "" then
|
---|
517 | g_strPathkBuild = g_strPath & "/kBuild"
|
---|
518 | end if
|
---|
519 | end if
|
---|
520 |
|
---|
521 | g_strPathkBuild = UnixSlashes(PathAbs(g_strPathkBuild))
|
---|
522 |
|
---|
523 | '
|
---|
524 | ' Check for env.vars that kBuild uses (do this early to set g_strTargetArch).
|
---|
525 | '
|
---|
526 | str = EnvGetFirst("KBUILD_TYPE", "BUILD_TYPE")
|
---|
527 | if (str <> "") _
|
---|
528 | And (InStr(1, "|release|debug|profile|kprofile", str) <= 0) then
|
---|
529 | EnvPrint "set KBUILD_TYPE=release"
|
---|
530 | EnvSet "KBUILD_TYPE", "release"
|
---|
531 | MsgWarning "Found unknown KBUILD_TYPE value '" & str &"' in your environment. Setting it to 'release'."
|
---|
532 | end if
|
---|
533 |
|
---|
534 | str = EnvGetFirst("KBUILD_TARGET", "BUILD_TARGET")
|
---|
535 | if (str <> "") _
|
---|
536 | And (InStr(1, "win|win32|win64", str) <= 0) then '' @todo later only 'win' will be valid. remember to fix this check!
|
---|
537 | EnvPrint "set KBUILD_TARGET=win"
|
---|
538 | EnvSet "KBUILD_TARGET", "win"
|
---|
539 | MsgWarning "Found unknown KBUILD_TARGET value '" & str &"' in your environment. Setting it to 'win32'."
|
---|
540 | end if
|
---|
541 |
|
---|
542 | str = EnvGetFirst("KBUILD_TARGET_ARCH", "BUILD_TARGET_ARCH")
|
---|
543 | if (str <> "") _
|
---|
544 | And (InStr(1, "x86|amd64", str) <= 0) then
|
---|
545 | EnvPrint "set KBUILD_TARGET_ARCH=x86"
|
---|
546 | EnvSet "KBUILD_TARGET_ARCH", "x86"
|
---|
547 | MsgWarning "Found unknown KBUILD_TARGET_ARCH value '" & str &"' in your environment. Setting it to 'x86'."
|
---|
548 | str = "x86"
|
---|
549 | end if
|
---|
550 | if g_strTargetArch = "" then '' command line parameter --target-arch=x86|amd64 has priority
|
---|
551 | if str <> "" then
|
---|
552 | g_strTargetArch = str
|
---|
553 | elseif (EnvGet("PROCESSOR_ARCHITEW6432") = "AMD64" ) _
|
---|
554 | Or (EnvGet("PROCESSOR_ARCHITECTURE") = "AMD64" ) then
|
---|
555 | g_strTargetArch = "amd64"
|
---|
556 | else
|
---|
557 | g_strTargetArch = "x86"
|
---|
558 | end if
|
---|
559 | else
|
---|
560 | if InStr(1, "x86|amd64", g_strTargetArch) <= 0 then
|
---|
561 | EnvPrint "set KBUILD_TARGET_ARCH=x86"
|
---|
562 | EnvSet "KBUILD_TARGET_ARCH", "x86"
|
---|
563 | MsgWarning "Unknown --target-arch=" & str &". Setting it to 'x86'."
|
---|
564 | end if
|
---|
565 | end if
|
---|
566 | LogPrint " Target architecture: " & g_strTargetArch & "."
|
---|
567 | Wscript.Echo " Target architecture: " & g_strTargetArch & "."
|
---|
568 | EnvPrint "set KBUILD_TARGET_ARCH=" & g_strTargetArch
|
---|
569 |
|
---|
570 | ' Windows variant of the arch name.
|
---|
571 | g_strTargetArchWin = g_strTargetArch
|
---|
572 | if g_strTargetArchWin = "amd64" then g_strTargetArchWin = "x64"
|
---|
573 |
|
---|
574 | str = EnvGetFirst("KBUILD_TARGET_CPU", "BUILD_TARGET_CPU")
|
---|
575 | ' perhaps a bit pedantic this since this isn't clearly define nor used much...
|
---|
576 | if (str <> "") _
|
---|
577 | And (InStr(1, "i386|i486|i686|i786|i868|k5|k6|k7|k8", str) <= 0) then
|
---|
578 | EnvPrint "set BUILD_TARGET_CPU=i386"
|
---|
579 | EnvSet "KBUILD_TARGET_CPU", "i386"
|
---|
580 | MsgWarning "Found unknown KBUILD_TARGET_CPU value '" & str &"' in your environment. Setting it to 'i386'."
|
---|
581 | end if
|
---|
582 |
|
---|
583 | str = EnvGetFirst("KBUILD_HOST", "BUILD_PLATFORM")
|
---|
584 | if (str <> "") _
|
---|
585 | And (InStr(1, "win|win32|win64", str) <= 0) then '' @todo later only 'win' will be valid. remember to fix this check!
|
---|
586 | EnvPrint "set KBUILD_HOST=win"
|
---|
587 | EnvSet "KBUILD_HOST", "win"
|
---|
588 | MsgWarning "Found unknown KBUILD_HOST value '" & str &"' in your environment. Setting it to 'win32'."
|
---|
589 | end if
|
---|
590 |
|
---|
591 | str = EnvGetFirst("KBUILD_HOST_ARCH", "BUILD_PLATFORM_ARCH")
|
---|
592 | if str <> "" then
|
---|
593 | if InStr(1, "x86|amd64", str) <= 0 then
|
---|
594 | str = "x86"
|
---|
595 | MsgWarning "Found unknown KBUILD_HOST_ARCH value '" & str &"' in your environment. Setting it to 'x86'."
|
---|
596 | end if
|
---|
597 | elseif (EnvGet("PROCESSOR_ARCHITEW6432") = "AMD64" ) _
|
---|
598 | Or (EnvGet("PROCESSOR_ARCHITECTURE") = "AMD64" ) then
|
---|
599 | str = "amd64"
|
---|
600 | else
|
---|
601 | str = "x86"
|
---|
602 | end if
|
---|
603 | LogPrint " Host architecture: " & str & "."
|
---|
604 | Wscript.Echo " Host architecture: " & str & "."
|
---|
605 | EnvPrint "set KBUILD_HOST_ARCH=" & str
|
---|
606 | g_strHostArch = str
|
---|
607 |
|
---|
608 | ' Windows variant of the arch name.
|
---|
609 | g_strHostArchWin = g_strHostArch
|
---|
610 | if g_strHostArchWin = "amd64" then g_strHostArchWin = "x64"
|
---|
611 |
|
---|
612 |
|
---|
613 | str = EnvGetFirst("KBUILD_HOST_CPU", "BUILD_PLATFORM_CPU")
|
---|
614 | ' perhaps a bit pedantic this since this isn't clearly define nor used much...
|
---|
615 | if (str <> "") _
|
---|
616 | And (InStr(1, "i386|i486|i686|i786|i868|k5|k6|k7|k8", str) <= 0) then
|
---|
617 | EnvPrint "set KBUILD_HOST_CPU=i386"
|
---|
618 | EnvSet "KBUILD_HOST_CPU", "i386"
|
---|
619 | MsgWarning "Found unknown KBUILD_HOST_CPU value '" & str &"' in your environment. Setting it to 'i386'."
|
---|
620 | end if
|
---|
621 |
|
---|
622 | '
|
---|
623 | ' Determin the location of the kBuild binaries.
|
---|
624 | '
|
---|
625 | if g_strPathkBuildBin = "" then
|
---|
626 | g_strPathkBuildBin = g_strPathkBuild & "/bin/win." & g_strHostArch
|
---|
627 | if FileExists(g_strPathkBuildBin & "/kmk.exe") = False then
|
---|
628 | g_strPathkBuildBin = g_strPathkBuild & "/bin/win.x86"
|
---|
629 | end if
|
---|
630 | end if
|
---|
631 | g_strPathkBuildBin = UnixSlashes(PathAbs(g_strPathkBuildBin))
|
---|
632 |
|
---|
633 | '
|
---|
634 | ' Perform basic validations of the kBuild installation.
|
---|
635 | '
|
---|
636 | if (FileExists(g_strPathkBuild & "/footer.kmk") = False) _
|
---|
637 | Or (FileExists(g_strPathkBuild & "/header.kmk") = False) _
|
---|
638 | Or (FileExists(g_strPathkBuild & "/rules.kmk") = False) then
|
---|
639 | MsgFatal "Can't find valid kBuild at '" & g_strPathkBuild & "'. Either there is an " _
|
---|
640 | & "incorrect KBUILD_PATH in the environment or the checkout didn't succeed."
|
---|
641 | exit sub
|
---|
642 | end if
|
---|
643 | if (FileExists(g_strPathkBuildBin & "/kmk.exe") = False) _
|
---|
644 | Or (FileExists(g_strPathkBuildBin & "/kmk_ash.exe") = False) then
|
---|
645 | MsgFatal "Can't find valid kBuild binaries at '" & g_strPathkBuildBin & "'. Either there is an " _
|
---|
646 | & "incorrect KBUILD_PATH in the environment or the checkout didn't succeed."
|
---|
647 | exit sub
|
---|
648 | end if
|
---|
649 |
|
---|
650 | if (Shell(DosSlashes(g_strPathkBuildBin & "/kmk.exe") & " --version", True, strOutput) <> 0) then
|
---|
651 | MsgFatal "Can't execute '" & g_strPathkBuildBin & "/kmk.exe --version'. check configure.log for the out."
|
---|
652 | exit sub
|
---|
653 | end if
|
---|
654 |
|
---|
655 | '
|
---|
656 | ' If KBUILD_DEVTOOLS is set, check that it's pointing to something useful.
|
---|
657 | '
|
---|
658 | str = UnixSlashes(EnvGet("KBUILD_DEVTOOLS"))
|
---|
659 | g_strPathDev = str
|
---|
660 | if str <> "" _
|
---|
661 | and LogDirExists(str & "/bin") _
|
---|
662 | and LogDirExists(str & "/win.amd64/bin") _
|
---|
663 | and LogDirExists(str & "/win.x86/bin") _
|
---|
664 | then
|
---|
665 | LogPrint "Found KBUILD_DEVTOOLS='" & str & "'."
|
---|
666 | elseif str <> "" then
|
---|
667 | MsgWarning "Ignoring bogus KBUILD_DEVTOOLS='" & str &"' in your environment!"
|
---|
668 | g_strPathDev = strNew
|
---|
669 | end if
|
---|
670 | if g_strPathDev = "" then
|
---|
671 | g_strPathDev = UnixSlashes(g_strPath & "/tools")
|
---|
672 | LogPrint "Using KBUILD_DEVTOOLS='" & g_strPathDev & "'."
|
---|
673 | if str <> "" then
|
---|
674 | EnvPrint "set KBUILD_DEVTOOLS=" & g_strPathDev
|
---|
675 | EnvSet "KBUILD_DEVTOOLS", g_strPathDev
|
---|
676 | end if
|
---|
677 | end if
|
---|
678 | g_arrPathDev(ArrayFindString(g_arrPathDev, ":placeholder:")) = g_strPathDev
|
---|
679 |
|
---|
680 | '
|
---|
681 | ' Write KBUILD_PATH and updated PATH to the environment script if necessary.
|
---|
682 | '
|
---|
683 | if blnNeedEnvVars = True then
|
---|
684 | EnvPrint "set KBUILD_PATH=" & g_strPathkBuild
|
---|
685 | EnvSet "KBUILD_PATH", g_strPathkBuild
|
---|
686 |
|
---|
687 | if Right(g_strPathkBuildBin, 7) = "win.x86" then
|
---|
688 | EnvPrintCleanup "PATH", DosSlashes(Left(g_strPathkBuildBin, Len(g_strPathkBuildBin) - 7) & "win.amd64"), ";"
|
---|
689 | end if
|
---|
690 | if Right(g_strPathkBuildBin, 9) = "win.amd64" then
|
---|
691 | EnvPrintCleanup "PATH", DosSlashes(Left(g_strPathkBuildBin, Len(g_strPathkBuildBin) - 9) & "win.x86"), ";"
|
---|
692 | end if
|
---|
693 | EnvPrintPrepend "PATH", DosSlashes(g_strPathkBuildBin), ";"
|
---|
694 | EnvPrependPathItem "PATH", g_strPathkBuildBin, ";"
|
---|
695 | end if
|
---|
696 |
|
---|
697 | PrintResult "kBuild", g_strPathkBuild
|
---|
698 | PrintResult "kBuild binaries", g_strPathkBuildBin
|
---|
699 | end sub
|
---|
700 |
|
---|
701 |
|
---|
702 | ''
|
---|
703 | ' Checks for Visual C++ version 16 (2019), 15 (2017), 14 (2015), 12 (2013), 11 (2012) or 10 (2010).
|
---|
704 | '
|
---|
705 | sub CheckForVisualCPP(strOptVC, strOptVCCommon)
|
---|
706 | PrintHdr "Visual C++"
|
---|
707 |
|
---|
708 | '
|
---|
709 | ' Try find it...
|
---|
710 | '
|
---|
711 | dim objState, strProgFiles
|
---|
712 | set objState = new VisualCPPState
|
---|
713 | objState.check strOptVC, strOptVCCommon
|
---|
714 | if g_blnInternalFirst = True then objState.checkInternal
|
---|
715 | objState.checkProgItems "2019"
|
---|
716 | objState.checkProgFiles "Microsoft Visual Studio\2019\BuildTools\VC"
|
---|
717 | objState.checkProgFiles "Microsoft Visual Studio\2019\Professional\VC"
|
---|
718 | objState.checkProgFiles "Microsoft Visual Studio\2019\Community\VC"
|
---|
719 | objState.checkRegistry "Microsoft\VisualStudio\SxS\VS7\16.0", "VC", "" ' doesn't work.
|
---|
720 | objState.checkProgItems "2017"
|
---|
721 | objState.checkProgFiles "Microsoft Visual Studio\2017\BuildTools\VC"
|
---|
722 | objState.checkProgFiles "Microsoft Visual Studio\2017\Professional\VC"
|
---|
723 | objState.checkProgFiles "Microsoft Visual Studio\2017\Community\VC"
|
---|
724 | objState.checkProgFiles "Microsoft Visual Studio\2017\Express\VC"
|
---|
725 | objState.checkRegistry "Microsoft\VisualStudio\SxS\VS7\15.0", "VC", ""
|
---|
726 | objState.checkRegistry "Microsoft\VisualStudio\SxS\VS7\14.0", "VC", "Common7"
|
---|
727 | objState.checkRegistry "Microsoft\VisualStudio\SxS\VS7\12.0", "VC", "Common7" '?
|
---|
728 | objState.checkRegistry "Microsoft\VisualStudio\SxS\VS7\11.0", "VC", "Common7" '?
|
---|
729 | objState.checkProg "cl.exe"
|
---|
730 | objState.checkRegistry "Microsoft\VisualStudio\10.0\Setup\VS\ProductDir", "VC", "Common7"
|
---|
731 | if g_blnInternalFirst = False then objState.checkInternal
|
---|
732 |
|
---|
733 | if objState.m_blnFound = False then
|
---|
734 | MsgError "Cannot find cl.exe (Visual C++) anywhere on your system. Check the build requirements."
|
---|
735 | exit sub
|
---|
736 | end if
|
---|
737 | g_strPathVCC = objState.m_strPathVC
|
---|
738 | g_strVCCVersion = objState.m_strVersion
|
---|
739 |
|
---|
740 | '
|
---|
741 | ' Ok, emit build config variables.
|
---|
742 | '
|
---|
743 | CfgPrintAssign "VBOX_VCC_TOOL_STEM", objState.m_strVersion
|
---|
744 | CfgPrintAssign "PATH_TOOL_" & objState.m_strVersion, g_strPathVCC
|
---|
745 | CfgPrintAssign "PATH_TOOL_" & objState.m_strVersion & "X86", "$(PATH_TOOL_" & objState.m_strVersion & ")"
|
---|
746 | CfgPrintAssign "PATH_TOOL_" & objState.m_strVersion & "AMD64", "$(PATH_TOOL_" & objState.m_strVersion & ")"
|
---|
747 |
|
---|
748 | if objState.m_strVersion = "VCC100" _
|
---|
749 | or objState.m_strVersion = "VCC110" _
|
---|
750 | or objState.m_strVersion = "VCC120" _
|
---|
751 | or objState.m_strVersion = "VCC140" _
|
---|
752 | then
|
---|
753 | CfgPrintAssign "VBOX_WITH_NEW_VCC", "" '?? for VCC110+
|
---|
754 | else
|
---|
755 | CfgPrintAssign "VBOX_WITH_NEW_VCC", "1"
|
---|
756 | end if
|
---|
757 | PrintResult "Visual C++ " & objState.m_strVersion, g_strPathVCC
|
---|
758 |
|
---|
759 | ' And the env.bat path fix.
|
---|
760 | if objState.m_strPathVCCommon <> "" then
|
---|
761 | EnvPrintAppend "PATH", DosSlashes(objState.m_strPathVCCommon) & "\IDE", ";"
|
---|
762 | end if
|
---|
763 | end sub
|
---|
764 |
|
---|
765 | '' Class we use for detecting Visual C++
|
---|
766 | class VisualCPPState
|
---|
767 | public m_blnFound
|
---|
768 | public m_strPathVC
|
---|
769 | public m_strPathVCCommon
|
---|
770 | public m_strVersion
|
---|
771 | public m_strClVersion
|
---|
772 | public m_blnNewLayout
|
---|
773 |
|
---|
774 | private sub Class_Initialize
|
---|
775 | m_blnFound = False
|
---|
776 | m_strPathVC = ""
|
---|
777 | m_strPathVCCommon = ""
|
---|
778 | m_strVersion = ""
|
---|
779 | m_strClVersion = ""
|
---|
780 | m_blnNewLayout = false
|
---|
781 | end sub
|
---|
782 |
|
---|
783 | public function checkClExe(strClExe)
|
---|
784 | ' We'll have to make sure mspdbXX.dll is somewhere in the PATH.
|
---|
785 | dim strSavedPath, rcExit, strOutput
|
---|
786 |
|
---|
787 | strSavedPath = EnvGet("PATH")
|
---|
788 | if (m_strPathVCCommon <> "") then
|
---|
789 | EnvAppendPathItem "PATH", m_strPathVCCommon & "/IDE", ";"
|
---|
790 | end if
|
---|
791 | rcExit = Shell(DosSlashes(strClExe), True, strOutput)
|
---|
792 | EnvSet "PATH", strSavedPath
|
---|
793 |
|
---|
794 | checkClExe = False
|
---|
795 | if rcExit = 0 then
|
---|
796 | ' Extract the ' Version xx.yy.build.zz for arch' bit.
|
---|
797 | dim offVer, offEol, strVer
|
---|
798 | strVer = ""
|
---|
799 | offVer = InStr(1, strOutput, " Version ")
|
---|
800 | if offVer > 0 then
|
---|
801 | offVer = offVer + Len(" Version ")
|
---|
802 | offEol = InStr(offVer, strOutput, Chr(13))
|
---|
803 | if offEol > 0 then
|
---|
804 | strVer = Trim(Mid(strOutput, offVer, offEol - offVer))
|
---|
805 | end if
|
---|
806 | end if
|
---|
807 |
|
---|
808 | ' Check that it's a supported version
|
---|
809 | checkClExe = True
|
---|
810 | if InStr(1, strVer, "16.") = 1 then
|
---|
811 | m_strVersion = "VCC100"
|
---|
812 | elseif InStr(1, strVer, "17.") = 1 then
|
---|
813 | m_strVersion = "VCC110"
|
---|
814 | LogPrint "The Visual C++ compiler ('" & strClExe & "') version isn't really supported, but may work: " & strVer
|
---|
815 | elseif InStr(1, strVer, "18.") = 1 then
|
---|
816 | m_strVersion = "VCC120"
|
---|
817 | LogPrint "The Visual C++ compiler ('" & strClExe & "') version isn't really supported, but may work: " & strVer
|
---|
818 | elseif InStr(1, strVer, "19.0") = 1 then
|
---|
819 | m_strVersion = "VCC140"
|
---|
820 | LogPrint "The Visual C++ compiler ('" & strClExe & "') version isn't really supported, but may work: " & strVer
|
---|
821 | elseif InStr(1, strVer, "19.1") = 1 then
|
---|
822 | m_strVersion = "VCC141"
|
---|
823 | LogPrint "The Visual C++ compiler ('" & strClExe & "') version isn't really supported, but may work: " & strVer
|
---|
824 | elseif InStr(1, strVer, "19.2") = 1 then
|
---|
825 | m_strVersion = "VCC142"
|
---|
826 | else
|
---|
827 | LogPrint "The Visual C++ compiler we found ('" & strClExe & "') isn't in the 10.0-19.2x range (" & strVer & ")."
|
---|
828 | LogPrint "Check the build requirements and select the appropriate compiler version."
|
---|
829 | checkClExe = False
|
---|
830 | exit function
|
---|
831 | end if
|
---|
832 | LogPrint "'" & strClExe & "' = " & m_strVersion & " (" & strVer & ")"
|
---|
833 | else
|
---|
834 | LogPrint "Executing '" & strClExe & "' (which we believe to be the Visual C++ compiler driver) failed (rcExit=" & rcExit & ")."
|
---|
835 | end if
|
---|
836 | end function
|
---|
837 |
|
---|
838 | public function checkInner(strPathVC) ' For the new layout only
|
---|
839 | if m_blnFound = False then
|
---|
840 | if LogDirExists(strPathVC & "/bin") _
|
---|
841 | and LogDirExists(strPathVC & "/lib") _
|
---|
842 | and LogDirExists(strPathVC & "/include") _
|
---|
843 | and LogFileExists(strPathVC, "include/stdarg.h") _
|
---|
844 | and LogFileExists(strPathVC, "lib/x64/libcpmt.lib") _
|
---|
845 | and LogFileExists(strPathVC, "lib/x86/libcpmt.lib") _
|
---|
846 | and LogFileExists(strPathVC, "bin/Host" & g_strHostArchWin & "/" & g_strTargetArchWin & "/cl.exe") _
|
---|
847 | and LogFileExists(strPathVC, "bin/Host" & g_strHostArchWin & "/" & g_strHostArchWin & "/cl.exe") _
|
---|
848 | then
|
---|
849 | LogPrint " => seems okay. new layout."
|
---|
850 | m_blnFound = checkClExe(strPathVC & "/bin/Host" & g_strHostArchWin & "/" & g_strTargetArchWin & "/cl.exe")
|
---|
851 | if m_blnFound then
|
---|
852 | m_strPathVC = strPathVC
|
---|
853 | end if
|
---|
854 | end if
|
---|
855 | end if
|
---|
856 | checkInner = m_blnFound
|
---|
857 | end function
|
---|
858 |
|
---|
859 | public function check(strPathVC, strPathVCommon)
|
---|
860 | if (m_blnFound = False) and (strPathVC <> "") then
|
---|
861 | m_strPathVC = UnixSlashes(PathAbs(strPathVC))
|
---|
862 | m_strPathVCCommon = strPathVCCommon
|
---|
863 | m_strVersion = ""
|
---|
864 |
|
---|
865 | LogPrint "Trying: strPathVC=" & m_strPathVC & " strPathVCCommon=" & m_strPathVCCommon
|
---|
866 | if LogDirExists(m_strPathVC) then
|
---|
867 | ' 15.0+ layout? This is fun because of the multiple CL versions (/tools/msvc/xx.yy.bbbbb/).
|
---|
868 | ' OTOH, the user may have pointed us directly to one of them.
|
---|
869 | if LogDirExists(m_strPathVC & "/Tools/MSVC") then
|
---|
870 | m_blnNewLayout = True
|
---|
871 | LogPrint " => seems okay. new layout."
|
---|
872 | dim arrFolders, i
|
---|
873 | arrFolders = GetSubdirsStartingWithVerSorted(m_strPathVC & "/Tools/MSVC", "14.2")
|
---|
874 | if UBound(arrFolders) < 0 then arrFolders = GetSubdirsStartingWithVerSorted(m_strPathVC & "/Tools/MSVC", "14.1")
|
---|
875 | if UBound(arrFolders) < 0 then arrFolders = GetSubdirsStartingWithVerSorted(m_strPathVC & "/Tools/MSVC", "1")
|
---|
876 | for i = UBound(arrFolders) to LBound(arrFolders) step -1
|
---|
877 | if checkInner(m_strPathVC & "/Tools/MSVC/" & arrFolders(i)) then exit for ' modifies m_strPathVC on success
|
---|
878 | next
|
---|
879 | elseif LogDirExists(m_strPathVC & "/bin/HostX64") _
|
---|
880 | or LogDirExists(m_strPathVC & "/bin/HostX86") then
|
---|
881 | checkInner(m_strPathVC)
|
---|
882 | ' 14.0 and older layout?
|
---|
883 | elseif LogFileExists(m_strPathVC, "/bin/cl.exe") then
|
---|
884 | m_blnNewLayout = False
|
---|
885 | if LogFileExists(m_strPathVC, "bin/link.exe") _
|
---|
886 | and LogFileExists(m_strPathVC, "include/string.h") _
|
---|
887 | and LogFileExists(m_strPathVC, "lib/libcmt.lib") _
|
---|
888 | and LogFileExists(m_strPathVC, "lib/msvcrt.lib") _
|
---|
889 | then
|
---|
890 | LogPrint " => seems okay. old layout."
|
---|
891 | m_blnFound = checkClExe(m_strPathVC & "/bin/cl.exe")
|
---|
892 | end if
|
---|
893 | end if
|
---|
894 | end if
|
---|
895 | end if
|
---|
896 | check = m_bldFound
|
---|
897 | end function
|
---|
898 |
|
---|
899 | public function checkProg(strProg)
|
---|
900 | if m_blnFound = False then
|
---|
901 | dim str, i, offNewLayout
|
---|
902 | str = Which(strProg)
|
---|
903 | if str <> "" then
|
---|
904 | LogPrint "checkProg: '" & strProg & "' -> '" & str & "'"
|
---|
905 | if FileExists(PathStripFilename(str) & "/build.exe") then
|
---|
906 | Warning "Ignoring DDK cl.exe (" & str & ")." ' don't know how to deal with this cl.
|
---|
907 | else
|
---|
908 | ' Assume we've got cl.exe from somewhere under the 'bin' directory..
|
---|
909 | m_strPathVC = PathParent(PathStripFilename(str))
|
---|
910 | for i = 1 To 5
|
---|
911 | if LogDirExists(m_strPathVC & "/include") then
|
---|
912 | m_strPathVCCommon = PathParent(m_strPathVC) & "/Common7"
|
---|
913 | if DirExists(m_strPathVCCommon) = False then
|
---|
914 | m_strPathVCCommon = ""
|
---|
915 | ' New layout?
|
---|
916 | offNewLayout = InStr(1, LCase(DosSlashes(m_strPathVC)), "\tools\msvc\")
|
---|
917 | if offNewLayout > 0 then m_strPathVC = Left(m_strPathVC, offNewLayout)
|
---|
918 | end if
|
---|
919 | check m_strPathVC, m_strPathVCCommon
|
---|
920 | exit for
|
---|
921 | end if
|
---|
922 | m_strPathVC = PathParent(m_strPathVC)
|
---|
923 | next
|
---|
924 | end if
|
---|
925 | end if
|
---|
926 | end if
|
---|
927 | checkProg = m_bldFound
|
---|
928 | end function
|
---|
929 |
|
---|
930 | public function checkProgFiles(strSubdir)
|
---|
931 | if m_blnFound = False then
|
---|
932 | dim strProgFiles
|
---|
933 | for each strProgFiles in g_arrProgramFiles
|
---|
934 | check strProgFiles & "/" & strSubdir, ""
|
---|
935 | next
|
---|
936 | end if
|
---|
937 | checkProgFiles = m_blnFound
|
---|
938 | end function
|
---|
939 |
|
---|
940 | public function checkRegistry(strValueNm, strVCSubdir, strVCommonSubdir)
|
---|
941 | if m_blnFound = False then
|
---|
942 | dim str, strPrefix, arrPrefixes
|
---|
943 | arrPrefixes = Array("HKLM\SOFTWARE\Wow6432Node\", "HKLM\SOFTWARE\", "HKCU\SOFTWARE\Wow6432Node\", "HKCU\SOFTWARE\")
|
---|
944 | for each strPrefix in arrPrefixes
|
---|
945 | str = LogRegGetString(strPrefix & strValueNm)
|
---|
946 | if str <> "" then
|
---|
947 | LogPrint "checkRegistry: '" & strPrefix & strValueNm & "' -> '" & str & "'"
|
---|
948 | if check(str & strVCSubdir, str & strVCommonSubdir) = True then
|
---|
949 | exit for
|
---|
950 | end if
|
---|
951 | end if
|
---|
952 | next
|
---|
953 | end if
|
---|
954 | checkRegistry = m_bldFound
|
---|
955 | end function
|
---|
956 |
|
---|
957 | public function checkProgItems(strVersionYear)
|
---|
958 | if m_blnFound = False then
|
---|
959 | dim strCandidate
|
---|
960 | for each strCandidate in CollectFromProgramItemLinks(GetRef("VisualCPPCallback"), strVersionYear)
|
---|
961 | check strCandidate, ""
|
---|
962 | next
|
---|
963 | end if
|
---|
964 | checkProgItems = m_blnFound
|
---|
965 | end function
|
---|
966 |
|
---|
967 | public function checkInternal
|
---|
968 | dim strPathDev
|
---|
969 | for each strPathDev in g_arrPathDev : check strPathDev & "/win.amd64/vcc/v14.2", "" : next
|
---|
970 | for each strPathDev in g_arrPathDev : check strPathDev & "/win.amd64/vcc/v14.2", "" : next
|
---|
971 | for each strPathDev in g_arrPathDev : check strPathDev & "/win.amd64/vcc/v14.1", "" : next
|
---|
972 | for each strPathDev in g_arrPathDev : check strPathDev & "/win.amd64/vcc/v14.0", "" : next
|
---|
973 | for each strPathDev in g_arrPathDev : check strPathDev & "/win.amd64/vcc/v10sp1", "" : next
|
---|
974 | for each strPathDev in g_arrPathDev : check strPathDev & "/win.x86/vcc/v10sp1", "" : next
|
---|
975 | checkInternal = m_blnFound
|
---|
976 | end function
|
---|
977 | end class
|
---|
978 |
|
---|
979 | ' See checkProgItems()
|
---|
980 | function VisualCPPCallback(ByRef arrStrings, cStrings, ByRef strVersionYear)
|
---|
981 | VisualCPPCallback = ""
|
---|
982 | ' We're looking for items with three strings like this:
|
---|
983 | ' C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools\VC\x64 Native Tools Command Prompt for VS 2019.lnk
|
---|
984 | ' C:\Windows\system32\cmd.exe
|
---|
985 | ' /k "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars64.bat"
|
---|
986 | if cStrings >= 3 then
|
---|
987 | if InStr(1, arrStrings(0), strVersionYear) > 0 then
|
---|
988 | dim strTail : strTail = "\Auxiliary\Build\vcvars64.bat"""
|
---|
989 | dim str : str = arrStrings(UBound(arrStrings))
|
---|
990 | if StrComp(Right(str, Len(strTail)), strTail, vbTextCompare) = 0 then
|
---|
991 | dim offColon : offColon = InStr(1, str, ":")
|
---|
992 | if offColon > 1 then
|
---|
993 | VisualCPPCallback = Mid(str, offColon - 1, Len(str) - (offColon - 2) - Len(strTail))
|
---|
994 | end if
|
---|
995 | end if
|
---|
996 | end if
|
---|
997 | end if
|
---|
998 | end function
|
---|
999 |
|
---|
1000 |
|
---|
1001 | ''
|
---|
1002 | ' Checks for a platform SDK that works with the compiler
|
---|
1003 | '
|
---|
1004 | sub CheckForPlatformSDK(strOptSDK)
|
---|
1005 | dim strPathPSDK, strVersion, strSubKey, str, strHkey
|
---|
1006 | PrintHdr "Windows Platform SDK (recent)"
|
---|
1007 |
|
---|
1008 | '
|
---|
1009 | ' Search for it.
|
---|
1010 | '
|
---|
1011 |
|
---|
1012 | ' Check the supplied argument first.
|
---|
1013 | strPathPSDK = CheckForPlatformSDKSub(strOptSDK, strVersion)
|
---|
1014 |
|
---|
1015 | ' The tools location (first).
|
---|
1016 | if strPathPSDK = "" and g_blnInternalFirst = true then strPathPSDK = SearchTargetPlusTools("sdk", "v7.1", GetRef("CheckForPlatformSDKSub"), strVersion)
|
---|
1017 | if strPathPSDK = "" and g_blnInternalFirst = true then strPathPSDK = SearchTargetPlusTools("sdk", "v8.0", GetRef("CheckForPlatformSDKSub"), strVersion)
|
---|
1018 |
|
---|
1019 | ' Look for it in the environment
|
---|
1020 | if strPathPSDK = "" then strPathPSDK = CheckForPlatformSDKSub(EnvGet("MSSdk"), strVersion)
|
---|
1021 | if strPathPSDK = "" then strPathPSDK = CheckForPlatformSDKSub(EnvGet("Mstools"), strVersion)
|
---|
1022 |
|
---|
1023 | ' Check if there is one installed with the compiler.
|
---|
1024 | if strPathPSDK = "" then strPathPSDK = CheckForPlatformSDKSub(g_strPathVCC & "/PlatformSDK", strVersion)
|
---|
1025 |
|
---|
1026 | ' Check the registry next (ASSUMES sorting).
|
---|
1027 | if strPathPSDK = "" then
|
---|
1028 | for each strHkey in Array("HKLM", "HKCU")
|
---|
1029 | for each strSubKey in RegEnumSubKeysRVerSorted(strHkey, "SOFTWARE\Microsoft\Microsoft SDKs\Windows")
|
---|
1030 | str = LogRegGetString(strHkey & "\SOFTWARE\Microsoft\Microsoft SDKs\Windows\" & strSubKey & "\InstallationFolder")
|
---|
1031 | strPathPSDK = CheckForPlatformSDKSub(str, strVersion)
|
---|
1032 | if strPathPSDK <> "" then exit for
|
---|
1033 | next
|
---|
1034 | if strPathPSDK <> "" then exit for
|
---|
1035 | next
|
---|
1036 | end if
|
---|
1037 |
|
---|
1038 | ' The tools location (post).
|
---|
1039 | if strPathPSDK = "" and g_blnInternalFirst = false then strPathPSDK = SearchTargetPlusTools("sdk", "v7.1", GetRef("CheckForPlatformSDKSub"), strVersion)
|
---|
1040 | if strPathPSDK = "" and g_blnInternalFirst = false then strPathPSDK = SearchTargetPlusTools("sdk", "v8.0", GetRef("CheckForPlatformSDKSub"), strVersion)
|
---|
1041 |
|
---|
1042 | ' Give up.
|
---|
1043 | if strPathPSDK = "" then
|
---|
1044 | MsgError "Cannot find a suitable Platform SDK. Check configure.log and the build requirements."
|
---|
1045 | exit sub
|
---|
1046 | end if
|
---|
1047 |
|
---|
1048 | '
|
---|
1049 | ' Emit the config.
|
---|
1050 | '
|
---|
1051 | strPathPSDK = UnixSlashes(PathAbs(strPathPSDK))
|
---|
1052 | CfgPrintAssign "PATH_SDK_WINPSDK" & strVersion, strPathPSDK
|
---|
1053 | CfgPrintAssign "VBOX_WINPSDK", "WINPSDK" & strVersion
|
---|
1054 |
|
---|
1055 | PrintResult "Windows Platform SDK", strPathPSDK
|
---|
1056 | PrintResultMsg "Windows Platform SDK version", strVersion
|
---|
1057 | g_strVerPSDK = strVersion
|
---|
1058 | g_strPathPSDK = strPathPSDK
|
---|
1059 | end sub
|
---|
1060 |
|
---|
1061 | '' Checks if the specified path points to a usable PSDK.
|
---|
1062 | function CheckForPlatformSDKSub(strPathPSDK, ByRef strVersion)
|
---|
1063 | dim strOutput
|
---|
1064 | CheckForPlatformSDKSub = ""
|
---|
1065 | if strPathPSDK <> "" then
|
---|
1066 | LogPrint "Trying: strPathPSDK=" & strPathPSDK
|
---|
1067 | if LogFileExists(strPathPSDK, "include/Windows.h") _
|
---|
1068 | and LogFileExists(strPathPSDK, "lib/Kernel32.Lib") _
|
---|
1069 | and LogFileExists(strPathPSDK, "lib/User32.Lib") _
|
---|
1070 | and LogFileExists(strPathPSDK, "bin/rc.exe") _
|
---|
1071 | and Shell("""" & DosSlashes(strPathPSDK & "/bin/rc.exe") & """" , True, strOutput) <> 0 _
|
---|
1072 | then
|
---|
1073 | if InStr(1, strOutput, "Resource Compiler Version 6.2.") > 0 then
|
---|
1074 | strVersion = "80"
|
---|
1075 | CheckForPlatformSDKSub = UnixSlashes(PathAbs(strPathPSDK))
|
---|
1076 | elseif InStr(1, strOutput, "Resource Compiler Version 6.1.") > 0 then
|
---|
1077 | strVersion = "71"
|
---|
1078 | CheckForPlatformSDKSub = UnixSlashes(PathAbs(strPathPSDK))
|
---|
1079 | end if
|
---|
1080 | end if
|
---|
1081 | end if
|
---|
1082 | end function
|
---|
1083 |
|
---|
1084 |
|
---|
1085 | ''
|
---|
1086 | ' Checks for a windows 10 SDK (later also WDK).
|
---|
1087 | '
|
---|
1088 | sub CheckForSDK10(strOptSDK10, strOptSDK10Version)
|
---|
1089 | dim strPathSDK10, strSDK10Version, str
|
---|
1090 | PrintHdr "Windows 10 SDK/WDK"
|
---|
1091 | '' @todo implement strOptSDK10Version
|
---|
1092 |
|
---|
1093 | '
|
---|
1094 | ' Try find the Windows 10 kit.
|
---|
1095 | '
|
---|
1096 | strSDK10Version = ""
|
---|
1097 | strPathSDK10 = CheckForSDK10Sub(strOptSDK10, strSDK10Version)
|
---|
1098 | if strPathSDK10 = "" and g_blnInternalFirst = true then
|
---|
1099 | strPathSDK10 = SearchTargetPlusTools("sdk", "v10.", GetRef("CheckForSDK10Sub"), strSDK10Version)
|
---|
1100 | end if
|
---|
1101 |
|
---|
1102 | if strPathSDK10 = "" then
|
---|
1103 | str = LogRegGetString("HKLM\SOFTWARE\Microsoft\Windows Kits\Installed Roots\KitsRoot10")
|
---|
1104 | strPathSDK10 = CheckForSDK10Sub(str, strSDK10Version)
|
---|
1105 | end if
|
---|
1106 | if strPathSDK10 = "" then
|
---|
1107 | for each str in g_arrProgramFiles
|
---|
1108 | strPathSDK10 = CheckForSDK10Sub(str & "/Windows Kits/10", strSDK10Version)
|
---|
1109 | if strPathSDK10 <> "" then exit for
|
---|
1110 | next
|
---|
1111 | end if
|
---|
1112 | if strPathSDK10 = "" and g_blnInternalFirst = true then
|
---|
1113 | strPathSDK10 = SearchTargetPlusTools("sdk", "v10.", GetRef("CheckForSDK10Sub"), strSDK10Version)
|
---|
1114 | end if
|
---|
1115 |
|
---|
1116 | if strPathSDK10 = "" then
|
---|
1117 | MsgError "Cannot find a suitable Windows 10 SDK. Check configure.log and the build requirements."
|
---|
1118 | exit sub
|
---|
1119 | end if
|
---|
1120 |
|
---|
1121 | '
|
---|
1122 | ' Emit the config.
|
---|
1123 | '
|
---|
1124 | strPathSDK10 = UnixSlashes(PathAbs(strPathSDK10))
|
---|
1125 | CfgPrintAssign "PATH_SDK_WINSDK10", strPathSDK10
|
---|
1126 | CfgPrintAssign "SDK_WINSDK10_VERSION", strSDK10Version
|
---|
1127 |
|
---|
1128 | PrintResult "Windows 10 SDK", strPathSDK10
|
---|
1129 | PrintResultMsg "Windows 10 SDK version", strSDK10Version
|
---|
1130 | g_strPathSDK10 = strPathSDK10
|
---|
1131 | end sub
|
---|
1132 |
|
---|
1133 | '' Checks if the specified path points to a usable Windows 10 SDK/WDK.
|
---|
1134 | function CheckForSDK10Sub(strPathSDK10, ByRef strSDK10Version)
|
---|
1135 | CheckForSDK10Sub = ""
|
---|
1136 | if strPathSDK10 <> "" then
|
---|
1137 | LogPrint "Trying: strPathSDK10=" & strPathSDK10
|
---|
1138 | if LogDirExists(strPathSDK10) then
|
---|
1139 | if LogDirExists(strPathSDK10 & "/Bin") _
|
---|
1140 | and LogDirExists(strPathSDK10 & "/Include") _
|
---|
1141 | and LogDirExists(strPathSDK10 & "/Lib") _
|
---|
1142 | and LogDirExists(strPathSDK10 & "/Redist") _
|
---|
1143 | then
|
---|
1144 | ' Only testing the highest one, for now. '' @todo incorporate strOptSDK10Version
|
---|
1145 | dim arrVersions
|
---|
1146 | arrVersions = GetSubdirsStartingWithVerSorted(strPathSDK10 & "/Include", "10.0.")
|
---|
1147 | if UBound(arrVersions) >= 0 then
|
---|
1148 | dim strVersion
|
---|
1149 | strVersion = arrVersions(UBound(arrVersions))
|
---|
1150 | LogPrint "Trying version: " & strVersion
|
---|
1151 | if LogFileExists(strPathSDK10, "include/" & strVersion & "/um/Windows.h") _
|
---|
1152 | and LogFileExists(strPathSDK10, "include/" & strVersion & "/ucrt/malloc.h") _
|
---|
1153 | and LogFileExists(strPathSDK10, "include/" & strVersion & "/ucrt/stdio.h") _
|
---|
1154 | and LogFileExists(strPathSDK10, "lib/" & strVersion & "/um/" & g_strTargetArchWin & "/kernel32.lib") _
|
---|
1155 | and LogFileExists(strPathSDK10, "lib/" & strVersion & "/um/" & g_strTargetArchWin & "/user32.lib") _
|
---|
1156 | and LogFileExists(strPathSDK10, "lib/" & strVersion & "/ucrt/" & g_strTargetArchWin & "/libucrt.lib") _
|
---|
1157 | and LogFileExists(strPathSDK10, "lib/" & strVersion & "/ucrt/" & g_strTargetArchWin & "/ucrt.lib") _
|
---|
1158 | and LogFileExists(strPathSDK10, "bin/" & strVersion & "/" & g_strHostArchWin & "/rc.exe") _
|
---|
1159 | and LogFileExists(strPathSDK10, "bin/" & strVersion & "/" & g_strHostArchWin & "/midl.exe") _
|
---|
1160 | then
|
---|
1161 | if StrComp(strVersion, "10.0.17134.0") >= 0 then
|
---|
1162 | strSDK10Version = strVersion
|
---|
1163 | CheckForSDK10Sub = strPathSDK10
|
---|
1164 | else
|
---|
1165 | LogPrint "Version " & strVersion & " is too low, minimum: 10.0.17134.0"
|
---|
1166 | end if
|
---|
1167 | end if
|
---|
1168 | else
|
---|
1169 | LogPrint "Found no 10.0.* subdirectories under '" & strPathSDK10 & "/Include'!"
|
---|
1170 | end if
|
---|
1171 | end if
|
---|
1172 | end if
|
---|
1173 | end if
|
---|
1174 | end function
|
---|
1175 |
|
---|
1176 |
|
---|
1177 | ''
|
---|
1178 | ' Locating a Windows 7 Driver Kit.
|
---|
1179 | '
|
---|
1180 | sub CheckForWinDDK(strOptDDK)
|
---|
1181 | dim strPathDDK, str, strSubKeys
|
---|
1182 | PrintHdr "Windows DDK v7.1"
|
---|
1183 |
|
---|
1184 | '
|
---|
1185 | ' Find the DDK.
|
---|
1186 | '
|
---|
1187 | strPathDDK = CheckForWinDDKSub(strOptDDK, True)
|
---|
1188 |
|
---|
1189 | ' The tools location (first).
|
---|
1190 | if strPathDDK = "" and g_blnInternalFirst = true then
|
---|
1191 | for each str in g_arrPathDev
|
---|
1192 | strPathDDK = CheckForWinDDKSub(str & "/win.x86/ddk/7600.16385.1", False)
|
---|
1193 | if strPathDDK <> "" then exit for
|
---|
1194 | next
|
---|
1195 | end if
|
---|
1196 |
|
---|
1197 | ' Check the environment
|
---|
1198 | if strPathDDK = "" then strPathDDK = CheckForWinDDKSub(PathParent(PathParent(EnvGet("DDK_INC_PATH"))), True)
|
---|
1199 | if strPathDDK = "" then strPathDDK = CheckForWinDDKSub(EnvGet("BASEDIR"), True)
|
---|
1200 |
|
---|
1201 | ' Some array constants to ease the work.
|
---|
1202 | arrSoftwareKeys = array("SOFTWARE", "SOFTWARE\Wow6432Node")
|
---|
1203 | arrRoots = array("HKLM", "HKCU")
|
---|
1204 |
|
---|
1205 | ' Windows 7 WDK.
|
---|
1206 | if strPathDDK = "" then
|
---|
1207 | arrLocations = array()
|
---|
1208 | for each strSoftwareKey in arrSoftwareKeys
|
---|
1209 | for each strSubKey in RegEnumSubKeysFull("HKLM", strSoftwareKey & "\Microsoft\KitSetup\configured-kits")
|
---|
1210 | for each strSubKey2 in RegEnumSubKeysFull("HKLM", strSubKey)
|
---|
1211 | str = LogRegGetString("HKLM\" & strSubKey2 & "\setup-install-location")
|
---|
1212 | if str <> "" then
|
---|
1213 | arrLocations = ArrayAppend(arrLocations, PathAbsLong(str))
|
---|
1214 | end if
|
---|
1215 | next
|
---|
1216 | next
|
---|
1217 | next
|
---|
1218 | arrLocations = ArrayRVerSortStrings(arrLocations)
|
---|
1219 |
|
---|
1220 | ' Check the locations we've gathered.
|
---|
1221 | for each str in arrLocations
|
---|
1222 | strPathDDK = CheckForWinDDKSub(str, True)
|
---|
1223 | if strPathDDK <> "" then exit for
|
---|
1224 | next
|
---|
1225 | end if
|
---|
1226 |
|
---|
1227 | ' The tools location (post).
|
---|
1228 | if strPathDDK = "" and g_blnInternalFirst = false then
|
---|
1229 | for each str in g_arrPathDev
|
---|
1230 | strPathDDK = CheckForWinDDKSub(str & "/win.x86/ddk/7600.16385.1", False)
|
---|
1231 | if strPathDDK <> "" then exit for
|
---|
1232 | next
|
---|
1233 | end if
|
---|
1234 |
|
---|
1235 | ' Give up.
|
---|
1236 | if strPathDDK = "" then
|
---|
1237 | MsgError "Cannot find the Windows DDK v7.1. Check configure.log and the build requirements."
|
---|
1238 | exit sub
|
---|
1239 | end if
|
---|
1240 |
|
---|
1241 | '
|
---|
1242 | ' Emit the config.
|
---|
1243 | '
|
---|
1244 | strPathDDK = UnixSlashes(PathAbs(strPathDDK))
|
---|
1245 | CfgPrintAssign "PATH_SDK_WINDDK71", strPathDDK
|
---|
1246 |
|
---|
1247 | PrintResult "Windows DDK v7.1", strPathDDK
|
---|
1248 | g_strPathDDK = strPathDDK
|
---|
1249 | end sub
|
---|
1250 |
|
---|
1251 | '' Quick check if the DDK is in the specified directory or not.
|
---|
1252 | function CheckForWinDDKSub(strPathDDK, blnCheckBuild)
|
---|
1253 | CheckForWinDDKSub = ""
|
---|
1254 | if strPathDDK <> "" then
|
---|
1255 | dim strOutput
|
---|
1256 | LogPrint "Trying: strPathDDK=" & strPathDDK & " blnCheckBuild=" & blnCheckBuild
|
---|
1257 | if LogFileExists(strPathDDK, "inc/api/ntdef.h") _
|
---|
1258 | And LogFileExists(strPathDDK, "lib/win7/i386/int64.lib") _
|
---|
1259 | And LogFileExists(strPathDDK, "lib/wlh/i386/int64.lib") _
|
---|
1260 | And LogFileExists(strPathDDK, "lib/wnet/i386/int64.lib") _
|
---|
1261 | And LogFileExists(strPathDDK, "lib/wxp/i386/int64.lib") _
|
---|
1262 | And Not LogFileExists(strPathDDK, "lib/win8/i386/int64.lib") _
|
---|
1263 | And LogFileExists(strPathDDK, "bin/x86/rc.exe") _
|
---|
1264 | then
|
---|
1265 | if Not blnCheckBuild then
|
---|
1266 | CheckForWinDDKSub = strPathDDK
|
---|
1267 | '' @todo Find better build check.
|
---|
1268 | elseif Shell("""" & DosSlashes(strPathDDK & "/bin/x86/rc.exe") & """" , True, strOutput) <> 0 _
|
---|
1269 | and InStr(1, strOutput, "Resource Compiler Version 6.1.") > 0 _
|
---|
1270 | then
|
---|
1271 | CheckForWinDDKSub = strPathDDK
|
---|
1272 | end if
|
---|
1273 | end if
|
---|
1274 | end if
|
---|
1275 | end function
|
---|
1276 |
|
---|
1277 |
|
---|
1278 | ''
|
---|
1279 | ' Locating midl.exe
|
---|
1280 | '
|
---|
1281 | sub CheckForMidl(strOptMidl)
|
---|
1282 | dim strMidl, str
|
---|
1283 | PrintHdr "Midl.exe"
|
---|
1284 |
|
---|
1285 | ' Skip if no COM/ATL.
|
---|
1286 | if g_blnDisableCOM then
|
---|
1287 | PrintResultMsg "Midl.exe", "Skipped (" & g_strDisableCOM & ")"
|
---|
1288 | exit sub
|
---|
1289 | end if
|
---|
1290 |
|
---|
1291 | strMidl = CheckForMidlSub(strOptMidl)
|
---|
1292 | if strMidl = "" then strMidl = CheckForMidlSub(g_strPathSDK10 & "/bin/" & g_strHostArchWin & "/Midl.exe")
|
---|
1293 | if strMidl = "" then strMidl = CheckForMidlSub(g_strPathSDK10 & "/bin/x86/Midl.exe")
|
---|
1294 | if strMidl = "" then strMidl = CheckForMidlSub(g_strPathPSDK & "/bin/Midl.exe")
|
---|
1295 | if strMidl = "" then strMidl = CheckForMidlSub(g_strPathVCC & "/Common7/Tools/Bin/Midl.exe")
|
---|
1296 | if strMidl = "" then strMidl = CheckForMidlSub(g_strPathDDK & "/bin/" & g_strHostArchWin & "/Midl.exe")
|
---|
1297 | if strMidl = "" then strMidl = CheckForMidlSub(g_strPathDDK & "/bin/x86/Midl.exe")
|
---|
1298 | if strMidl = "" then strMidl = CheckForMidlSub(g_strPathDDK & "/bin/Midl.exe")
|
---|
1299 | if strMidl = "" then
|
---|
1300 | for each str in g_arrPathDev
|
---|
1301 | strMidl = CheckForMidlSub(str & "/win." & g_strHostArchWin & "/bin/Midl.exe")
|
---|
1302 | if strMidl <> "" then exit for
|
---|
1303 | strMidl = CheckForMidlSub(str & "/win.x86/bin/Midl.exe")
|
---|
1304 | if strMidl <> "" then exit for
|
---|
1305 | next
|
---|
1306 | end if
|
---|
1307 |
|
---|
1308 | if strMidl = "" then
|
---|
1309 | PrintResultMsg "Midl.exe", "not found"
|
---|
1310 | else
|
---|
1311 | CfgPrintAssign "VBOX_MAIN_IDL", strMidl
|
---|
1312 | PrintResult "Midl.exe", strMidl
|
---|
1313 | end if
|
---|
1314 | end sub
|
---|
1315 |
|
---|
1316 | function CheckForMidlSub(strMidl)
|
---|
1317 | CheckForMidlSub = ""
|
---|
1318 | if strMidl <> "" then
|
---|
1319 | if LogFileExists1(strMidl) then
|
---|
1320 | CheckForMidlSub = UnixSlashes(PathAbs(strMidl))
|
---|
1321 | end if
|
---|
1322 | end if
|
---|
1323 | end function
|
---|
1324 |
|
---|
1325 |
|
---|
1326 | ''
|
---|
1327 | ' Locating yasm.exe
|
---|
1328 | '
|
---|
1329 | sub CheckForYasm(strOptYasm)
|
---|
1330 | dim strPathYasm, strVersion
|
---|
1331 | PrintHdr "yasm"
|
---|
1332 |
|
---|
1333 | strVersion = ""
|
---|
1334 | strPathYasm = CheckForYasmSub(strOptYasm, strVersion)
|
---|
1335 | if strPathYasm = "" then strPathYasm = CheckForYasmSub(PathStripFilename(strOptYasm), strVersion)
|
---|
1336 | if strPathYasm = "" and g_blnInternalFirst = true then
|
---|
1337 | strPathYasm = SearchHostTools("yasm", "v", GetRef("CheckForYasmSub"), strVersion)
|
---|
1338 | end if
|
---|
1339 | if strPathYasm = "" then strPathYasm = CheckForYasmSub(PathStripFilename(Which("yasm.exe")), strVersion)
|
---|
1340 | if strPathYasm = "" and g_blnInternalFirst = false then
|
---|
1341 | strPathYasm = SearchHostTools("yasm", "v", GetRef("CheckForYasmSub"), strVersion)
|
---|
1342 | end if
|
---|
1343 |
|
---|
1344 | if strPathYasm = "" then
|
---|
1345 | PrintResultMsg "yasm", "not found"
|
---|
1346 | MsgError "Unable to locate yasm!"
|
---|
1347 | else
|
---|
1348 | CfgPrintAssign "PATH_TOOL_YASM", strPathYasm
|
---|
1349 | PrintResult "yasm v" & strVersion, strPathYasm
|
---|
1350 | end if
|
---|
1351 | end sub
|
---|
1352 |
|
---|
1353 | function CheckForYasmSub(strPathYasm, ByRef strVersion)
|
---|
1354 | CheckForYasmSub = ""
|
---|
1355 | if strPathYasm <> "" then
|
---|
1356 | if LogFileExists(strPathYasm, "yasm.exe") then
|
---|
1357 | dim strOutput
|
---|
1358 | if Shell("""" & DosSlashes(strPathYasm & "\yasm.exe") & """ --version", True, strOutput) = 0 then
|
---|
1359 | dim strPreamble : strPreamble = "yasm"
|
---|
1360 | dim strVer : strVer = Trim(StrGetFirstLine(strOutput))
|
---|
1361 | if StrComp(Left(strVer, Len(strPreamble)), strPreamble, vbTextCompare) = 0 then
|
---|
1362 | strVersion = StrGetFirstWord(Trim(Mid(strVer, Len(strPreamble) + 1)))
|
---|
1363 | if StrVersionCompare(strVersion, "1.3.0") >= 0 and strVersion <> "" then
|
---|
1364 | LogPrint "Found yasm version: " & strVer
|
---|
1365 | CheckForYasmSub = UnixSlashes(PathAbs(strPathYasm))
|
---|
1366 | else
|
---|
1367 | LogPrint "yasm version is older than 1.3.0: " & strVersion
|
---|
1368 | end if
|
---|
1369 | else
|
---|
1370 | LogPrint "Not yasm: " & strVer
|
---|
1371 | end if
|
---|
1372 | end if
|
---|
1373 | end if
|
---|
1374 | end if
|
---|
1375 | end function
|
---|
1376 |
|
---|
1377 |
|
---|
1378 | ''
|
---|
1379 | ' Locating nasm.exe
|
---|
1380 | '
|
---|
1381 | sub CheckForNasm(strOptNasm)
|
---|
1382 | dim strPathNasm, strVersion
|
---|
1383 | PrintHdr "nasm"
|
---|
1384 |
|
---|
1385 | strPathNasm = CheckForNasmSub(strOptNasm, strVersion)
|
---|
1386 | if strPathNasm = "" then strPathNasm = CheckForNasmSub(PathStripFilename(strOptNasm), strVersion)
|
---|
1387 | if strPathNasm = "" and g_blnInternalFirst = true then
|
---|
1388 | strPathNasm = SearchHostTools("nasm", "v", GetRef("CheckForNasmSub"), strVersion)
|
---|
1389 | end if
|
---|
1390 | if strPathNasm = "" then strPathNasm = CheckForNasmSub(LogRegGetString("HKLM\SOFTWARE\nasm\"), strVersion)
|
---|
1391 | if strPathNasm = "" then strPathNasm = CheckForNasmSub(LogRegGetString("HKCU\SOFTWARE\nasm\"), strVersion)
|
---|
1392 | if strPathNasm = "" then
|
---|
1393 | for each strCandidate in CollectFromProgramItemLinks(GetRef("NasmProgramItemCallback"), strPathNasm)
|
---|
1394 | strPathNasm = CheckForNasmSub(strCandidate, strVersion)
|
---|
1395 | next
|
---|
1396 | end if
|
---|
1397 | if strPathNasm = "" then strPathNasm = CheckForNasmSub(PathStripFilename(Which("nasm.exe")), strVersion)
|
---|
1398 | if strPathNasm = "" and g_blnInternalFirst = false then
|
---|
1399 | strPathNasm = SearchHostTools("nasm", "v", GetRef("CheckForNasmSub"), strVersion)
|
---|
1400 | end if
|
---|
1401 |
|
---|
1402 | if strPathNasm = "" then
|
---|
1403 | PrintResultMsg "nasm", "not found"
|
---|
1404 | else
|
---|
1405 | CfgPrintAssign "PATH_TOOL_NASM", strPathNasm
|
---|
1406 | PrintResult "nasm v" & strVersion, strPathNasm
|
---|
1407 | end if
|
---|
1408 | end sub
|
---|
1409 |
|
---|
1410 | function NasmProgramItemCallback(ByRef arrStrings, cStrings, ByRef strUnused)
|
---|
1411 | dim str, off
|
---|
1412 | NasmProgramItemCallback = ""
|
---|
1413 | if cStrings > 1 then
|
---|
1414 | str = arrStrings(1)
|
---|
1415 | off = InStr(1, str, "\nasm.exe", vbTextCompare)
|
---|
1416 | if off > 0 then
|
---|
1417 | NasmProgramItemCallback = Left(str, off - 1)
|
---|
1418 | end if
|
---|
1419 | end if
|
---|
1420 | end function
|
---|
1421 |
|
---|
1422 | function CheckForNasmSub(strPathNasm, ByRef strVersion)
|
---|
1423 | CheckForNasmSub = ""
|
---|
1424 | if strPathNasm <> "" then
|
---|
1425 | if LogFileExists(strPathNasm, "nasm.exe") then
|
---|
1426 | dim strOutput
|
---|
1427 | if Shell("""" & DosSlashes(strPathNasm & "\nasm.exe") & """ -version", True, strOutput) = 0 then
|
---|
1428 | dim strPreamble : strPreamble = "NASM version"
|
---|
1429 | dim strVer : strVer = Trim(StrGetFirstLine(strOutput))
|
---|
1430 | if StrComp(Left(strVer, Len(strPreamble)), strPreamble, vbTextCompare) = 0 then
|
---|
1431 | strVersion = StrGetFirstWord(Trim(Mid(strVer, Len(strPreamble) + 1)))
|
---|
1432 | if StrVersionCompare(strVersion, "2.12.0") >= 0 and strVersion <> "" then
|
---|
1433 | LogPrint "Found nasm version: " & strVersion
|
---|
1434 | CheckForNasmSub = UnixSlashes(PathAbs(strPathNasm))
|
---|
1435 | else
|
---|
1436 | LogPrint "nasm version is older than 2.12.0: " & strVersion
|
---|
1437 | end if
|
---|
1438 | else
|
---|
1439 | LogPrint "Not nasm: " & strVer
|
---|
1440 | end if
|
---|
1441 | end if
|
---|
1442 | end if
|
---|
1443 | end if
|
---|
1444 | end function
|
---|
1445 |
|
---|
1446 |
|
---|
1447 | ''
|
---|
1448 | ' Locating OpenWatcom 1.9
|
---|
1449 | '
|
---|
1450 | sub CheckForOpenWatcom(strOptOpenWatcom)
|
---|
1451 | dim strPathOW, strCandidate, strVersion
|
---|
1452 | PrintHdr "OpenWatcom"
|
---|
1453 |
|
---|
1454 | strPathOW = CheckForOpenWatcomSub(strOptOpenWatcom, strVersion)
|
---|
1455 | if strPathOW = "" and g_blnInternalFirst = true then
|
---|
1456 | strPathOW = SearchCommonTools("openwatcom", "v", GetRef("CheckForOpenWatcomSub"), strVersion)
|
---|
1457 | end if
|
---|
1458 | if strPathOW = "" then
|
---|
1459 | for each strCandidate in CollectFromProgramItemLinks(GetRef("OpenWatcomProgramItemCallback"), strPathOW)
|
---|
1460 | if strPathOW = "" then strPathOW = CheckForOpenWatcomSub(strCandidate, strVersion)
|
---|
1461 | next
|
---|
1462 | end if
|
---|
1463 | if strPathOW = "" then strPathOW = CheckForOpenWatcomSub(EnvGet("WATCOM"), strVersion)
|
---|
1464 | if strPathOW = "" then strPathOW = CheckForOpenWatcomSub(PathParent(PathStripFilename(Which("wcc386.exe"))), strVersion)
|
---|
1465 | if strPathOW = "" and g_blnInternalFirst = false then
|
---|
1466 | strPathOW = SearchCommonTools("openwatcom", "v", GetRef("CheckForOpenWatcomSub"), strVersion)
|
---|
1467 | end if
|
---|
1468 |
|
---|
1469 | if strPathOW = "" then
|
---|
1470 | PrintResultMsg "OpenWatcom", "not found"
|
---|
1471 | CfgPrintAssign "VBOX_WITH_OPEN_WATCOM", ""
|
---|
1472 | exit sub
|
---|
1473 | end if
|
---|
1474 |
|
---|
1475 | CfgPrintAssign "VBOX_WITH_OPEN_WATCOM", "1"
|
---|
1476 | CfgPrintAssign "PATH_TOOL_OPENWATCOM", strPathOW
|
---|
1477 | PrintResult "OpenWatcom v" & strVersion, strPathOW
|
---|
1478 | if StrVersionCompare(strVersion, "2.0") >= 0 then
|
---|
1479 | MsgWarning "We only test building with OpenWatcom 1.9."
|
---|
1480 | end if
|
---|
1481 | end sub
|
---|
1482 |
|
---|
1483 | function OpenWatcomProgramItemCallback(ByRef arrStrings, cStrings, ByRef strUnused)
|
---|
1484 | dim str, off
|
---|
1485 | OpenWatcomProgramItemCallback = ""
|
---|
1486 | if cStrings > 1 then
|
---|
1487 | str = arrStrings(1)
|
---|
1488 | off = InStr(1, str, "\binnt\", vbTextCompare)
|
---|
1489 | if off > 0 then
|
---|
1490 | OpenWatcomProgramItemCallback = Left(str, off - 1)
|
---|
1491 | end if
|
---|
1492 | end if
|
---|
1493 | end function
|
---|
1494 |
|
---|
1495 | function CheckForOpenWatcomSub(strPathOW, ByRef strVersion)
|
---|
1496 | CheckForOpenWatcomSub = ""
|
---|
1497 | if strPathOW <> "" then
|
---|
1498 | LogPrint "Trying: " & strPathOW
|
---|
1499 | if LogDirExists(strPathOW) then
|
---|
1500 | if LogDirExists(strPathOW & "/binnt") _
|
---|
1501 | and LogDirExists(strPathOW & "/h") _
|
---|
1502 | and LogDirExists(strPathOW & "/eddat") _
|
---|
1503 | and LogFileExists(strPathOW, "binnt/wcc386.exe") _
|
---|
1504 | and LogFileExists(strPathOW, "binnt/wcc.exe") _
|
---|
1505 | and LogFileExists(strPathOW, "binnt/wlink.exe") _
|
---|
1506 | and LogFileExists(strPathOW, "binnt/wcl386.exe") _
|
---|
1507 | and LogFileExists(strPathOW, "binnt/wcl.exe") _
|
---|
1508 | and LogFileExists(strPathOW, "binnt/wlib.exe") _
|
---|
1509 | and LogFileExists(strPathOW, "binnt/wasm.exe") _
|
---|
1510 | and LogFileExists(strPathOW, "h/stdarg.h") _
|
---|
1511 | then
|
---|
1512 | ' Some wcl/wcl386 option parsing quirk allows us to specify /whatever
|
---|
1513 | ' and just get the logo text and exit code 0. We use /y as it's a valid option.
|
---|
1514 | dim strOutput
|
---|
1515 | if Shell("""" & DosSlashes(strPathOW & "\binnt\wcl.exe") & """ /y", True, strOutput) = 0 then
|
---|
1516 | dim strPreamble : strPreamble = "Open Watcom C/C++16 Compile and Link Utility Version"
|
---|
1517 | strOutput = StrGetFirstLine(strOutput)
|
---|
1518 | if StrStartsWithI(strOutput, strPreamble) then
|
---|
1519 | strVersion = StrGetFirstWord(Trim(Mid(strOutput, Len(strPreamble) + 1)))
|
---|
1520 | if StrVersionCompare(strVersion, "1.9") >= 0 then
|
---|
1521 | CheckForOpenWatcomSub = UnixSlashes(PathAbs(strPathOW))
|
---|
1522 | else
|
---|
1523 | LogPrint "OpenWatcom version id older than 1.9: " & strVersion
|
---|
1524 | end if
|
---|
1525 | else
|
---|
1526 | LogPrint "Not OpenWatcom: " & strOutput
|
---|
1527 | end if
|
---|
1528 | end if
|
---|
1529 | end if
|
---|
1530 | end if
|
---|
1531 | end if
|
---|
1532 | end function
|
---|
1533 |
|
---|
1534 |
|
---|
1535 | ''
|
---|
1536 | ' Checks for any libSDL binaries.
|
---|
1537 | '
|
---|
1538 | sub CheckForlibSDL(strOptlibSDL)
|
---|
1539 | dim strPathLibSDL, strVersion
|
---|
1540 | PrintHdr "libSDL"
|
---|
1541 |
|
---|
1542 | '
|
---|
1543 | ' Try find some SDL library.
|
---|
1544 | '
|
---|
1545 | strPathLibSDL = CheckForLibSDLSub(strOptlibSDL, strVersion)
|
---|
1546 | if strPathlibSDL = "" and g_blnInternalFirst = true then
|
---|
1547 | strPathLibSDL = SearchTargetTools("libsdl", "v", GetRef("CheckForLibSDLSub"), strVersion)
|
---|
1548 | end if
|
---|
1549 |
|
---|
1550 | ' Poke about in the LIB and PATH env.vars.
|
---|
1551 | if strPathlibSDL = "" then strPathLibSDL = CheckForlibSDLSub(PathParent(PathStripFilename(WhichEx("LIB", "SDLmain.lib"))), strVersion)
|
---|
1552 | if strPathlibSDL = "" then strPathLibSDL = CheckForlibSDLSub(PathParent(PathStripFilename(Which("..\lib\SDLmain.lib"))), strVersion)
|
---|
1553 | if strPathlibSDL = "" then strPathLibSDL = CheckForlibSDLSub(PathParent(PathStripFilename(Which("SDLmain.lib"))), strVersion)
|
---|
1554 | if strPathlibSDL = "" then strPathLibSDL = CheckForlibSDLSub(PathParent(PathStripFilename(Which("SDL.dll"))), strVersion)
|
---|
1555 |
|
---|
1556 | ' The tools again.
|
---|
1557 | if strPathlibSDL = "" and g_blnInternalFirst = false then
|
---|
1558 | strPathLibSDL = SearchTargetTools("libsdl", "v", GetRef("CheckForLibSDLSub"), strVersion)
|
---|
1559 | end if
|
---|
1560 |
|
---|
1561 | ' Success?
|
---|
1562 | if strPathlibSDL = "" then
|
---|
1563 | if strOptlibSDL = "" then
|
---|
1564 | MsgError "Can't locate libSDL. Try specify the path with the --with-libSDL=<path> argument. " _
|
---|
1565 | & "If still no luck, consult the configure.log and the build requirements."
|
---|
1566 | else
|
---|
1567 | MsgError "Can't locate libSDL. Please consult the configure.log and the build requirements."
|
---|
1568 | end if
|
---|
1569 | exit sub
|
---|
1570 | end if
|
---|
1571 |
|
---|
1572 | strPathLibSDL = UnixSlashes(PathAbs(strPathLibSDL))
|
---|
1573 | CfgPrintAssign "PATH_SDK_LIBSDL", strPathlibSDL
|
---|
1574 |
|
---|
1575 | PrintResult "libSDL", strPathlibSDL
|
---|
1576 | end sub
|
---|
1577 |
|
---|
1578 | '' Checks if the specified path points to an usable libSDL or not.
|
---|
1579 | function CheckForLibSDLSub(strPathlibSDL, strVersion)
|
---|
1580 | CheckForlibSDLSub = ""
|
---|
1581 | if strPathLibSDL <> "" then
|
---|
1582 | LogPrint "Trying: strPathLibSDL=" & strPathLibSDL
|
---|
1583 | if LogFileExists(strPathLibSDL, "lib/SDL.lib") _
|
---|
1584 | and LogFileExists(strPathLibSDL, "lib/SDLmain.lib") _
|
---|
1585 | and LogFileExists(strPathLibSDL, "lib/SDL.dll") _
|
---|
1586 | then
|
---|
1587 | dim strIncSub : strIncSub = "include"
|
---|
1588 | if DirExists(strPathlibSDL & "/include/SDL") then strIncSub = "include/SDL"
|
---|
1589 | if LogFileExists(strPathLibSDL, strIncSub & "/SDL.h") _
|
---|
1590 | and LogFileExists(strPathLibSDL, strIncSub & "/SDL_syswm.h") _
|
---|
1591 | and LogFileExists(strPathLibSDL, strIncSub & "/SDL_version.h") _
|
---|
1592 | then
|
---|
1593 | strVersion = ""
|
---|
1594 | CheckForLibSDLSub = strPathLibSDL
|
---|
1595 | end if
|
---|
1596 | end if
|
---|
1597 | end if
|
---|
1598 | end function
|
---|
1599 |
|
---|
1600 |
|
---|
1601 | ''
|
---|
1602 | ' Checks for libxml2.
|
---|
1603 | '
|
---|
1604 | sub CheckForXml2(strOptXml2)
|
---|
1605 | dim strPathXml2, str
|
---|
1606 | PrintHdr "libxml2"
|
---|
1607 |
|
---|
1608 | '
|
---|
1609 | ' Part of tarball / svn, so we can exit immediately if no path was specified.
|
---|
1610 | '
|
---|
1611 | if (strOptXml2 = "") then
|
---|
1612 | PrintResultMsg "libxml2", "src/lib/libxml2-*"
|
---|
1613 | exit sub
|
---|
1614 | end if
|
---|
1615 |
|
---|
1616 | ' Skip if no COM/ATL.
|
---|
1617 | if g_blnDisableCOM then
|
---|
1618 | PrintResultMsg "libxml2", "Skipped (" & g_strDisableCOM & ")"
|
---|
1619 | exit sub
|
---|
1620 | end if
|
---|
1621 |
|
---|
1622 | '
|
---|
1623 | ' Try find some xml2 dll/lib.
|
---|
1624 | '
|
---|
1625 | strPathXml2 = ""
|
---|
1626 | if (strPathXml2 = "") And (strOptXml2 <> "") then
|
---|
1627 | if CheckForXml2Sub(strOptXml2) then strPathXml2 = strOptXml2
|
---|
1628 | end if
|
---|
1629 |
|
---|
1630 | if strPathXml2 = "" then
|
---|
1631 | str = Which("libxml2.lib")
|
---|
1632 | if str <> "" then
|
---|
1633 | str = PathParent(PathStripFilename(str))
|
---|
1634 | if CheckForXml2Sub(str) then strPathXml2 = str
|
---|
1635 | end if
|
---|
1636 | end if
|
---|
1637 |
|
---|
1638 | ' Success?
|
---|
1639 | if strPathXml2 = "" then
|
---|
1640 | if strOptXml2 = "" then
|
---|
1641 | MsgError "Can't locate libxml2. Try specify the path with the --with-libxml2=<path> argument. " _
|
---|
1642 | & "If still no luck, consult the configure.log and the build requirements."
|
---|
1643 | else
|
---|
1644 | MsgError "Can't locate libxml2. Please consult the configure.log and the build requirements."
|
---|
1645 | end if
|
---|
1646 | exit sub
|
---|
1647 | end if
|
---|
1648 |
|
---|
1649 | strPathXml2 = UnixSlashes(PathAbs(strPathXml2))
|
---|
1650 | CfgPrintAssign "SDK_VBOX_LIBXML2_DEFS", "_REENTRANT"
|
---|
1651 | CfgPrintAssign "SDK_VBOX_LIBXML2_INCS", strPathXml2 & "/include"
|
---|
1652 | CfgPrintAssign "SDK_VBOX_LIBXML2_LIBS", strPathXml2 & "/lib/libxml2.lib"
|
---|
1653 |
|
---|
1654 | PrintResult "libxml2", strPathXml2
|
---|
1655 | end sub
|
---|
1656 |
|
---|
1657 | '' Checks if the specified path points to an usable libxml2 or not.
|
---|
1658 | function CheckForXml2Sub(strPathXml2)
|
---|
1659 | dim str
|
---|
1660 |
|
---|
1661 | CheckForXml2Sub = False
|
---|
1662 | LogPrint "trying: strPathXml2=" & strPathXml2
|
---|
1663 | if LogFileExists(strPathXml2, "include/libxml/xmlexports.h") _
|
---|
1664 | And LogFileExists(strPathXml2, "include/libxml/xmlreader.h") _
|
---|
1665 | then
|
---|
1666 | str = LogFindFile(strPathXml2, "bin/libxml2.dll")
|
---|
1667 | if str <> "" then
|
---|
1668 | if LogFindFile(strPathXml2, "lib/libxml2.lib") <> "" then
|
---|
1669 | CheckForXml2Sub = True
|
---|
1670 | end if
|
---|
1671 | end if
|
---|
1672 | end if
|
---|
1673 | end function
|
---|
1674 |
|
---|
1675 |
|
---|
1676 | '' Checks for openssl
|
---|
1677 | sub CheckForSsl(strOptSsl, bln32Bit)
|
---|
1678 | dim strPathSsl, str
|
---|
1679 | PrintHdr "openssl"
|
---|
1680 |
|
---|
1681 | strOpenssl = "openssl"
|
---|
1682 | if bln32Bit = True then
|
---|
1683 | strOpenssl = "openssl32"
|
---|
1684 | end if
|
---|
1685 |
|
---|
1686 | '
|
---|
1687 | ' Part of tarball / svn, so we can exit immediately if no path was specified.
|
---|
1688 | '
|
---|
1689 | if (strOptSsl = "") then
|
---|
1690 | PrintResult strOpenssl, "src/libs/openssl-*"
|
---|
1691 | exit sub
|
---|
1692 | end if
|
---|
1693 |
|
---|
1694 | '
|
---|
1695 | ' Try find some openssl dll/lib.
|
---|
1696 | '
|
---|
1697 | strPathSsl = ""
|
---|
1698 | if (strPathSsl = "") And (strOptSsl <> "") then
|
---|
1699 | if CheckForSslSub(strOptSsl) then strPathSsl = strOptSsl
|
---|
1700 | end if
|
---|
1701 |
|
---|
1702 | if strPathSsl = "" then
|
---|
1703 | str = Which("libssl.lib")
|
---|
1704 | if str <> "" then
|
---|
1705 | str = PathParent(PathStripFilename(str))
|
---|
1706 | if CheckForSslSub(str) then strPathSsl = str
|
---|
1707 | end if
|
---|
1708 | end if
|
---|
1709 |
|
---|
1710 | ' Success?
|
---|
1711 | if strPathSsl = "" then
|
---|
1712 | if strOptSsl = "" then
|
---|
1713 | MsgError "Can't locate " & strOpenssl & ". " _
|
---|
1714 | & "Try specify the path with the --with-" & strOpenssl & "=<path> argument. " _
|
---|
1715 | & "If still no luck, consult the configure.log and the build requirements."
|
---|
1716 | else
|
---|
1717 | MsgError "Can't locate " & strOpenssl & ". " _
|
---|
1718 | & "Please consult the configure.log and the build requirements."
|
---|
1719 | end if
|
---|
1720 | exit sub
|
---|
1721 | end if
|
---|
1722 |
|
---|
1723 | strPathSsl = UnixSlashes(PathAbs(strPathSsl))
|
---|
1724 | if bln32Bit = True then
|
---|
1725 | CfgPrintAssign "SDK_VBOX_OPENSSL-x86_INCS", strPathSsl & "/include"
|
---|
1726 | CfgPrintAssign "SDK_VBOX_OPENSSL-x86_LIBS", strPathSsl & "/lib/libcrypto.lib" & " " & strPathSsl & "/lib/libssl.lib"
|
---|
1727 | CfgPrintAssign "SDK_VBOX_BLD_OPENSSL-x86_LIBS", strPathSsl & "/lib/libcrypto.lib" & " " & strPathSsl & "/lib/libssl.lib"
|
---|
1728 | else
|
---|
1729 | CfgPrintAssign "SDK_VBOX_OPENSSL_INCS", strPathSsl & "/include"
|
---|
1730 | CfgPrintAssign "SDK_VBOX_OPENSSL_LIBS", strPathSsl & "/lib/libcrypto.lib" & " " & strPathSsl & "/lib/libssl.lib"
|
---|
1731 | CfgPrintAssign "SDK_VBOX_BLD_OPENSSL_LIBS", strPathSsl & "/lib/libcrypto.lib" & " " & strPathSsl & "/lib/libssl.lib"
|
---|
1732 | end if
|
---|
1733 |
|
---|
1734 | PrintResult strOpenssl, strPathSsl
|
---|
1735 | end sub
|
---|
1736 |
|
---|
1737 | '' Checks if the specified path points to an usable openssl or not.
|
---|
1738 | function CheckForSslSub(strPathSsl)
|
---|
1739 |
|
---|
1740 | CheckForSslSub = False
|
---|
1741 | LogPrint "trying: strPathSsl=" & strPathSsl
|
---|
1742 | if LogFileExists(strPathSsl, "include/openssl/md5.h") _
|
---|
1743 | And LogFindFile(strPathSsl, "lib/libssl.lib") <> "" _
|
---|
1744 | then
|
---|
1745 | CheckForSslSub = True
|
---|
1746 | end if
|
---|
1747 | end function
|
---|
1748 |
|
---|
1749 |
|
---|
1750 | ''
|
---|
1751 | ' Checks for libcurl
|
---|
1752 | '
|
---|
1753 | sub CheckForCurl(strOptCurl, bln32Bit)
|
---|
1754 | dim strPathCurl, str
|
---|
1755 | PrintHdr "libcurl"
|
---|
1756 |
|
---|
1757 | strCurl = "libcurl"
|
---|
1758 | if bln32Bit = True then
|
---|
1759 | strCurl = "libcurl32"
|
---|
1760 | end if
|
---|
1761 |
|
---|
1762 | '
|
---|
1763 | ' Part of tarball / svn, so we can exit immediately if no path was specified.
|
---|
1764 | '
|
---|
1765 | if (strOptCurl = "") then
|
---|
1766 | PrintResult strCurl, "src/libs/curl-*"
|
---|
1767 | exit sub
|
---|
1768 | end if
|
---|
1769 |
|
---|
1770 | '
|
---|
1771 | ' Try find some cURL dll/lib.
|
---|
1772 | '
|
---|
1773 | strPathCurl = ""
|
---|
1774 | if (strPathCurl = "") And (strOptCurl <> "") then
|
---|
1775 | if CheckForCurlSub(strOptCurl) then strPathCurl = strOptCurl
|
---|
1776 | end if
|
---|
1777 |
|
---|
1778 | if strPathCurl = "" then
|
---|
1779 | str = Which("libcurl.lib")
|
---|
1780 | if str <> "" then
|
---|
1781 | str = PathParent(PathStripFilename(str))
|
---|
1782 | if CheckForCurlSub(str) then strPathCurl = str
|
---|
1783 | end if
|
---|
1784 | end if
|
---|
1785 |
|
---|
1786 | ' Success?
|
---|
1787 | if strPathCurl = "" then
|
---|
1788 | if strOptCurl = "" then
|
---|
1789 | MsgError "Can't locate " & strCurl & ". " _
|
---|
1790 | & "Try specify the path with the --with-" & strCurl & "=<path> argument. " _
|
---|
1791 | & "If still no luck, consult the configure.log and the build requirements."
|
---|
1792 | else
|
---|
1793 | MsgError "Can't locate " & strCurl & ". " _
|
---|
1794 | & "Please consult the configure.log and the build requirements."
|
---|
1795 | end if
|
---|
1796 | exit sub
|
---|
1797 | end if
|
---|
1798 |
|
---|
1799 | strPathCurl = UnixSlashes(PathAbs(strPathCurl))
|
---|
1800 | if bln32Bit = True then
|
---|
1801 | CfgPrintAssign "SDK_VBOX_LIBCURL-x86_INCS", strPathCurl & "/include"
|
---|
1802 | CfgPrintAssign "SDK_VBOX_LIBCURL-x86_LIBS.x86", strPathCurl & "/libcurl.lib"
|
---|
1803 | else
|
---|
1804 | CfgPrintAssign "SDK_VBOX_LIBCURL_INCS", strPathCurl & "/include"
|
---|
1805 | CfgPrintAssign "SDK_VBOX_LIBCURL_LIBS", strPathCurl & "/libcurl.lib"
|
---|
1806 | end if
|
---|
1807 |
|
---|
1808 | PrintResult strCurl, strPathCurl
|
---|
1809 | end sub
|
---|
1810 |
|
---|
1811 | '' Checks if the specified path points to an usable libcurl or not.
|
---|
1812 | function CheckForCurlSub(strPathCurl)
|
---|
1813 |
|
---|
1814 | CheckForCurlSub = False
|
---|
1815 | LogPrint "trying: strPathCurl=" & strPathCurl
|
---|
1816 | if LogFileExists(strPathCurl, "include/curl/curl.h") _
|
---|
1817 | And LogFindFile(strPathCurl, "libcurl.dll") <> "" _
|
---|
1818 | And LogFindFile(strPathCurl, "libcurl.lib") <> "" _
|
---|
1819 | then
|
---|
1820 | CheckForCurlSub = True
|
---|
1821 | end if
|
---|
1822 | end function
|
---|
1823 |
|
---|
1824 |
|
---|
1825 | ''
|
---|
1826 | ' Checks for any Qt5 binaries.
|
---|
1827 | '
|
---|
1828 | sub CheckForQt(strOptQt5, strOptInfix)
|
---|
1829 | dim strPathQt5, strInfixQt5, arrFolders, arrVccInfixes, strVccInfix, strPathDev
|
---|
1830 | PrintHdr "Qt5"
|
---|
1831 |
|
---|
1832 | '
|
---|
1833 | ' Try to find the Qt5 installation (user specified path with --with-qt5)
|
---|
1834 | '
|
---|
1835 | LogPrint "Checking for user specified path of Qt5 ... "
|
---|
1836 | strPathQt5 = CheckForQt5Sub(UnixSlashes(strOptQt5), strOptInfix, strInfixQt5)
|
---|
1837 | if strPathQt5 = "" and g_blnInternalFirst = true then strPathQt5 = CheckForQt5Internal(strOptInfix, strInfixQt5)
|
---|
1838 | if strPathQt5 = "" then
|
---|
1839 | '
|
---|
1840 | ' Collect links from "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\UFH\SHC"
|
---|
1841 | '
|
---|
1842 | ' Typical string list:
|
---|
1843 | ' C:\Users\someuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Qt\5.x.y\MSVC 20zz (64-bit)\Qt 5.x.y (MSVC 20zz 64-bit).lnk
|
---|
1844 | ' C:\Windows\System32\cmd.exe
|
---|
1845 | ' /A /Q /K E:\qt\installed\5.x.y\msvc20zz_64\bin\qtenv2.bat
|
---|
1846 | '
|
---|
1847 | dim arrCandidates, strCandidate
|
---|
1848 | arrCandidates = CollectFromProgramItemLinks(GetRef("Qt5ProgramItemCallback"), strPathQt5)
|
---|
1849 | LogPrint "Testing qtenv2.bat links (" & ArraySize(arrCandidates) & ") ..."
|
---|
1850 |
|
---|
1851 | ' VC infixes/subdir names to consider (ASSUMES 64bit)
|
---|
1852 | if g_strVCCVersion = "VCC142" or g_strVCCVersion = "" then
|
---|
1853 | arrVccInfixes = Array("msvc2019_64", "msvc2017_64", "msvc2015_64")
|
---|
1854 | elseif g_strVCCVersion = "VCC141" then
|
---|
1855 | arrVccInfixes = Array("msvc2017_64", "msvc2015_64", "msvc2019_64")
|
---|
1856 | elseif g_strVCCVersion = "VCC140" then
|
---|
1857 | arrVccInfixes = Array("msvc2015_64", "msvc2017_64", "msvc2019_64")
|
---|
1858 | elseif g_strVCCVersion = "VCC120" then
|
---|
1859 | arrVccInfixes = Array("msvc2013_64")
|
---|
1860 | elseif g_strVCCVersion = "VCC110" then
|
---|
1861 | arrVccInfixes = Array("msvc2012_64")
|
---|
1862 | elseif g_strVCCVersion = "VCC100" then
|
---|
1863 | arrVccInfixes = Array("msvc2010_64")
|
---|
1864 | else
|
---|
1865 | MsgFatal "Unexpected VC version: " & g_strVCCVersion
|
---|
1866 | arrVccInfixes = Array()
|
---|
1867 | end if
|
---|
1868 | for each strVccInfix in arrVccInfixes
|
---|
1869 | for each strCandidate in arrCandidates
|
---|
1870 | if InStr(1, LCase(strCandidate), strVccInfix) > 0 then
|
---|
1871 | strPathQt5 = CheckForQt5Sub(strCandidate, strOptInfix, strInfixQt5)
|
---|
1872 | if strPathQt5 <> "" then exit for
|
---|
1873 | end if
|
---|
1874 | next
|
---|
1875 | if strPathQt5 <> "" then exit for
|
---|
1876 | next
|
---|
1877 | end if
|
---|
1878 |
|
---|
1879 | ' Check the dev tools - prefer ones matching the compiler.
|
---|
1880 | if strPathQt5 = "" and g_blnInternalFirst = false then strPathQt5 = CheckForQt5Internal(strOptInfix, strInfixQt5)
|
---|
1881 |
|
---|
1882 | '
|
---|
1883 | ' Display the result and output the config.
|
---|
1884 | '
|
---|
1885 | if strPathQt5 <> "" then
|
---|
1886 | PrintResult "Qt5", strPathQt5
|
---|
1887 | PrintResultMsg "Qt5 infix", strInfixQt5
|
---|
1888 | CfgPrintAssign "PATH_SDK_QT5", strPathQt5
|
---|
1889 | CfgPrintAssign "PATH_TOOL_QT5", "$(PATH_SDK_QT5)"
|
---|
1890 | CfgPrintAssign "VBOX_PATH_QT", "$(PATH_SDK_QT5)"
|
---|
1891 | CfgPrintAssign "VBOX_QT_INFIX", strInfixQt5
|
---|
1892 | CfgPrintAssign "VBOX_WITH_QT_PAYLOAD", "1"
|
---|
1893 | else
|
---|
1894 | PrintResultMsg "Qt5", "not found"
|
---|
1895 | CfgPrintAssign "VBOX_WITH_QTGUI", ""
|
---|
1896 | end if
|
---|
1897 | end sub
|
---|
1898 |
|
---|
1899 | function CheckForQt5Internal(strOptInfix, ByRef strInfixQt5)
|
---|
1900 | dim strPathDev, arrFolders, arrVccInfixes, strVccInfix, i
|
---|
1901 | CheckForQt5Internal = ""
|
---|
1902 | for each strPathDev in g_arrPathDev
|
---|
1903 | LogPrint "Testing tools dir (" & strPathDev & "/win." & g_strTargetArch & "/qt/v5*) ..."
|
---|
1904 | arrFolders = GetSubdirsStartingWithVerSorted(strPathDev & "/win." & g_strTargetArch & "/qt", "v5")
|
---|
1905 | arrVccInfixes = Array(LCase(g_strVCCVersion), Left(LCase(g_strVCCVersion), Len(g_strVCCVersion) - 1), "")
|
---|
1906 | for each strVccInfix in arrVccInfixes
|
---|
1907 | for i = UBound(arrFolders) to LBound(arrFolders) step -1
|
---|
1908 | if strVccInfix = "" or InStr(1, LCase(arrFolders(i)), strVccInfix) > 0 then
|
---|
1909 | LogPrint "i="&i&" strVccInfix="&strVccInfix
|
---|
1910 | strPathQt5 = CheckForQt5Sub(strPathDev & "/win." & g_strTargetArch & "/qt/" & arrFolders(i), strOptInfix, strInfixQt5)
|
---|
1911 | if strPathQt5 <> "" then
|
---|
1912 | CheckForQt5Internal = strPathQt5
|
---|
1913 | exit function
|
---|
1914 | end if
|
---|
1915 | end if
|
---|
1916 | next
|
---|
1917 | next
|
---|
1918 | next
|
---|
1919 | end function
|
---|
1920 |
|
---|
1921 | function Qt5ProgramItemCallback(ByRef arrStrings, cStrings, ByRef strUnused)
|
---|
1922 | dim str, off
|
---|
1923 | Qt5ProgramItemCallback = ""
|
---|
1924 | if cStrings >= 3 then
|
---|
1925 | str = Trim(arrStrings(UBound(arrStrings)))
|
---|
1926 | if LCase(Right(str, Len("\bin\qtenv2.bat"))) = "\bin\qtenv2.bat" _
|
---|
1927 | and InStr(1, LCase(str), "\msvc20") > 0 _
|
---|
1928 | and InStr(1, str, ":") > 0 _
|
---|
1929 | then
|
---|
1930 | off = InStr(1, str, ":") - 1
|
---|
1931 | Qt5ProgramItemCallback = Mid(str, off, Len(str) - off - Len("\bin\qtenv2.bat") + 1)
|
---|
1932 | end if
|
---|
1933 | end if
|
---|
1934 | end function
|
---|
1935 |
|
---|
1936 | function CheckForQt5Sub(strPathQt5, strOptInfix, ByRef strInfixQt5)
|
---|
1937 | CheckForQt5Sub = ""
|
---|
1938 | if strPathQt5 <> "" then
|
---|
1939 | LogPrint "Trying: strPathQt5=" & strPathQt5
|
---|
1940 |
|
---|
1941 | if LogFileExists(strPathQt5, "bin/moc.exe") _
|
---|
1942 | and LogFileExists(strPathQt5, "bin/uic.exe") _
|
---|
1943 | and LogFileExists(strPathQt5, "include/QtWidgets/qwidget.h") _
|
---|
1944 | and LogFileExists(strPathQt5, "include/QtWidgets/QApplication") _
|
---|
1945 | and LogFileExists(strPathQt5, "include/QtGui/QImage") _
|
---|
1946 | and LogFileExists(strPathQt5, "include/QtNetwork/QHostAddress") _
|
---|
1947 | then
|
---|
1948 | ' Infix testing.
|
---|
1949 | if LogFileExists(strPathQt5, "lib/Qt5Core.lib") _
|
---|
1950 | and LogFileExists(strPathQt5, "lib/Qt5Network.lib") then
|
---|
1951 | LogPrint "found it w/o infix"
|
---|
1952 | strInfixQt5 = ""
|
---|
1953 | CheckForQt5Sub = UnixSlashes(PathAbs(strPathQt5))
|
---|
1954 | elseif LogFileExists(strPathQt5, "lib/Qt5Core" & strOptInfix & ".lib") _
|
---|
1955 | and LogFileExists(strPathQt5, "lib/Qt5Network" & strOptInfix & ".lib") then
|
---|
1956 | LogPrint "found it w/ infix: " & strOptInfix & " (option)"
|
---|
1957 | strInfixQt5 = strOptInfix
|
---|
1958 | CheckForQt5Sub = UnixSlashes(PathAbs(strPathQt5))
|
---|
1959 | elseif LogFileExists(strPathQt5, "lib/Qt5CoreVBox.lib") _
|
---|
1960 | and LogFileExists(strPathQt5, "lib/Qt5NetworkVBox.lib") then
|
---|
1961 | LogPrint "found it w/ infix: VBox"
|
---|
1962 | strInfixQt5 = "VBox"
|
---|
1963 | CheckForQt5Sub = UnixSlashes(PathAbs(strPathQt5))
|
---|
1964 | end if
|
---|
1965 | end if
|
---|
1966 | end if
|
---|
1967 | end function
|
---|
1968 |
|
---|
1969 |
|
---|
1970 | ''
|
---|
1971 | ' Checks for python.
|
---|
1972 | '
|
---|
1973 | function CheckForPython(strOptPython)
|
---|
1974 | dim strPathPython, arrVersions, strVer, str
|
---|
1975 | PrintHdr "Python"
|
---|
1976 | CheckForPython = False
|
---|
1977 |
|
---|
1978 | '
|
---|
1979 | ' Locate it.
|
---|
1980 | '
|
---|
1981 | strPathPython = CheckForPythonSub(strOptPython)
|
---|
1982 | if strPathPython = "" then
|
---|
1983 | arrVersions = Array("3.12", "3.11", "3.10", "3.9", "3.8", "3.7", "3.6", "3.5", "2.7")
|
---|
1984 | for each strVer in arrVersions
|
---|
1985 | strPathPython = CheckForPythonSub(LogRegGetString("HKLM\SOFTWARE\Python\PythonCore\" & strVer & "\InstallPath\"))
|
---|
1986 | if strPathPython <> "" then exit for
|
---|
1987 | next
|
---|
1988 | end if
|
---|
1989 | if strPathPython = "" then strPathPython = CheckForPythonSub(PathStripFilename(Which("python.exe")))
|
---|
1990 |
|
---|
1991 | '
|
---|
1992 | ' Output config & result.
|
---|
1993 | '
|
---|
1994 | CheckForPython = strPathPython <> ""
|
---|
1995 | if CheckForPython then
|
---|
1996 | CfgPrintAssign "VBOX_BLD_PYTHON", strPathPython
|
---|
1997 | PrintResult "Python", strPathPython
|
---|
1998 | else
|
---|
1999 | PrintResultMsg "Python", "not found"
|
---|
2000 | end if
|
---|
2001 | end function
|
---|
2002 |
|
---|
2003 | function CheckForPythonSub(strPathPython)
|
---|
2004 | CheckForPythonSub = ""
|
---|
2005 | if strPathPython <> "" then
|
---|
2006 | if LogFileExists(strPathPython, "python.exe") _
|
---|
2007 | and LogDirExists(strPathPython & "/DLLs") _
|
---|
2008 | then
|
---|
2009 | CheckForPythonSub = UnixSlashes(PathAbs(strPathPython & "/python.exe"))
|
---|
2010 | end if
|
---|
2011 | end if
|
---|
2012 | end function
|
---|
2013 |
|
---|
2014 |
|
---|
2015 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
2016 | ' Main function and usage '
|
---|
2017 | ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
---|
2018 |
|
---|
2019 | ''
|
---|
2020 | ' Show usage.
|
---|
2021 | '
|
---|
2022 | sub usage
|
---|
2023 | Print "Usage: cscript configure.vbs [options]"
|
---|
2024 | Print ""
|
---|
2025 | Print "Configuration:"
|
---|
2026 | Print " -h, --help Display this."
|
---|
2027 | Print " --target-arch=x86|amd64 The target architecture."
|
---|
2028 | Print " --continue-on-error Do not stop on errors."
|
---|
2029 | Print " --internal-last Check internal tools (tools/win.*) last."
|
---|
2030 | Print " --internal-first Check internal tools (tools/win.*) first (default)."
|
---|
2031 | Print ""
|
---|
2032 | Print "Components:"
|
---|
2033 | Print " --disable-COM Disables all frontends and API."
|
---|
2034 | Print " --disable-SDL Disables the SDL frontend."
|
---|
2035 | Print " --disable-UDPTunnel"
|
---|
2036 | Print " --disable-pylint Disable use of pylint."
|
---|
2037 | Print ""
|
---|
2038 | Print "Locations:"
|
---|
2039 | Print " --with-kBuild=PATH Where kBuild is to be found."
|
---|
2040 | Print " --with-libSDL=PATH Where libSDL is to be found."
|
---|
2041 | Print " --with-Qt5=PATH Where Qt5 is to be found (optional)."
|
---|
2042 | Print " --with-DDK=PATH Where the WDK is to be found."
|
---|
2043 | Print " --with-SDK=PATH Where the Windows SDK is to be found."
|
---|
2044 | Print " --with-SDK10=PATH Where the Windows 10 SDK/WDK is to be found."
|
---|
2045 | Print " --with-VC=PATH Where the Visual C++ compiler is to be found."
|
---|
2046 | Print " (Expecting bin, include and lib subdirs.)"
|
---|
2047 | Print " --with-VC-Common=PATH Maybe needed for 2015 and older to"
|
---|
2048 | Print " locate the Common7 directory."
|
---|
2049 | Print " --with-python=PATH The python to use."
|
---|
2050 | Print " --with-midl=PATH Where midl.exe is to be found."
|
---|
2051 | Print " --with-yasm=PATH Where YASM is to be found."
|
---|
2052 | Print " --with-nasm=PATH Where NASM is to be found (optional)"
|
---|
2053 | Print " --with-openwatcom=PATH Where OpenWatcom 1.9 is to be found (optional)."
|
---|
2054 | Print " --with-libxml2=PATH To use a libxml2 other than the VBox one (opt)."
|
---|
2055 | Print " --with-openssl=PATH To use an openssl other than the VBox one (opt)."
|
---|
2056 | Print " --with-openssl32=PATH The 32-bit variant of openssl (optional)."
|
---|
2057 | Print " --with-libcurl=PATH To use a cURL other than the VBox one (optional)."
|
---|
2058 | Print " --with-libcurl32=PATH The 32-bit variant of cURL (optional)."
|
---|
2059 | Print ""
|
---|
2060 | Print " --append-tools-dir=PATH, --prepend-tools-dir=PATH"
|
---|
2061 | Print " Adds an alternative tools directory to search."
|
---|
2062 | Print " --append-tools-dir=PATH, --prepend-prog-files=PATH"
|
---|
2063 | Print " Adds an alternative Program Files dir to search."
|
---|
2064 | Print " --append-ewdk-drive=DRIVE, --prepend-ewdk-drive=DRIVE"
|
---|
2065 | Print " Adds an EWDK drive the search list."
|
---|
2066 | end sub
|
---|
2067 |
|
---|
2068 |
|
---|
2069 | ''
|
---|
2070 | ' The main() like function.
|
---|
2071 | '
|
---|
2072 | function Main
|
---|
2073 | dim strOutput
|
---|
2074 |
|
---|
2075 | '
|
---|
2076 | ' Write the log header and check that we're not using wscript.
|
---|
2077 | '
|
---|
2078 | LogInit
|
---|
2079 | if UCase(Right(Wscript.FullName, 11)) = "WSCRIPT.EXE" then
|
---|
2080 | Wscript.Echo "This script must be run under CScript."
|
---|
2081 | Main = 1
|
---|
2082 | exit function
|
---|
2083 | end if
|
---|
2084 | SelfTest
|
---|
2085 |
|
---|
2086 | '
|
---|
2087 | ' Parse arguments.
|
---|
2088 | '
|
---|
2089 | strOptDDK = ""
|
---|
2090 | strOptDXDDK = ""
|
---|
2091 | strOptkBuild = ""
|
---|
2092 | strOptlibSDL = ""
|
---|
2093 | strOptQt5 = ""
|
---|
2094 | strOptQt5Infix = ""
|
---|
2095 | strOptSDK = ""
|
---|
2096 | strOptSDK10 = ""
|
---|
2097 | strOptSDK10Version = ""
|
---|
2098 | strOptVC = ""
|
---|
2099 | strOptVCCommon = ""
|
---|
2100 | strOptMidl = ""
|
---|
2101 | strOptYasm = ""
|
---|
2102 | strOptNasm = ""
|
---|
2103 | strOptOpenWatcom = ""
|
---|
2104 | strOptXml2 = ""
|
---|
2105 | strOptSsl = ""
|
---|
2106 | strOptSsl32 = ""
|
---|
2107 | strOptCurl = ""
|
---|
2108 | strOptCurl32 = ""
|
---|
2109 | strOptPython = ""
|
---|
2110 | blnOptDisableCOM = False
|
---|
2111 | blnOptDisableUDPTunnel = False
|
---|
2112 | blnOptDisableSDL = False
|
---|
2113 | for i = 1 to Wscript.Arguments.Count
|
---|
2114 | dim str, strArg, strPath
|
---|
2115 |
|
---|
2116 | ' Separate argument and path value
|
---|
2117 | str = Wscript.Arguments.item(i - 1)
|
---|
2118 | if InStr(1, str, "=") > 0 then
|
---|
2119 | strArg = Mid(str, 1, InStr(1, str, "=") - 1)
|
---|
2120 | strPath = Mid(str, InStr(1, str, "=") + 1)
|
---|
2121 | if strPath = "" then MsgFatal "Syntax error! Argument #" & i & " is missing the path."
|
---|
2122 | else
|
---|
2123 | strArg = str
|
---|
2124 | strPath = ""
|
---|
2125 | end if
|
---|
2126 |
|
---|
2127 | ' Process the argument
|
---|
2128 | select case LCase(strArg)
|
---|
2129 | ' --with-something:
|
---|
2130 | case "--with-ddk"
|
---|
2131 | strOptDDK = strPath
|
---|
2132 | case "--with-dxsdk"
|
---|
2133 | MsgWarning "Ignoring --with-dxsdk (the DirectX SDK is no longer required)."
|
---|
2134 | case "--with-kbuild"
|
---|
2135 | strOptkBuild = strPath
|
---|
2136 | case "--with-libsdl"
|
---|
2137 | strOptlibSDL = strPath
|
---|
2138 | case "--with-mingw32"
|
---|
2139 | ' ignore
|
---|
2140 | case "--with-mingw-w64"
|
---|
2141 | ' ignore
|
---|
2142 | case "--with-qt5"
|
---|
2143 | strOptQt5 = strPath
|
---|
2144 | case "--with-qt5-infix"
|
---|
2145 | strOptQt5Infix = strPath
|
---|
2146 | case "--with-sdk"
|
---|
2147 | strOptSDK = strPath
|
---|
2148 | case "--with-sdk10"
|
---|
2149 | strOptSDK10 = strPath
|
---|
2150 | case "--with-sdk10-version"
|
---|
2151 | strOptSDK10Version = strPath
|
---|
2152 | case "--with-vc"
|
---|
2153 | strOptVC = strPath
|
---|
2154 | case "--with-vc-common"
|
---|
2155 | strOptVCCommon = strPath
|
---|
2156 | case "--with-vc-express-edition"
|
---|
2157 | ' ignore
|
---|
2158 | case "--with-w32api"
|
---|
2159 | ' ignore
|
---|
2160 | case "--with-midl"
|
---|
2161 | strOptMidl = strPath
|
---|
2162 | case "--with-yasm"
|
---|
2163 | strOptYasm = strPath
|
---|
2164 | case "--with-nasm"
|
---|
2165 | strOptNasm = strPath
|
---|
2166 | case "--with-openwatcom"
|
---|
2167 | strOptOpenWatcom = strPath
|
---|
2168 | case "--with-libxml2"
|
---|
2169 | strOptXml2 = strPath
|
---|
2170 | case "--with-openssl"
|
---|
2171 | strOptSsl = strPath
|
---|
2172 | case "--with-openssl32"
|
---|
2173 | strOptSsl32 = strPath
|
---|
2174 | case "--with-libcurl"
|
---|
2175 | strOptCurl = strPath
|
---|
2176 | case "--with-libcurl32"
|
---|
2177 | strOptCurl32 = strPath
|
---|
2178 | case "--with-python"
|
---|
2179 | strOptPython = strPath
|
---|
2180 |
|
---|
2181 | ' Search lists.
|
---|
2182 | case "--append-tools-dir"
|
---|
2183 | g_arrToolsDirs = ArrayAppend(g_arrPathDev, strPath)
|
---|
2184 | case "--prepend-tools-dir"
|
---|
2185 | g_arrToolsDirs = ArrayPrepend(g_arrPathDev, strPath)
|
---|
2186 | case "--append-prog-files"
|
---|
2187 | g_arrProgramFiles = ArrayAppend(g_arrProgramFiles, strPath)
|
---|
2188 | case "--prepend-prog-files"
|
---|
2189 | g_arrProgramFiles = ArrayPrepend(g_arrProgramFiles, strPath)
|
---|
2190 | case "--append-ewdk-drive"
|
---|
2191 | g_arrProgramFiles = ArrayAppend(g_arrProgramFiles, strPath & "\Program Files")
|
---|
2192 | case "--prepend-ewdk-drive"
|
---|
2193 | g_arrProgramFiles = ArrayPrepend(g_arrProgramFiles, strPath & "\Program Files")
|
---|
2194 |
|
---|
2195 | ' --disable-something/--enable-something
|
---|
2196 | case "--disable-com"
|
---|
2197 | blnOptDisableCOM = True
|
---|
2198 | case "--enable-com"
|
---|
2199 | blnOptDisableCOM = False
|
---|
2200 | case "--disable-udptunnel"
|
---|
2201 | blnOptDisableUDPTunnel = True
|
---|
2202 | case "--enable-udptunnel"
|
---|
2203 | blnOptDisableUDPTunnel = False
|
---|
2204 | case "--disable-sdl"
|
---|
2205 | blnOptDisableSDL = True
|
---|
2206 | case "--endable-sdl"
|
---|
2207 | blnOptDisableSDL = False
|
---|
2208 | case "--disable-pylint"
|
---|
2209 | blnOptDisablePylint = True
|
---|
2210 | case "--enable-pylint"
|
---|
2211 | blnOptDisablePylint = False
|
---|
2212 |
|
---|
2213 | ' Other stuff.
|
---|
2214 | case "--continue-on-error"
|
---|
2215 | g_blnContinueOnError = True
|
---|
2216 | case "--internal-first"
|
---|
2217 | g_blnInternalFirst = True
|
---|
2218 | case "--internal-last"
|
---|
2219 | g_blnInternalFirst = False
|
---|
2220 | case "--target-arch"
|
---|
2221 | g_strTargetArch = strPath
|
---|
2222 | case "-h", "--help", "-?"
|
---|
2223 | usage
|
---|
2224 | Main = 0
|
---|
2225 | exit function
|
---|
2226 | case else
|
---|
2227 | Wscript.echo "syntax error: Unknown option '" & str &"'."
|
---|
2228 | usage
|
---|
2229 | Main = 2
|
---|
2230 | exit function
|
---|
2231 | end select
|
---|
2232 | next
|
---|
2233 |
|
---|
2234 | '
|
---|
2235 | ' Initialize output files.
|
---|
2236 | '
|
---|
2237 | CfgInit
|
---|
2238 | EnvInit
|
---|
2239 |
|
---|
2240 | '
|
---|
2241 | ' Check that the Shell function is sane.
|
---|
2242 | '
|
---|
2243 | g_objShell.Environment("PROCESS")("TESTING_ENVIRONMENT_INHERITANCE") = "This works"
|
---|
2244 | if Shell("set TESTING_ENVIRONMENT_INHERITANC", False, strOutput) <> 0 then ' The 'E' is missing on purpose (4nt).
|
---|
2245 | MsgFatal "shell execution test failed!"
|
---|
2246 | end if
|
---|
2247 | if strOutput <> "TESTING_ENVIRONMENT_INHERITANCE=This works" & CHR(13) & CHR(10) then
|
---|
2248 | Print "Shell test Test -> '" & strOutput & "'"
|
---|
2249 | MsgFatal "shell inheritance or shell execution isn't working right. Make sure you use cmd.exe."
|
---|
2250 | end if
|
---|
2251 | g_objShell.Environment("PROCESS")("TESTING_ENVIRONMENT_INHERITANCE") = ""
|
---|
2252 | Print "Shell inheritance test: OK"
|
---|
2253 |
|
---|
2254 | '
|
---|
2255 | ' Do the checks.
|
---|
2256 | '
|
---|
2257 | if blnOptDisableCOM = True then
|
---|
2258 | DisableCOM "--disable-com"
|
---|
2259 | end if
|
---|
2260 | if blnOptDisableUDPTunnel = True then
|
---|
2261 | DisableUDPTunnel "--disable-udptunnel"
|
---|
2262 | end if
|
---|
2263 | if blnOptDisablePylint = True then
|
---|
2264 | CfgPrintAssign "override VBOX_WITH_PYLINT", ""
|
---|
2265 | end if
|
---|
2266 | CheckSourcePath
|
---|
2267 | CheckForkBuild strOptkBuild
|
---|
2268 | CheckForWinDDK strOptDDK
|
---|
2269 | CheckForVisualCPP strOptVC, strOptVCCommon
|
---|
2270 | CheckForPlatformSDK strOptSDK
|
---|
2271 | CheckForSDK10 strOptSDK10, strOptSDK10Version
|
---|
2272 | CheckForMidl strOptMidl
|
---|
2273 | CheckForYasm strOptYasm
|
---|
2274 | CheckForNasm strOptNasm
|
---|
2275 | CheckForOpenWatcom strOptOpenWatcom
|
---|
2276 | if blnOptDisableSDL = True then
|
---|
2277 | DisableSDL "--disable-sdl"
|
---|
2278 | else
|
---|
2279 | CheckForlibSDL strOptlibSDL
|
---|
2280 | end if
|
---|
2281 | CheckForXml2 strOptXml2
|
---|
2282 | CheckForSsl strOptSsl, False
|
---|
2283 | if g_strTargetArch = "amd64" then
|
---|
2284 | ' 32-bit openssl required as well
|
---|
2285 | CheckForSsl strOptSsl32, True
|
---|
2286 | end if
|
---|
2287 | CheckForCurl strOptCurl, False
|
---|
2288 | if g_strTargetArch = "amd64" then
|
---|
2289 | ' 32-bit Curl required as well
|
---|
2290 | CheckForCurl strOptCurl32, True
|
---|
2291 | end if
|
---|
2292 | CheckForQt strOptQt5, strOptQt5Infix
|
---|
2293 | CheckForPython strOptPython
|
---|
2294 | CfgPrintAssign "VBOX_WITH_LIBVPX", "" '' @todo look for libvpx 1.1.0+
|
---|
2295 | CfgPrintAssign "VBOX_WITH_LIBOPUS", "" '' @todo look for libopus 1.2.1+
|
---|
2296 |
|
---|
2297 | EnvPrintAppend "PATH", DosSlashes(g_strPath & "\tools\win." & g_strHostArch & "\bin"), ";"
|
---|
2298 | if g_strHostArch = "amd64" then
|
---|
2299 | EnvPrintAppend "PATH", DosSlashes(g_strPath & "\tools\win.x86\bin"), ";"
|
---|
2300 | else
|
---|
2301 | EnvPrintCleanup "PATH", DosSlashes(g_strPath & "\tools\win.amd64\bin"), ";"
|
---|
2302 | end if
|
---|
2303 |
|
---|
2304 | Print ""
|
---|
2305 | Print "Execute env.bat once before you start to build VBox:"
|
---|
2306 | Print ""
|
---|
2307 | Print " env.bat"
|
---|
2308 | Print " kmk"
|
---|
2309 | Print ""
|
---|
2310 | if g_rcScript <> 0 then
|
---|
2311 | Print "Warning: ignored errors. See above or in configure.log."
|
---|
2312 | end if
|
---|
2313 |
|
---|
2314 | Main = g_rcScript
|
---|
2315 | end function
|
---|
2316 |
|
---|
2317 | '
|
---|
2318 | ' What crt0.o typically does:
|
---|
2319 | '
|
---|
2320 | WScript.Quit(Main())
|
---|
2321 |
|
---|