VirtualBox

source: vbox/trunk/configure.vbs@ 70994

Last change on this file since 70994 was 69500, checked in by vboxsync, 7 years ago

*: scm --update-copyright-year

  • Property svn:eol-style set to CRLF
  • Property svn:keywords set to Id
File size: 74.6 KB
Line 
1' $Id: configure.vbs 69500 2017-10-28 15:14:05Z 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-2017 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'* Global Variables *
26'*****************************************************************************
27dim g_strPath, g_strEnvFile, g_strLogFile, g_strCfgFile, g_strShellOutput
28g_strPath = Left(Wscript.ScriptFullName, Len(Wscript.ScriptFullName) - Len("\configure.vbs"))
29g_strEnvFile = g_strPath & "\env.bat"
30g_strCfgFile = g_strPath & "\AutoConfig.kmk"
31g_strLogFile = g_strPath & "\configure.log"
32'g_strTmpFile = g_strPath & "\configure.tmp"
33
34dim g_objShell, g_objFileSys
35Set g_objShell = WScript.CreateObject("WScript.Shell")
36Set g_objFileSys = WScript.CreateObject("Scripting.FileSystemObject")
37
38dim g_strPathkBuild, g_strPathkBuildBin, g_strPathDev, g_strPathVCC, g_strPathPSDK, g_strVerPSDK, g_strPathDDK, g_strSubOutput
39g_strPathkBuild = ""
40g_strPathDev = ""
41g_strPathVCC = ""
42g_strPathPSDK = ""
43g_strPathDDK = ""
44
45dim g_strTargetArch
46g_strTargetArch = ""
47
48dim g_blnDisableCOM, g_strDisableCOM
49g_blnDisableCOM = False
50g_strDisableCOM = ""
51
52' The internal mode is primarily for skipping some large libraries.
53dim g_blnInternalMode
54g_blnInternalMode = False
55
56' Whether to try the internal stuff first or last.
57dim g_blnInternalFirst
58g_blnInternalFirst = True
59
60
61
62''
63' Converts to unix slashes
64function UnixSlashes(str)
65 UnixSlashes = replace(str, "\", "/")
66end function
67
68
69''
70' Converts to dos slashes
71function DosSlashes(str)
72 DosSlashes = replace(str, "/", "\")
73end function
74
75
76''
77' Read a file (typically the tmp file) into a string.
78function FileToString(strFilename)
79 const ForReading = 1, TristateFalse = 0
80 dim objLogFile, str
81
82 set objFile = g_objFileSys.OpenTextFile(DosSlashes(strFilename), ForReading, False, TristateFalse)
83 str = objFile.ReadAll()
84 objFile.Close()
85
86 FileToString = str
87end function
88
89
90''
91' Deletes a file
92sub FileDelete(strFilename)
93 if g_objFileSys.FileExists(DosSlashes(strFilename)) then
94 g_objFileSys.DeleteFile(DosSlashes(strFilename))
95 end if
96end sub
97
98
99''
100' Appends a line to an ascii file.
101sub FileAppendLine(strFilename, str)
102 const ForAppending = 8, TristateFalse = 0
103 dim objFile
104
105 set objFile = g_objFileSys.OpenTextFile(DosSlashes(strFilename), ForAppending, True, TristateFalse)
106 objFile.WriteLine(str)
107 objFile.Close()
108end sub
109
110
111''
112' Checks if the file exists.
113function FileExists(strFilename)
114 FileExists = g_objFileSys.FileExists(DosSlashes(strFilename))
115end function
116
117
118''
119' Checks if the directory exists.
120function DirExists(strDirectory)
121 DirExists = g_objFileSys.FolderExists(DosSlashes(strDirectory))
122end function
123
124
125''
126' Checks if this is a WOW64 process.
127function IsWow64()
128 if g_objShell.Environment("PROCESS")("PROCESSOR_ARCHITEW6432") <> "" then
129 IsWow64 = 1
130 else
131 IsWow64 = 0
132 end if
133end function
134
135
136''
137' Returns a reverse sorted array (strings).
138function ArraySortStrings(arrStrings)
139 for i = LBound(arrStrings) to UBound(arrStrings)
140 str1 = arrStrings(i)
141 for j = i + 1 to UBound(arrStrings)
142 str2 = arrStrings(j)
143 if StrComp(str2, str1) < 0 then
144 arrStrings(j) = str1
145 str1 = str2
146 end if
147 next
148 arrStrings(i) = str1
149 next
150 ArraySortStrings = arrStrings
151end function
152
153
154''
155' Prints a string array.
156sub ArrayPrintStrings(arrStrings, strPrefix)
157 for i = LBound(arrStrings) to UBound(arrStrings)
158 Print strPrefix & "arrStrings(" & i & ") = '" & arrStrings(i) & "'"
159 next
160end sub
161
162
163''
164' Returns a reverse sorted array (strings).
165function ArrayRSortStrings(arrStrings)
166 ' Sort it.
167 arrStrings = ArraySortStrings(arrStrings)
168
169 ' Reverse the array.
170 cnt = UBound(arrStrings) - LBound(arrStrings) + 1
171 if cnt > 0 then
172 j = UBound(arrStrings)
173 iHalf = Fix(LBound(arrStrings) + cnt / 2)
174 for i = LBound(arrStrings) to iHalf - 1
175 strTmp = arrStrings(i)
176 arrStrings(i) = arrStrings(j)
177 arrStrings(j) = strTmp
178 j = j - 1
179 next
180 end if
181 ArrayRSortStrings = arrStrings
182end function
183
184
185''
186' Returns the input array with the string appended.
187' Note! There must be some better way of doing this...
188function ArrayAppend(arr, str)
189 dim i, cnt
190 cnt = UBound(arr) - LBound(arr) + 1
191 redim arrRet(cnt)
192 for i = LBound(arr) to UBound(arr)
193 arrRet(i) = arr(i)
194 next
195 arrRet(UBound(arr) + 1) = str
196 ArrayAppend = arrRet
197end function
198
199
200
201''
202' Translates a register root name to a value
203function RegTransRoot(strRoot)
204 const HKEY_LOCAL_MACHINE = &H80000002
205 const HKEY_CURRENT_USER = &H80000001
206 select case strRoot
207 case "HKLM"
208 RegTransRoot = HKEY_LOCAL_MACHINE
209 case "HKCU"
210 RegTransRoot = HKEY_CURRENT_USER
211 case else
212 MsgFatal "RegTransRoot: Unknown root: '" & strRoot & "'"
213 RegTransRoot = 0
214 end select
215end function
216
217
218'' The registry globals
219dim g_objReg, g_objRegCtx
220dim g_blnRegistry
221g_blnRegistry = false
222
223
224''
225' Init the register provider globals.
226function RegInit()
227 RegInit = false
228 On Error Resume Next
229 if g_blnRegistry = false then
230 set g_objRegCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
231 ' Comment out the following for lines if the cause trouble on your windows version.
232 if IsWow64() then
233 g_objRegCtx.Add "__ProviderArchitecture", 64
234 g_objRegCtx.Add "__RequiredArchitecture", true
235 end if
236 set objLocator = CreateObject("Wbemscripting.SWbemLocator")
237 set objServices = objLocator.ConnectServer("", "root\default", "", "", , , , g_objRegCtx)
238 set g_objReg = objServices.Get("StdRegProv")
239 g_blnRegistry = true
240 end if
241 RegInit = true
242end function
243
244
245''
246' Gets a value from the registry. Returns "" if string wasn't found / valid.
247function RegGetString(strName)
248 RegGetString = ""
249 if RegInit() then
250 dim strRoot, strKey, strValue
251 dim iRoot
252
253 ' split up into root, key and value parts.
254 strRoot = left(strName, instr(strName, "\") - 1)
255 strKey = mid(strName, instr(strName, "\") + 1, instrrev(strName, "\") - instr(strName, "\"))
256 strValue = mid(strName, instrrev(strName, "\") + 1)
257
258 ' Must use ExecMethod to call the GetStringValue method because of the context.
259 Set InParms = g_objReg.Methods_("GetStringValue").Inparameters
260 InParms.hDefKey = RegTransRoot(strRoot)
261 InParms.sSubKeyName = strKey
262 InParms.sValueName = strValue
263 On Error Resume Next
264 set OutParms = g_objReg.ExecMethod_("GetStringValue", InParms, , g_objRegCtx)
265 if OutParms.ReturnValue = 0 then
266 RegGetString = OutParms.sValue
267 end if
268 else
269 ' fallback mode
270 On Error Resume Next
271 RegGetString = g_objShell.RegRead(strName)
272 end if
273end function
274
275
276''
277' Returns an array of subkey strings.
278function RegEnumSubKeys(strRoot, strKeyPath)
279 dim iRoot
280 iRoot = RegTransRoot(strRoot)
281 RegEnumSubKeys = Array()
282
283 if RegInit() then
284 ' Must use ExecMethod to call the EnumKey method because of the context.
285 Set InParms = g_objReg.Methods_("EnumKey").Inparameters
286 InParms.hDefKey = RegTransRoot(strRoot)
287 InParms.sSubKeyName = strKeyPath
288 On Error Resume Next
289 set OutParms = g_objReg.ExecMethod_("EnumKey", InParms, , g_objRegCtx)
290 if OutParms.ReturnValue = 0 then
291 RegEnumSubKeys = OutParms.sNames
292 end if
293 else
294 ' fallback mode
295 dim objReg, rc, arrSubKeys
296 set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
297 On Error Resume Next
298 rc = objReg.EnumKey(iRoot, strKeyPath, arrSubKeys)
299 if rc = 0 then
300 RegEnumSubKeys = arrSubKeys
301 end if
302 end if
303end function
304
305
306''
307' Returns an array of full path subkey strings.
308function RegEnumSubKeysFull(strRoot, strKeyPath)
309 dim arrTmp
310 arrTmp = RegEnumSubKeys(strRoot, strKeyPath)
311 for i = LBound(arrTmp) to UBound(arrTmp)
312 arrTmp(i) = strKeyPath & "\" & arrTmp(i)
313 next
314 RegEnumSubKeysFull = arrTmp
315end function
316
317
318''
319' Returns an rsorted array of subkey strings.
320function RegEnumSubKeysRSort(strRoot, strKeyPath)
321 RegEnumSubKeysRSort = ArrayRSortStrings(RegEnumSubKeys(strRoot, strKeyPath))
322end function
323
324
325''
326' Returns an rsorted array of subkey strings.
327function RegEnumSubKeysFullRSort(strRoot, strKeyPath)
328 RegEnumSubKeysFullRSort = ArrayRSortStrings(RegEnumSubKeysFull(strRoot, strKeyPath))
329end function
330
331
332''
333' Gets the commandline used to invoke the script.
334function GetCommandline()
335 dim str, i
336
337 '' @todo find an api for querying it instead of reconstructing it like this...
338 GetCommandline = "cscript configure.vbs"
339 for i = 1 to WScript.Arguments.Count
340 str = WScript.Arguments.Item(i - 1)
341 if str = "" then
342 str = """"""
343 elseif (InStr(1, str, " ")) then
344 str = """" & str & """"
345 end if
346 GetCommandline = GetCommandline & " " & str
347 next
348end function
349
350
351''
352' Gets an environment variable.
353function EnvGet(strName)
354 EnvGet = g_objShell.Environment("PROCESS")(strName)
355end function
356
357
358''
359' Sets an environment variable.
360sub EnvSet(strName, strValue)
361 g_objShell.Environment("PROCESS")(strName) = strValue
362 LogPrint "EnvSet: " & strName & "=" & strValue
363end sub
364
365
366''
367' Appends a string to an environment variable
368sub EnvAppend(strName, strValue)
369 dim str
370 str = g_objShell.Environment("PROCESS")(strName)
371 g_objShell.Environment("PROCESS")(strName) = str & strValue
372 LogPrint "EnvAppend: " & strName & "=" & str & strValue
373end sub
374
375
376''
377' Prepends a string to an environment variable
378sub EnvPrepend(strName, strValue)
379 dim str
380 str = g_objShell.Environment("PROCESS")(strName)
381 g_objShell.Environment("PROCESS")(strName) = strValue & str
382 LogPrint "EnvPrepend: " & strName & "=" & strValue & str
383end sub
384
385''
386' Gets the first non-empty environment variable of the given two.
387function EnvGetFirst(strName1, strName2)
388 EnvGetFirst = g_objShell.Environment("PROCESS")(strName1)
389 if EnvGetFirst = "" then
390 EnvGetFirst = g_objShell.Environment("PROCESS")(strName2)
391 end if
392end function
393
394
395''
396' Get the path of the parent directory. Returns root if root was specified.
397' Expects abs path.
398function PathParent(str)
399 PathParent = g_objFileSys.GetParentFolderName(DosSlashes(str))
400end function
401
402
403''
404' Strips the filename from at path.
405function PathStripFilename(str)
406 PathStripFilename = g_objFileSys.GetParentFolderName(DosSlashes(str))
407end function
408
409
410''
411' Get the abs path, use the short version if necessary.
412function PathAbs(str)
413 strAbs = g_objFileSys.GetAbsolutePathName(DosSlashes(str))
414 strParent = g_objFileSys.GetParentFolderName(strAbs)
415 if strParent = "" then
416 PathAbs = strAbs
417 else
418 strParent = PathAbs(strParent) ' Recurse to resolve parent paths.
419 PathAbs = g_objFileSys.BuildPath(strParent, g_objFileSys.GetFileName(strAbs))
420
421 dim obj
422 set obj = Nothing
423 if FileExists(PathAbs) then
424 set obj = g_objFileSys.GetFile(PathAbs)
425 elseif DirExists(PathAbs) then
426 set obj = g_objFileSys.GetFolder(PathAbs)
427 end if
428
429 if not (obj is nothing) then
430 for each objSub in obj.ParentFolder.SubFolders
431 if obj.Name = objSub.Name or obj.ShortName = objSub.ShortName then
432 if InStr(1, objSub.Name, " ") > 0 _
433 Or InStr(1, objSub.Name, "&") > 0 _
434 Or InStr(1, objSub.Name, "$") > 0 _
435 then
436 PathAbs = g_objFileSys.BuildPath(strParent, objSub.ShortName)
437 if InStr(1, PathAbs, " ") > 0 _
438 Or InStr(1, PathAbs, "&") > 0 _
439 Or InStr(1, PathAbs, "$") > 0 _
440 then
441 MsgFatal "PathAbs(" & str & ") attempted to return filename with problematic " _
442 & "characters in it (" & PathAbs & "). The tool/sdk referenced will probably " _
443 & "need to be copied or reinstalled to a location without 'spaces', '$', ';' " _
444 & "or '&' in the path name. (Unless it's a problem with this script of course...)"
445 end if
446 else
447 PathAbs = g_objFileSys.BuildPath(strParent, objSub.Name)
448 end if
449 exit for
450 end if
451 next
452 end if
453 end if
454end function
455
456
457''
458' Get the abs path, use the long version.
459function PathAbsLong(str)
460 strAbs = g_objFileSys.GetAbsolutePathName(DosSlashes(str))
461 strParent = g_objFileSys.GetParentFolderName(strAbs)
462 if strParent = "" then
463 PathAbsLong = strAbs
464 else
465 strParent = PathAbsLong(strParent) ' Recurse to resolve parent paths.
466 PathAbsLong = g_objFileSys.BuildPath(strParent, g_objFileSys.GetFileName(strAbs))
467
468 dim obj
469 set obj = Nothing
470 if FileExists(PathAbsLong) then
471 set obj = g_objFileSys.GetFile(PathAbsLong)
472 elseif DirExists(PathAbsLong) then
473 set obj = g_objFileSys.GetFolder(PathAbsLong)
474 end if
475
476 if not (obj is nothing) then
477 for each objSub in obj.ParentFolder.SubFolders
478 if obj.Name = objSub.Name or obj.ShortName = objSub.ShortName then
479 PathAbsLong = g_objFileSys.BuildPath(strParent, objSub.Name)
480 exit for
481 end if
482 next
483 end if
484 end if
485end function
486
487
488''
489' Executes a command in the shell catching output in g_strShellOutput
490function Shell(strCommand, blnBoth)
491 dim strShell, strCmdline, objExec, str
492
493 strShell = g_objShell.ExpandEnvironmentStrings("%ComSpec%")
494 if blnBoth = true then
495 strCmdline = strShell & " /c " & strCommand & " 2>&1"
496 else
497 strCmdline = strShell & " /c " & strCommand & " 2>nul"
498 end if
499
500 LogPrint "# Shell: " & strCmdline
501 Set objExec = g_objShell.Exec(strCmdLine)
502 g_strShellOutput = objExec.StdOut.ReadAll()
503 objExec.StdErr.ReadAll()
504 do while objExec.Status = 0
505 Wscript.Sleep 20
506 g_strShellOutput = g_strShellOutput & objExec.StdOut.ReadAll()
507 objExec.StdErr.ReadAll()
508 loop
509
510 LogPrint "# Status: " & objExec.ExitCode
511 LogPrint "# Start of Output"
512 LogPrint g_strShellOutput
513 LogPrint "# End of Output"
514
515 Shell = objExec.ExitCode
516end function
517
518
519''
520' Try find the specified file in the path.
521function Which(strFile)
522 dim strPath, iStart, iEnd, str
523
524 ' the path
525 strPath = EnvGet("Path")
526 iStart = 1
527 do while iStart <= Len(strPath)
528 iEnd = InStr(iStart, strPath, ";")
529 if iEnd <= 0 then iEnd = Len(strPath) + 1
530 if iEnd > iStart then
531 str = Mid(strPath, iStart, iEnd - iStart) & "/" & strFile
532 if FileExists(str) then
533 Which = str
534 exit function
535 end if
536 end if
537 iStart = iEnd + 1
538 loop
539
540 ' registry or somewhere?
541
542 Which = ""
543end function
544
545
546''
547' Append text to the log file and echo it to stdout
548sub Print(str)
549 LogPrint str
550 Wscript.Echo str
551end sub
552
553
554''
555' Prints a test header
556sub PrintHdr(strTest)
557 LogPrint "***** Checking for " & strTest & " *****"
558 Wscript.Echo "Checking for " & StrTest & "..."
559end sub
560
561
562''
563' Prints a success message
564sub PrintResultMsg(strTest, strResult)
565 LogPrint "** " & strTest & ": " & strResult
566 Wscript.Echo " Found "& strTest & ": " & strResult
567end sub
568
569
570''
571' Prints a successfully detected path
572sub PrintResult(strTest, strPath)
573 strLongPath = PathAbsLong(strPath)
574 if PathAbs(strPath) <> strLongPath then
575 LogPrint "** " & strTest & ": " & strPath & " (" & UnixSlashes(strLongPath) & ")"
576 Wscript.Echo " Found " & strTest & ": " & strPath & " (" & UnixSlashes(strLongPath) & ")"
577 else
578 LogPrint "** " & strTest & ": " & strPath
579 Wscript.Echo " Found " & strTest & ": " & strPath
580 end if
581end sub
582
583
584''
585' Warning message.
586sub MsgWarning(strMsg)
587 Print "warning: " & strMsg
588end sub
589
590
591''
592' Fatal error.
593sub MsgFatal(strMsg)
594 Print "fatal error: " & strMsg
595 Wscript.Quit
596end sub
597
598
599''
600' Error message, fatal unless flag to ignore errors is given.
601sub MsgError(strMsg)
602 Print "error: " & strMsg
603 if g_blnInternalMode = False then
604 Wscript.Quit
605 end if
606end sub
607
608
609''
610' Write a log header with some basic info.
611sub LogInit
612 FileDelete g_strLogFile
613 LogPrint "# Log file generated by " & Wscript.ScriptFullName
614 for i = 1 to WScript.Arguments.Count
615 LogPrint "# Arg #" & i & ": " & WScript.Arguments.Item(i - 1)
616 next
617 if Wscript.Arguments.Count = 0 then
618 LogPrint "# No arguments given"
619 end if
620 LogPrint "# Reconstructed command line: " & GetCommandline()
621
622 ' some Wscript stuff
623 LogPrint "# Wscript properties:"
624 LogPrint "# ScriptName: " & Wscript.ScriptName
625 LogPrint "# Version: " & Wscript.Version
626 LogPrint "# Build: " & Wscript.BuildVersion
627 LogPrint "# Name: " & Wscript.Name
628 LogPrint "# Full Name: " & Wscript.FullName
629 LogPrint "# Path: " & Wscript.Path
630 LogPrint "#"
631
632
633 ' the environment
634 LogPrint "# Environment:"
635 dim objEnv
636 for each strVar in g_objShell.Environment("PROCESS")
637 LogPrint "# " & strVar
638 next
639 LogPrint "#"
640end sub
641
642
643''
644' Append text to the log file.
645sub LogPrint(str)
646 FileAppendLine g_strLogFile, str
647 'Wscript.Echo "dbg: " & str
648end sub
649
650
651''
652' Checks if the file exists and logs failures.
653function LogFileExists(strPath, strFilename)
654 LogFileExists = FileExists(strPath & "/" & strFilename)
655 if LogFileExists = False then
656 LogPrint "Testing '" & strPath & "': " & strFilename & " not found"
657 end if
658
659end function
660
661
662''
663' Finds the first file matching the pattern.
664' If no file is found, log the failure.
665function LogFindFile(strPath, strPattern)
666 dim str
667
668 '
669 ' Yes, there are some facy database kinda interface to the filesystem
670 ' however, breaking down the path and constructing a usable query is
671 ' too much hassle. So, we'll do it the unix way...
672 '
673 if Shell("dir /B """ & DosSlashes(strPath) & "\" & DosSlashes(strPattern) & """", True) = 0 _
674 And InStr(1, g_strShellOutput, Chr(13)) > 1 _
675 then
676 ' return the first word.
677 LogFindFile = Left(g_strShellOutput, InStr(1, g_strShellOutput, Chr(13)) - 1)
678 else
679 LogPrint "Testing '" & strPath & "': " & strPattern & " not found"
680 LogFindFile = ""
681 end if
682end function
683
684
685''
686' Finds the first directory matching the pattern.
687' If no directory is found, log the failure,
688' else return the complete path to the found directory.
689function LogFindDir(strPath, strPattern)
690 dim str
691
692 '
693 ' Yes, there are some facy database kinda interface to the filesystem
694 ' however, breaking down the path and constructing a usable query is
695 ' too much hassle. So, we'll do it the unix way...
696 '
697
698 ' List the alphabetically last names as first entries (with /O-N).
699 if Shell("dir /B /AD /O-N """ & DosSlashes(strPath) & "\" & DosSlashes(strPattern) & """", True) = 0 _
700 And InStr(1, g_strShellOutput, Chr(13)) > 1 _
701 then
702 ' return the first word.
703 LogFindDir = strPath & "/" & Left(g_strShellOutput, InStr(1, g_strShellOutput, Chr(13)) - 1)
704 else
705 LogPrint "Testing '" & strPath & "': " & strPattern & " not found"
706 LogFindDir = ""
707 end if
708end function
709
710
711''
712' Initializes the config file.
713sub CfgInit
714 FileDelete g_strCfgFile
715 CfgPrint "# -*- Makefile -*-"
716 CfgPrint "#"
717 CfgPrint "# Build configuration generated by " & GetCommandline()
718 CfgPrint "#"
719 if g_blnInternalMode = False then
720 CfgPrint "VBOX_OSE := 1"
721 CfgPrint "VBOX_VCC_WERR = $(NO_SUCH_VARIABLE)"
722 end if
723end sub
724
725
726''
727' Prints a string to the config file.
728sub CfgPrint(str)
729 FileAppendLine g_strCfgFile, str
730end sub
731
732
733''
734' Initializes the environment batch script.
735sub EnvInit
736 FileDelete g_strEnvFile
737 EnvPrint "@echo off"
738 EnvPrint "rem"
739 EnvPrint "rem Environment setup script generated by " & GetCommandline()
740 EnvPrint "rem"
741end sub
742
743
744''
745' Prints a string to the environment batch script.
746sub EnvPrint(str)
747 FileAppendLine g_strEnvFile, str
748end sub
749
750
751''
752' No COM
753sub DisableCOM(strReason)
754 if g_blnDisableCOM = False then
755 LogPrint "Disabled COM components: " & strReason
756 g_blnDisableCOM = True
757 g_strDisableCOM = strReason
758 CfgPrint "VBOX_WITH_MAIN="
759 CfgPrint "VBOX_WITH_QTGUI="
760 CfgPrint "VBOX_WITH_VBOXSDL="
761 CfgPrint "VBOX_WITH_DEBUGGER_GUI="
762 end if
763end sub
764
765
766''
767' No UDPTunnel
768sub DisableUDPTunnel(strReason)
769 if g_blnDisableUDPTunnel = False then
770 LogPrint "Disabled UDPTunnel network transport: " & strReason
771 g_blnDisableUDPTunnel = True
772 g_strDisableUDPTunnel = strReason
773 CfgPrint "VBOX_WITH_UDPTUNNEL="
774 end if
775end sub
776
777
778''
779' No SDL
780sub DisableSDL(strReason)
781 if g_blnDisableSDL = False then
782 LogPrint "Disabled SDL frontend: " & strReason
783 g_blnDisableSDL = True
784 g_strDisableSDL = strReason
785 CfgPrint "VBOX_WITH_VBOXSDL="
786 end if
787end sub
788
789
790''
791' Checks the the path doesn't contain characters the tools cannot deal with.
792sub CheckSourcePath
793 dim sPwd
794
795 sPwd = PathAbs(g_strPath)
796 if InStr(1, sPwd, " ") > 0 then
797 MsgError "Source path contains spaces! Please move it. (" & sPwd & ")"
798 end if
799 if InStr(1, sPwd, "$") > 0 then
800 MsgError "Source path contains the '$' char! Please move it. (" & sPwd & ")"
801 end if
802 if InStr(1, sPwd, "%") > 0 then
803 MsgError "Source path contains the '%' char! Please move it. (" & sPwd & ")"
804 end if
805 if InStr(1, sPwd, Chr(10)) > 0 _
806 Or InStr(1, sPwd, Chr(13)) > 0 _
807 Or InStr(1, sPwd, Chr(9)) > 0 _
808 then
809 MsgError "Source path contains control characters! Please move it. (" & sPwd & ")"
810 end if
811 Print "Source path: OK"
812end sub
813
814
815''
816' Checks for kBuild - very simple :)
817sub CheckForkBuild(strOptkBuild)
818 PrintHdr "kBuild"
819
820 '
821 ' Check if there is a 'kmk' in the path somewhere without
822 ' any KBUILD_*PATH stuff around.
823 '
824 blnNeedEnvVars = True
825 g_strPathkBuild = strOptkBuild
826 g_strPathkBuildBin = ""
827 if (g_strPathkBuild = "") _
828 And (EnvGetFirst("KBUILD_PATH", "PATH_KBUILD") = "") _
829 And (EnvGetFirst("KBUILD_BIN_PATH", "PATH_KBUILD_BIN") = "") _
830 And (Shell("kmk.exe --version", True) = 0) _
831 And (InStr(1,g_strShellOutput, "kBuild Make 0.1") > 0) _
832 And (InStr(1,g_strShellOutput, "KBUILD_PATH") > 0) _
833 And (InStr(1,g_strShellOutput, "KBUILD_BIN_PATH") > 0) then
834 '' @todo Need to parse out the KBUILD_PATH and KBUILD_BIN_PATH values to complete the other tests.
835 'blnNeedEnvVars = False
836 MsgWarning "You've installed kBuild it seems. configure.vbs hasn't been updated to " _
837 & "deal with that yet and will use the one it ships with. Sorry."
838 end if
839
840 '
841 ' Check for the KBUILD_PATH env.var. and fall back on root/kBuild otherwise.
842 '
843 if g_strPathkBuild = "" then
844 g_strPathkBuild = EnvGetFirst("KBUILD_PATH", "PATH_KBUILD")
845 if (g_strPathkBuild <> "") and (FileExists(g_strPathkBuild & "/footer.kmk") = False) then
846 MsgWarning "Ignoring incorrect kBuild path (KBUILD_PATH=" & g_strPathkBuild & ")"
847 g_strPathkBuild = ""
848 end if
849
850 if g_strPathkBuild = "" then
851 g_strPathkBuild = g_strPath & "/kBuild"
852 end if
853 end if
854
855 g_strPathkBuild = UnixSlashes(PathAbs(g_strPathkBuild))
856
857 '
858 ' Check for env.vars that kBuild uses (do this early to set g_strTargetArch).
859 '
860 str = EnvGetFirst("KBUILD_TYPE", "BUILD_TYPE")
861 if (str <> "") _
862 And (InStr(1, "|release|debug|profile|kprofile", str) <= 0) then
863 EnvPrint "set KBUILD_TYPE=release"
864 EnvSet "KBUILD_TYPE", "release"
865 MsgWarning "Found unknown KBUILD_TYPE value '" & str &"' in your environment. Setting it to 'release'."
866 end if
867
868 str = EnvGetFirst("KBUILD_TARGET", "BUILD_TARGET")
869 if (str <> "") _
870 And (InStr(1, "win|win32|win64", str) <= 0) then '' @todo later only 'win' will be valid. remember to fix this check!
871 EnvPrint "set KBUILD_TARGET=win"
872 EnvSet "KBUILD_TARGET", "win"
873 MsgWarning "Found unknown KBUILD_TARGET value '" & str &"' in your environment. Setting it to 'win32'."
874 end if
875
876 str = EnvGetFirst("KBUILD_TARGET_ARCH", "BUILD_TARGET_ARCH")
877 if (str <> "") _
878 And (InStr(1, "x86|amd64", str) <= 0) then
879 EnvPrint "set KBUILD_TARGET_ARCH=x86"
880 EnvSet "KBUILD_TARGET_ARCH", "x86"
881 MsgWarning "Found unknown KBUILD_TARGET_ARCH value '" & str &"' in your environment. Setting it to 'x86'."
882 str = "x86"
883 end if
884 if g_strTargetArch = "" then '' command line parameter --target-arch=x86|amd64 has priority
885 if str <> "" then
886 g_strTargetArch = str
887 elseif (EnvGet("PROCESSOR_ARCHITEW6432") = "AMD64" ) _
888 Or (EnvGet("PROCESSOR_ARCHITECTURE") = "AMD64" ) then
889 g_strTargetArch = "amd64"
890 else
891 g_strTargetArch = "x86"
892 end if
893 else
894 if InStr(1, "x86|amd64", g_strTargetArch) <= 0 then
895 EnvPrint "set KBUILD_TARGET_ARCH=x86"
896 EnvSet "KBUILD_TARGET_ARCH", "x86"
897 MsgWarning "Unknown --target-arch=" & str &". Setting it to 'x86'."
898 end if
899 end if
900 LogPrint " Target architecture: " & g_strTargetArch & "."
901 Wscript.Echo " Target architecture: " & g_strTargetArch & "."
902 EnvPrint "set KBUILD_TARGET_ARCH=" & g_strTargetArch
903
904 str = EnvGetFirst("KBUILD_TARGET_CPU", "BUILD_TARGET_CPU")
905 ' perhaps a bit pedantic this since this isn't clearly define nor used much...
906 if (str <> "") _
907 And (InStr(1, "i386|i486|i686|i786|i868|k5|k6|k7|k8", str) <= 0) then
908 EnvPrint "set BUILD_TARGET_CPU=i386"
909 EnvSet "KBUILD_TARGET_CPU", "i386"
910 MsgWarning "Found unknown KBUILD_TARGET_CPU value '" & str &"' in your environment. Setting it to 'i386'."
911 end if
912
913 str = EnvGetFirst("KBUILD_HOST", "BUILD_PLATFORM")
914 if (str <> "") _
915 And (InStr(1, "win|win32|win64", str) <= 0) then '' @todo later only 'win' will be valid. remember to fix this check!
916 EnvPrint "set KBUILD_HOST=win"
917 EnvSet "KBUILD_HOST", "win"
918 MsgWarning "Found unknown KBUILD_HOST value '" & str &"' in your environment. Setting it to 'win32'."
919 end if
920
921 str = EnvGetFirst("KBUILD_HOST_ARCH", "BUILD_PLATFORM_ARCH")
922 if str <> "" then
923 if InStr(1, "x86|amd64", str) <= 0 then
924 str = "x86"
925 MsgWarning "Found unknown KBUILD_HOST_ARCH value '" & str &"' in your environment. Setting it to 'x86'."
926 end if
927 elseif (EnvGet("PROCESSOR_ARCHITEW6432") = "AMD64" ) _
928 Or (EnvGet("PROCESSOR_ARCHITECTURE") = "AMD64" ) then
929 str = "amd64"
930 else
931 str = "x86"
932 end if
933 LogPrint " Host architecture: " & str & "."
934 Wscript.Echo " Host architecture: " & str & "."
935 EnvPrint "set KBUILD_HOST_ARCH=" & str
936
937 str = EnvGetFirst("KBUILD_HOST_CPU", "BUILD_PLATFORM_CPU")
938 ' perhaps a bit pedantic this since this isn't clearly define nor used much...
939 if (str <> "") _
940 And (InStr(1, "i386|i486|i686|i786|i868|k5|k6|k7|k8", str) <= 0) then
941 EnvPrint "set KBUILD_HOST_CPU=i386"
942 EnvSet "KBUILD_HOST_CPU", "i386"
943 MsgWarning "Found unknown KBUILD_HOST_CPU value '" & str &"' in your environment. Setting it to 'i386'."
944 end if
945
946 '
947 ' Determin the location of the kBuild binaries.
948 '
949 if g_strPathkBuildBin = "" then
950 g_strPathkBuildBin = g_strPathkBuild & "/bin/win." & g_strTargetArch
951 if FileExists(g_strPathkBuild & "/kmk.exe") = False then
952 g_strPathkBuildBin = g_strPathkBuild & "/bin/win.x86"
953 end if
954 end if
955
956 '
957 ' Perform basic validations of the kBuild installation.
958 '
959 if (FileExists(g_strPathkBuild & "/footer.kmk") = False) _
960 Or (FileExists(g_strPathkBuild & "/header.kmk") = False) _
961 Or (FileExists(g_strPathkBuild & "/rules.kmk") = False) then
962 MsgFatal "Can't find valid kBuild at '" & g_strPathkBuild & "'. Either there is an " _
963 & "incorrect KBUILD_PATH in the environment or the checkout didn't succeed."
964 exit sub
965 end if
966 if (FileExists(g_strPathkBuildBin & "/kmk.exe") = False) _
967 Or (FileExists(g_strPathkBuildBin & "/kmk_ash.exe") = False) then
968 MsgFatal "Can't find valid kBuild binaries at '" & g_strPathkBuildBin & "'. Either there is an " _
969 & "incorrect KBUILD_PATH in the environment or the checkout didn't succeed."
970 exit sub
971 end if
972
973 if (Shell(DosSlashes(g_strPathkBuildBin & "/kmk.exe") & " --version", True) <> 0) Then
974 MsgFatal "Can't execute '" & g_strPathkBuildBin & "/kmk.exe --version'. check configure.log for the out."
975 exit sub
976 end if
977
978 '
979 ' If PATH_DEV is set, check that it's pointing to something useful.
980 '
981 str = EnvGet("PATH_DEV")
982 g_strPathDev = str
983 if (str <> "") _
984 And False then '' @todo add some proper tests here.
985 strNew = UnixSlashes(g_strPath & "/tools")
986 EnvPrint "set PATH_DEV=" & strNew
987 EnvSet "PATH_DEV", strNew
988 MsgWarning "Found PATH_DEV='" & str &"' in your environment. Setting it to '" & strNew & "'."
989 g_strPathDev = strNew
990 end if
991 if g_strPathDev = "" then g_strPathDev = UnixSlashes(g_strPath & "/tools")
992
993 '
994 ' Write KBUILD_PATH to the environment script if necessary.
995 '
996 if blnNeedEnvVars = True then
997 EnvPrint "set KBUILD_PATH=" & g_strPathkBuild
998 EnvSet "KBUILD_PATH", g_strPathkBuild
999 EnvPrint "set PATH=" & g_strPathkBuildBin & ";%PATH%"
1000 EnvPrepend "PATH", g_strPathkBuildBin & ";"
1001 end if
1002
1003 PrintResult "kBuild", g_strPathkBuild
1004 PrintResult "kBuild binaries", g_strPathkBuildBin
1005end sub
1006
1007
1008''
1009' Checks for Visual C++ version 10 (2010).
1010sub CheckForVisualCPP(strOptVC, strOptVCCommon, blnOptVCExpressEdition)
1011 dim strPathVC, strPathVCCommon, str, str2, blnNeedMsPDB
1012 PrintHdr "Visual C++"
1013
1014 '
1015 ' Try find it...
1016 '
1017 strPathVC = ""
1018 strPathVCCommon = ""
1019 if (strPathVC = "") And (strOptVC <> "") then
1020 if CheckForVisualCPPSub(strOptVC, strOptVCCommon, blnOptVCExpressEdition) then
1021 strPathVC = strOptVC
1022 strPathVCCommon = strOptVCCommon
1023 end if
1024 end if
1025
1026 if (strPathVC = "") And (g_blnInternalFirst = True) Then
1027 strPathVC = g_strPathDev & "/win.x86/vcc/v10sp1"
1028 if CheckForVisualCPPSub(strPathVC, "", blnOptVCExpressEdition) = False then
1029 strPathVC = ""
1030 end if
1031 end if
1032
1033 if (strPathVC = "") _
1034 And (Shell("cl.exe", True) = 0) then
1035 str = Which("cl.exe")
1036 if FileExists(PathStripFilename(strClExe) & "/build.exe") then
1037 ' don't know how to deal with this cl.
1038 Warning "Ignoring DDK cl.exe (" & str & ")."
1039 else
1040 strPathVC = PathParent(PathStripFilename(str))
1041 strPathVCCommon = PathParent(strPathVC) & "/Common7"
1042 end if
1043 end if
1044
1045 if (strPathVC = "") then
1046 str = RegGetString("HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\Setup\VS\ProductDir")
1047 if str <> "" Then
1048 str2 = str & "Common7"
1049 str = str & "VC"
1050 if CheckForVisualCPPSub(str, str2, blnOptVCExpressEdition) then
1051 strPathVC = str
1052 strPathVCCommon = str2
1053 end if
1054 end if
1055 end if
1056
1057 if (strPathVC = "") then
1058 str = RegGetString("HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\Setup\VS\ProductDir")
1059 if str <> "" Then
1060 str2 = str & "Common7"
1061 str = str & "VC"
1062 if CheckForVisualCPPSub(str, str2, blnOptVCExpressEdition) then
1063 strPathVC = str
1064 strPathVCCommon = str2
1065 end if
1066 end if
1067 end if
1068
1069 if (strPathVC = "") And (g_blnInternalFirst = False) Then
1070 strPathVC = g_strPathDev & "/win.x86/vcc/v10sp1"
1071 if CheckForVisualCPPSub(strPathVC, "", blnOptVCExpressEdition) = False then
1072 strPathVC = ""
1073 end if
1074 end if
1075
1076 if strPathVC = "" then
1077 MsgError "Cannot find cl.exe (Visual C++) anywhere on your system. Check the build requirements."
1078 exit sub
1079 end if
1080
1081 '
1082 ' Clean up the path and determin the VC directory.
1083 '
1084 strPathVC = UnixSlashes(PathAbs(strPathVC))
1085 g_strPathVCC = strPathVC
1086
1087 '
1088 ' Check the version.
1089 ' We'll have to make sure mspdbXX.dll is somewhere in the PATH.
1090 '
1091 if (strPathVCCommon <> "") Then
1092 EnvAppend "PATH", ";" & strPathVCCommon & "/IDE"
1093 end if
1094 if Shell(DosSlashes(strPathVC & "/bin/cl.exe"), True) <> 0 then
1095 MsgError "Executing '" & strClExe & "' (which we believe to be the Visual C++ compiler driver) failed."
1096 exit sub
1097 end if
1098
1099 if (InStr(1, g_strShellOutput, "Version 16.") <= 0) _
1100 And (InStr(1, g_strShellOutput, "Version 17.") <= 0) then
1101 MsgError "The Visual C++ compiler we found ('" & strPathVC & "') isn't 10.0 or 11.0. Check the build requirements."
1102 exit sub
1103 end if
1104
1105 '
1106 ' Ok, emit build config variables.
1107 '
1108 if InStr(1, g_strShellOutput, "Version 16.") > 0 then
1109 CfgPrint "PATH_TOOL_VCC100 := " & g_strPathVCC
1110 CfgPrint "PATH_TOOL_VCC100X86 := $(PATH_TOOL_VCC100)"
1111 CfgPrint "PATH_TOOL_VCC100AMD64 := $(PATH_TOOL_VCC100)"
1112 if LogFileExists(strPathVC, "atlmfc/include/atlbase.h") then
1113 PrintResult "Visual C++ v10 with ATL", g_strPathVCC
1114 elseif LogFileExists(g_strPathDDK, "inc/atl71/atlbase.h") _
1115 And LogFileExists(g_strPathDDK, "lib/ATL/i386/atls.lib") then
1116 CfgPrint "VBOX_WITHOUT_COMPILER_REDIST=1"
1117 CfgPrint "PATH_TOOL_VCC100_ATLMFC_INC = " & g_strPathDDK & "/inc/atl71"
1118 CfgPrint "PATH_TOOL_VCC100_ATLMFC_LIB.amd64 = " & g_strPathDDK & "/lib/ATL/amd64"
1119 CfgPrint "PATH_TOOL_VCC100_ATLMFC_LIB.x86 = " & g_strPathDDK & "/lib/ATL/i386"
1120 CfgPrint "PATH_TOOL_VCC100AMD64_ATLMFC_INC = " & g_strPathDDK & "/inc/atl71"
1121 CfgPrint "PATH_TOOL_VCC100AMD64_ATLMFC_LIB = " & g_strPathDDK & "/lib/ATL/amd64"
1122 CfgPrint "PATH_TOOL_VCC100X86_ATLMFC_INC = " & g_strPathDDK & "/inc/atl71"
1123 CfgPrint "PATH_TOOL_VCC100X86_ATLMFC_LIB = " & g_strPathDDK & "/lib/ATL/i386"
1124 PrintResult "Visual C++ v10 with DDK ATL", g_strPathVCC
1125 else
1126 CfgPrint "VBOX_WITHOUT_COMPILER_REDIST=1"
1127 DisableCOM "No ATL"
1128 PrintResult "Visual C++ v10 (or later) without ATL", g_strPathVCC
1129 end if
1130
1131 elseif InStr(1, g_strShellOutput, "Version 17.") > 0 then
1132 CfgPrint "PATH_TOOL_VCC110 := " & g_strPathVCC
1133 CfgPrint "PATH_TOOL_VCC110X86 := $(PATH_TOOL_VCC110)"
1134 CfgPrint "PATH_TOOL_VCC110AMD64 := $(PATH_TOOL_VCC110)"
1135 PrintResult "Visual C++ v11", g_strPathVCC
1136 MsgWarning "The support for Visual C++ v11 (aka 2012) is experimental"
1137
1138 else
1139 MsgError "The Visual C++ compiler we found ('" & strPathVC & "') isn't 10.0 or 11.0. Check the build requirements."
1140 exit sub
1141 end if
1142
1143 ' and the env.bat path fix.
1144 if strPathVCCommon <> "" then
1145 EnvPrint "set PATH=%PATH%;" & strPathVCCommon & "/IDE;"
1146 end if
1147end sub
1148
1149''
1150' Checks if the specified path points to a usable PSDK.
1151function CheckForVisualCPPSub(strPathVC, strPathVCCommon, blnOptVCExpressEdition)
1152 strPathVC = UnixSlashes(PathAbs(strPathVC))
1153 CheckForVisualCPPSub = False
1154 LogPrint "trying: strPathVC=" & strPathVC & " strPathVCCommon=" & strPathVCCommon & " blnOptVCExpressEdition=" & blnOptVCExpressEdition
1155 if LogFileExists(strPathVC, "bin/cl.exe") _
1156 And LogFileExists(strPathVC, "bin/link.exe") _
1157 And LogFileExists(strPathVC, "include/string.h") _
1158 And LogFileExists(strPathVC, "lib/libcmt.lib") _
1159 And LogFileExists(strPathVC, "lib/msvcrt.lib") _
1160 then
1161 if blnOptVCExpressEdition _
1162 Or ( LogFileExists(strPathVC, "atlmfc/include/atlbase.h") _
1163 And LogFileExists(strPathVC, "atlmfc/lib/atls.lib")) _
1164 Or ( LogFileExists(g_strPathDDK, "inc/atl71/atlbase.h") _
1165 And LogFileExists(g_strPathDDK, "lib/ATL/i386/atls.lib")) _
1166 Then
1167 '' @todo figure out a way we can verify the version/build!
1168 CheckForVisualCPPSub = True
1169 end if
1170 end if
1171end function
1172
1173
1174''
1175' Checks for a platform SDK that works with the compiler
1176sub CheckForPlatformSDK(strOptSDK)
1177 dim strPathPSDK, str
1178 PrintHdr "Windows Platform SDK (recent)"
1179
1180 strPathPSDK = ""
1181
1182 ' Check the supplied argument first.
1183 str = strOptSDK
1184 if str <> "" then
1185 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1186 end if
1187
1188 ' The tools location (first).
1189 if strPathPSDK = "" And g_blnInternalFirst then
1190 str = g_strPathDev & "/win.x86/sdk/v7.1"
1191 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1192 end if
1193
1194 if strPathPSDK = "" And g_blnInternalFirst then
1195 str = g_strPathDev & "/win.x86/sdk/v8.0"
1196 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1197 end if
1198
1199 ' Look for it in the environment
1200 str = EnvGet("MSSdk")
1201 if strPathPSDK = "" And str <> "" then
1202 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1203 end if
1204
1205 str = EnvGet("Mstools")
1206 if strPathPSDK = "" And str <> "" then
1207 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1208 end if
1209
1210 ' Check if there is one installed with the compiler.
1211 if strPathPSDK = "" And str <> "" then
1212 str = g_strPathVCC & "/PlatformSDK"
1213 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1214 end if
1215
1216 ' Check the registry next (ASSUMES sorting).
1217 arrSubKeys = RegEnumSubKeysRSort("HKLM", "SOFTWARE\Microsoft\Microsoft SDKs\Windows")
1218 for each strSubKey in arrSubKeys
1219 str = RegGetString("HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\" & strSubKey & "\InstallationFolder")
1220 if strPathPSDK = "" And str <> "" then
1221 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1222 end if
1223 Next
1224 arrSubKeys = RegEnumSubKeysRSort("HKCU", "SOFTWARE\Microsoft\Microsoft SDKs\Windows")
1225 for each strSubKey in arrSubKeys
1226 str = RegGetString("HKCU\SOFTWARE\Microsoft\Microsoft SDKs\Windows\" & strSubKey & "\InstallationFolder")
1227 if strPathPSDK = "" And str <> "" then
1228 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1229 end if
1230 Next
1231
1232 ' The tools location (post).
1233 if (strPathPSDK = "") And (g_blnInternalFirst = False) then
1234 str = g_strPathDev & "/win.x86/sdk/v7.1"
1235 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1236 end if
1237
1238 if (strPathPSDK = "") And (g_blnInternalFirst = False) then
1239 str = g_strPathDev & "/win.x86/sdk/v8.0"
1240 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1241 end if
1242
1243 ' Give up.
1244 if strPathPSDK = "" then
1245 MsgError "Cannot find a suitable Platform SDK. Check configure.log and the build requirements."
1246 exit sub
1247 end if
1248
1249 '
1250 ' Emit the config.
1251 '
1252 strPathPSDK = UnixSlashes(PathAbs(strPathPSDK))
1253 CfgPrint "PATH_SDK_WINPSDK" & g_strVerPSDK & " := " & strPathPSDK
1254 CfgPrint "VBOX_WINPSDK := WINPSDK" & g_strVerPSDK
1255
1256 PrintResult "Windows Platform SDK (v" & g_strVerPSDK & ")", strPathPSDK
1257 g_strPathPSDK = strPathPSDK
1258end sub
1259
1260''
1261' Checks if the specified path points to a usable PSDK.
1262function CheckForPlatformSDKSub(strPathPSDK)
1263 CheckForPlatformSDKSub = False
1264 LogPrint "trying: strPathPSDK=" & strPathPSDK
1265 if LogFileExists(strPathPSDK, "include/Windows.h") _
1266 And LogFileExists(strPathPSDK, "lib/Kernel32.Lib") _
1267 And LogFileExists(strPathPSDK, "lib/User32.Lib") _
1268 And LogFileExists(strPathPSDK, "bin/rc.exe") _
1269 And Shell("""" & DosSlashes(strPathPSDK & "/bin/rc.exe") & """" , True) <> 0 _
1270 then
1271 if InStr(1, g_strShellOutput, "Resource Compiler Version 6.2.") > 0 then
1272 g_strVerPSDK = "80"
1273 CheckForPlatformSDKSub = True
1274 elseif InStr(1, g_strShellOutput, "Resource Compiler Version 6.1.") > 0 then
1275 g_strVerPSDK = "71"
1276 CheckForPlatformSDKSub = True
1277 end if
1278 end if
1279end function
1280
1281
1282''
1283' Checks for a Windows 7 Driver Kit.
1284sub CheckForWinDDK(strOptDDK)
1285 dim strPathDDK, str, strSubKeys
1286 PrintHdr "Windows DDK v7.1"
1287
1288 '
1289 ' Find the DDK.
1290 '
1291 strPathDDK = ""
1292 ' The specified path.
1293 if strPathDDK = "" And strOptDDK <> "" then
1294 if CheckForWinDDKSub(strOptDDK, True) then strPathDDK = strOptDDK
1295 end if
1296
1297 ' The tools location (first).
1298 if strPathDDK = "" And g_blnInternalFirst then
1299 str = g_strPathDev & "/win.x86/ddk/7600.16385.1"
1300 if CheckForWinDDKSub(str, False) then strPathDDK = str
1301 end if
1302
1303 ' Check the environment
1304 str = EnvGet("DDK_INC_PATH")
1305 if strPathDDK = "" And str <> "" then
1306 str = PathParent(PathParent(str))
1307 if CheckForWinDDKSub(str, True) then strPathDDK = str
1308 end if
1309
1310 str = EnvGet("BASEDIR")
1311 if strPathDDK = "" And str <> "" then
1312 if CheckForWinDDKSub(str, True) then strPathDDK = str
1313 end if
1314
1315 ' Some array constants to ease the work.
1316 arrSoftwareKeys = array("SOFTWARE", "SOFTWARE\Wow6432Node")
1317 arrRoots = array("HKLM", "HKCU")
1318
1319 ' Windows 7 WDK.
1320 arrLocations = array()
1321 for each strSoftwareKey in arrSoftwareKeys
1322 for each strSubKey in RegEnumSubKeysFull("HKLM", strSoftwareKey & "\Microsoft\KitSetup\configured-kits")
1323 for each strSubKey2 in RegEnumSubKeysFull("HKLM", strSubKey)
1324 str = RegGetString("HKLM\" & strSubKey2 & "\setup-install-location")
1325 if str <> "" then
1326 arrLocations = ArrayAppend(arrLocations, PathAbsLong(str))
1327 end if
1328 next
1329 next
1330 next
1331 arrLocations = ArrayRSortStrings(arrLocations)
1332
1333 ' Check the locations we've gathered.
1334 for each str in arrLocations
1335 if strPathDDK = "" then
1336 if CheckForWinDDKSub(str, True) then strPathDDK = str
1337 end if
1338 next
1339
1340 ' The tools location (post).
1341 if (strPathDDK = "") And (g_blnInternalFirst = False) then
1342 str = g_strPathDev & "/win.x86/ddk/7600.16385.1"
1343 if CheckForWinDDKSub(str, False) then strPathDDK = str
1344 end if
1345
1346 ' Give up.
1347 if strPathDDK = "" then
1348 MsgError "Cannot find the Windows DDK v7.1. Check configure.log and the build requirements."
1349 exit sub
1350 end if
1351
1352 '
1353 ' Emit the config.
1354 '
1355 strPathDDK = UnixSlashes(PathAbs(strPathDDK))
1356 CfgPrint "PATH_SDK_WINDDK71 := " & strPathDDK
1357
1358 PrintResult "Windows DDK v7.1", strPathDDK
1359 g_strPathDDK = strPathDDK
1360end sub
1361
1362'' Quick check if the DDK is in the specified directory or not.
1363function CheckForWinDDKSub(strPathDDK, blnCheckBuild)
1364 CheckForWinDDKSub = False
1365 LogPrint "trying: strPathDDK=" & strPathDDK & " blnCheckBuild=" & blnCheckBuild
1366 if LogFileExists(strPathDDK, "inc/api/ntdef.h") _
1367 And LogFileExists(strPathDDK, "lib/win7/i386/int64.lib") _
1368 And LogFileExists(strPathDDK, "lib/wlh/i386/int64.lib") _
1369 And LogFileExists(strPathDDK, "lib/wnet/i386/int64.lib") _
1370 And LogFileExists(strPathDDK, "lib/wxp/i386/int64.lib") _
1371 And Not LogFileExists(strPathDDK, "lib/win8/i386/int64.lib") _
1372 And LogFileExists(strPathDDK, "bin/x86/rc.exe") _
1373 then
1374 if Not blnCheckBuild then
1375 CheckForWinDDKSub = True
1376 '' @todo Find better build check.
1377 elseif Shell("""" & DosSlashes(strPathDDK & "/bin/x86/rc.exe") & """" , True) <> 0 _
1378 And InStr(1, g_strShellOutput, "Resource Compiler Version 6.1.") > 0 then
1379 CheckForWinDDKSub = True
1380 end if
1381 end if
1382end function
1383
1384
1385''
1386' Finds midl.exe
1387sub CheckForMidl()
1388 dim strMidl
1389 PrintHdr "Midl.exe"
1390
1391 ' Skip if no COM/ATL.
1392 if g_blnDisableCOM then
1393 PrintResultMsg "Midl", "Skipped (" & g_strDisableCOM & ")"
1394 exit sub
1395 end if
1396
1397 if LogFileExists(g_strPathPSDK, "bin/Midl.exe") then
1398 strMidl = g_strPathPSDK & "/bin/Midl.exe"
1399 elseif LogFileExists(g_strPathVCC, "Common7/Tools/Bin/Midl.exe") then
1400 strMidl = g_strPathVCC & "/Common7/Tools/Bin/Midl.exe"
1401 elseif LogFileExists(g_strPathDDK, "bin/x86/Midl.exe") then
1402 strMidl = g_strPathDDK & "/bin/x86/Midl.exe"
1403 elseif LogFileExists(g_strPathDDK, "bin/Midl.exe") then
1404 strMidl = g_strPathDDK & "/bin/Midl.exe"
1405 elseif LogFileExists(g_strPathDev, "win.x86/bin/Midl.exe") then
1406 strMidl = g_strPathDev & "/win.x86/bin/Midl.exe"
1407 else
1408 MsgWarning "Midl.exe not found!"
1409 exit sub
1410 end if
1411
1412 CfgPrint "VBOX_MAIN_IDL := " & strMidl
1413 PrintResult "Midl.exe", strMidl
1414end sub
1415
1416
1417''
1418' Checks for a MinGW32 suitable for building the recompiler.
1419'
1420' strOptW32API is currently ignored.
1421'
1422sub CheckForMinGW32(strOptMinGW32, strOptW32API)
1423 dim strPathMingW32, strPathW32API, str
1424 PrintHdr "MinGW32 GCC v3.3.x + Binutils + Runtime + W32API"
1425
1426 '
1427 ' Find the MinGW and W32API tools.
1428 '
1429 strPathMingW32 = ""
1430 strPathW32API = ""
1431
1432 ' The specified path.
1433 if (strPathMingW32 = "") And (strOptMinGW32 <> "") then
1434 if CheckForMinGW32Sub(strOptMinGW32, strOptW32API) then
1435 strPathMingW32 = strOptMinGW32
1436 strPathW32API = strOptW32API
1437 end if
1438 end if
1439
1440 ' The tools location (first).
1441 if (strPathMingW32 = "") And (g_blnInternalFirst = True) then
1442 str = g_strPathDev & "/win.x86/mingw32/v3.3.3"
1443 str2 = g_strPathDev & "/win.x86/w32api/v2.5"
1444 if CheckForMinGW32Sub(str, str2) then
1445 strPathMingW32 = str
1446 strPathW32API = str2
1447 end if
1448 end if
1449
1450 ' See if there is any gcc around.
1451 if strPathMingW32 = "" then
1452 str = Which("mingw32-gcc.exe")
1453 if (str <> "") then
1454 str = PathParent(PathStripFilename(str))
1455 if CheckForMinGW32Sub(str, str) then strPathMingW32 = str
1456 end if
1457 end if
1458
1459 if strPathMingW32 = "" then
1460 str = Which("gcc.exe")
1461 if (str <> "") then
1462 str = PathParent(PathStripFilename(str))
1463 if CheckForMinGW32Sub(str, str) then strPathMingW32 = str
1464 end if
1465 end if
1466
1467 ' The tools location (post).
1468 if (strPathMingW32 = "") And (g_blnInternalFirst = False) then
1469 str = g_strPathDev & "/win.x86/mingw32/v3.3.3"
1470 str2 = g_strPathDev & "/win.x86/w32api/v2.5"
1471 if CheckForMinGW32Sub(str, str2) then
1472 strPathMingW32 = str
1473 strPathW32API = str2
1474 end if
1475 end if
1476
1477 ' Success?
1478 if strPathMingW32 = "" then
1479 if g_strTargetArch = "amd64" then
1480 MsgWarning "Can't locate a suitable MinGW32 installation, ignoring since we're targeting AMD64 and won't need it."
1481 elseif strOptMinGW32 = "" then
1482 MsgError "Can't locate a suitable MinGW32 installation. Try specify the path with " _
1483 & "the --with-MinGW32=<path> argument. If still no luck, consult the configure.log and the build requirements."
1484 else
1485 MsgError "Can't locate a suitable MinGW32 installation. Please consult the configure.log and the build requirements."
1486 end if
1487 exit sub
1488 end if
1489
1490 '
1491 ' Emit the config.
1492 '
1493 strPathMingW32 = UnixSlashes(PathAbs(strPathMingW32))
1494 CfgPrint "PATH_TOOL_MINGW32 := " & strPathMingW32
1495 PrintResult "MinGW32 (GCC v" & g_strSubOutput & ")", strPathMingW32
1496 if (strPathMingW32 = strPathW32API) Or strPathW32API = "" then
1497 CfgPrint "PATH_SDK_W32API := $(PATH_TOOL_MINGW32)"
1498 else
1499 CfgPrint "PATH_SDK_W32API := " & strPathW32API
1500 PrintResult "W32API", strPathW32API
1501 end if
1502end sub
1503
1504''
1505' Checks if the specified path points to an usable MinGW or not.
1506function CheckForMinGW32Sub(strPathMingW32, strPathW32API)
1507 g_strSubOutput = ""
1508 if strPathW32API = "" then strPathW32API = strPathMingW32
1509 LogPrint "trying: strPathMingW32=" &strPathMingW32 & " strPathW32API=" & strPathW32API
1510
1511 if LogFileExists(strPathMingW32, "bin/mingw32-gcc.exe") _
1512 And LogFileExists(strPathMingW32, "bin/ld.exe") _
1513 And LogFileExists(strPathMingW32, "bin/objdump.exe") _
1514 And LogFileExists(strPathMingW32, "bin/dllwrap.exe") _
1515 And LogFileExists(strPathMingW32, "bin/as.exe") _
1516 And LogFileExists(strPathMingW32, "include/string.h") _
1517 And LogFileExists(strPathMingW32, "include/_mingw.h") _
1518 And LogFileExists(strPathMingW32, "lib/dllcrt1.o") _
1519 And LogFileExists(strPathMingW32, "lib/dllcrt2.o") _
1520 And LogFileExists(strPathMingW32, "lib/libmsvcrt.a") _
1521 _
1522 And LogFileExists(strPathW32API, "lib/libkernel32.a") _
1523 And LogFileExists(strPathW32API, "include/windows.h") _
1524 then
1525 if Shell(DosSlashes(strPathMingW32 & "/bin/gcc.exe") & " --version", True) = 0 then
1526 dim offVer, iMajor, iMinor, iPatch, strVer
1527
1528 ' extract the version.
1529 strVer = ""
1530 offVer = InStr(1, g_strShellOutput, "(GCC) ")
1531 if offVer > 0 then
1532 strVer = LTrim(Mid(g_strShellOutput, offVer + Len("(GCC) ")))
1533 strVer = RTrim(Left(strVer, InStr(1, strVer, " ")))
1534 if (Mid(strVer, 2, 1) = ".") _
1535 And (Mid(strVer, 4, 1) = ".") then
1536 iMajor = Int(Left(strVer, 1)) ' Is Int() the right thing here? I want atoi()!!!
1537 iMinor = Int(Mid(strVer, 3, 1))
1538 iPatch = Int(Mid(strVer, 5))
1539 else
1540 LogPrint "Malformed version: '" & strVer & "'"
1541 strVer = ""
1542 end if
1543 end if
1544 if strVer <> "" then
1545 if (iMajor = 3) And (iMinor = 3) then
1546 CheckForMinGW32Sub = True
1547 g_strSubOutput = strVer
1548 else
1549 LogPrint "MinGW32 version '" & iMajor & "." & iMinor & "." & iPatch & "' is not supported (or configure.vbs failed to parse it correctly)."
1550 end if
1551 else
1552 LogPrint "Couldn't locate the GCC version in the output!"
1553 end if
1554
1555 else
1556 LogPrint "Failed to run gcc.exe!"
1557 end if
1558 end if
1559end function
1560
1561
1562''
1563' Checks for a MinGW-w64 suitable for building the recompiler.
1564sub CheckForMinGWw64(strOptMinGWw64)
1565 dim strPathMingWw64, str
1566 PrintHdr "MinGW-w64 GCC (unprefixed)"
1567
1568 '
1569 ' Find the MinGW-w64 tools.
1570 '
1571 strPathMingWw64 = ""
1572
1573 ' The specified path.
1574 if (strPathMingWw64 = "") And (strOptMinGWw64 <> "") then
1575 if CheckForMinGWw64Sub(strOptMinGWw64) then
1576 strPathMingWw64 = strOptMinGWw64
1577 end if
1578 end if
1579
1580 ' The tools location (first).
1581 if (strPathMinGWw64 = "") And (g_blnInternalFirst = True) then
1582 str = g_strPathDev & "/win.amd64/mingw-w64/r1"
1583 if CheckForMinGWw64Sub(str) then
1584 strPathMinGWw64 = str
1585 end if
1586 end if
1587
1588 ' See if there is any gcc around.
1589 if strPathMinGWw64 = "" then
1590 str = Which("x86_64-w64-mingw32-gcc.exe")
1591 if (str <> "") then
1592 str = PathParent(PathStripFilename(str))
1593 if CheckForMinGWw64Sub(str) then strPathMinGWw64 = str
1594 end if
1595 end if
1596
1597 if strPathMinGWw64 = "" then
1598 str = Which("gcc.exe")
1599 if (str <> "") then
1600 str = PathParent(PathStripFilename(str))
1601 if CheckForMinGWw64Sub(str) then strPathMinGWw64 = str
1602 end if
1603 end if
1604
1605 ' The tools location (post).
1606 if (strPathMinGWw64 = "") And (g_blnInternalFirst = False) then
1607 str = g_strPathDev & "/win.amd64/mingw-w64/r1"
1608 if CheckForMinGWw64Sub(str) then
1609 strPathMinGWw64 = str
1610 end if
1611 end if
1612
1613 ' Success?
1614 if strPathMinGWw64 = "" then
1615 if g_strTargetArch = "x86" then
1616 MsgWarning "Can't locate a suitable MinGW-w64 installation, ignoring since we're targeting x86 and won't need it."
1617 elseif strOptMinGWw64 = "" then
1618 MsgError "Can't locate a suitable MinGW-w64 installation. Try specify the path with " _
1619 & "the --with-MinGW-w64=<path> argument. If still no luck, consult the configure.log and the build requirements."
1620 else
1621 MsgError "Can't locate a suitable MinGW-w64 installation. Please consult the configure.log and the build requirements."
1622 end if
1623 exit sub
1624 end if
1625
1626 '
1627 ' Emit the config.
1628 '
1629 strPathMinGWw64 = UnixSlashes(PathAbs(strPathMinGWw64))
1630 CfgPrint "PATH_TOOL_MINGWW64 := " & strPathMinGWw64
1631 PrintResult "MinGW-w64 (GCC v" & g_strSubOutput & ")", strPathMinGWw64
1632end sub
1633
1634''
1635' Checks if the specified path points to an usable MinGW-w64 or not.
1636function CheckForMinGWw64Sub(strPathMinGWw64)
1637 g_strSubOutput = ""
1638 LogPrint "trying: strPathMinGWw64=" &strPathMinGWw64
1639
1640 if LogFileExists(strPathMinGWw64, "bin/gcc.exe") _
1641 And LogFileExists(strPathMinGWw64, "bin/ld.exe") _
1642 And LogFileExists(strPathMinGWw64, "bin/objdump.exe") _
1643 And LogFileExists(strPathMinGWw64, "bin/dllwrap.exe") _
1644 And LogFileExists(strPathMinGWw64, "bin/dlltool.exe") _
1645 And LogFileExists(strPathMinGWw64, "bin/as.exe") _
1646 And LogFileExists(strPathMinGWw64, "include/bfd.h") _
1647 And LogFileExists(strPathMinGWw64, "lib64/libgcc_s.a") _
1648 And LogFileExists(strPathMinGWw64, "x86_64-w64-mingw32/lib/dllcrt1.o") _
1649 And LogFileExists(strPathMinGWw64, "x86_64-w64-mingw32/lib/dllcrt2.o") _
1650 And LogFileExists(strPathMinGWw64, "x86_64-w64-mingw32/lib/libmsvcrt.a") _
1651 And LogFileExists(strPathMinGWw64, "x86_64-w64-mingw32/lib/libmsvcr100.a") _
1652 And LogFileExists(strPathMinGWw64, "x86_64-w64-mingw32/include/_mingw.h") _
1653 And LogFileExists(strPathMinGWw64, "x86_64-w64-mingw32/include/stdint.h") _
1654 And LogFileExists(strPathMinGWw64, "x86_64-w64-mingw32/include/windows.h") _
1655 then
1656 if Shell(DosSlashes(strPathMinGWw64 & "/bin/gcc.exe") & " -dumpversion", True) = 0 then
1657 dim offVer, iMajor, iMinor, iPatch, strVer
1658
1659 ' extract the version.
1660 strVer = Trim(Replace(Replace(g_strShellOutput, vbCr, ""), vbLf, ""))
1661 if (Mid(strVer, 2, 1) = ".") _
1662 And (Mid(strVer, 4, 1) = ".") then
1663 iMajor = Int(Left(strVer, 1)) ' Is Int() the right thing here? I want atoi()!!!
1664 iMinor = Int(Mid(strVer, 3, 1))
1665 iPatch = Int(Mid(strVer, 5))
1666 else
1667 LogPrint "Malformed version: '" & strVer & "'"
1668 strVer = ""
1669 end if
1670 if strVer <> "" then
1671 if (iMajor = 4) And (iMinor >= 4) then
1672 CheckForMinGWw64Sub = True
1673 g_strSubOutput = strVer
1674 else
1675 LogPrint "MinGW-w64 version '" & iMajor & "." & iMinor & "." & iPatch & "' is not supported (or configure.vbs failed to parse it correctly)."
1676 end if
1677 else
1678 LogPrint "Couldn't locate the GCC version in the output!"
1679 end if
1680
1681 else
1682 LogPrint "Failed to run gcc.exe!"
1683 end if
1684 end if
1685end function
1686
1687
1688''
1689' Checks for any libSDL binaries.
1690sub CheckForlibSDL(strOptlibSDL)
1691 dim strPathlibSDL, str
1692 PrintHdr "libSDL"
1693
1694 '
1695 ' Try find some SDL library.
1696 '
1697
1698 ' First, the specific location.
1699 strPathlibSDL = ""
1700 if (strPathlibSDL = "") And (strOptlibSDL <> "") then
1701 if CheckForlibSDLSub(strOptlibSDL) then strPathlibSDL = strOptlibSDL
1702 end if
1703
1704 ' The tools location (first).
1705 if (strPathlibSDL = "") And (g_blnInternalFirst = True) Then
1706 str = g_strPathDev & "/win.x86/libsdl/v1.2.11"
1707 if CheckForlibSDLSub(str) then strPathlibSDL = str
1708 end if
1709
1710 if (strPathlibSDL = "") And (g_blnInternalFirst = True) Then
1711 str = g_strPathDev & "/win.x86/libsdl/v1.2.7-InnoTek"
1712 if CheckForlibSDLSub(str) then strPathlibSDL = str
1713 end if
1714
1715 ' Poke about in the path.
1716 str = Which("SDLmain.lib")
1717 if (strPathlibSDL = "") And (str <> "") Then
1718 str = PathParent(PathStripFilename(str))
1719 if CheckForlibSDLSub(str) then strPathlibSDL = str
1720 end if
1721
1722 str = Which("SDL.dll")
1723 if (strPathlibSDL = "") And (str <> "") Then
1724 str = PathParent(PathStripFilename(str))
1725 if CheckForlibSDLSub(str) then strPathlibSDL = str
1726 end if
1727
1728 ' The tools location (post).
1729 if (strPathlibSDL = "") And (g_blnInternalFirst = False) Then
1730 str = g_strPathDev & "/win.x86/libsdl/v1.2.11"
1731 if CheckForlibSDLSub(str) then strPathlibSDL = str
1732 end if
1733
1734 if (strPathlibSDL = "") And (g_blnInternalFirst = False) Then
1735 str = g_strPathDev & "/win.x86/libsdl/v1.2.7-InnoTek"
1736 if CheckForlibSDLSub(str) then strPathlibSDL = str
1737 end if
1738
1739 ' Success?
1740 if strPathlibSDL = "" then
1741 if strOptlibSDL = "" then
1742 MsgError "Can't locate libSDL. Try specify the path with the --with-libSDL=<path> argument. " _
1743 & "If still no luck, consult the configure.log and the build requirements."
1744 else
1745 MsgError "Can't locate libSDL. Please consult the configure.log and the build requirements."
1746 end if
1747 exit sub
1748 end if
1749
1750 strPathLibSDL = UnixSlashes(PathAbs(strPathLibSDL))
1751 CfgPrint "PATH_SDK_LIBSDL := " & strPathlibSDL
1752
1753 PrintResult "libSDL", strPathlibSDL
1754end sub
1755
1756''
1757' Checks if the specified path points to an usable libSDL or not.
1758function CheckForlibSDLSub(strPathlibSDL)
1759 CheckForlibSDLSub = False
1760 LogPrint "trying: strPathlibSDL=" & strPathlibSDL
1761 if LogFileExists(strPathlibSDL, "lib/SDL.lib") _
1762 And LogFileExists(strPathlibSDL, "lib/SDLmain.lib") _
1763 And LogFileExists(strPathlibSDL, "lib/SDL.dll") _
1764 And LogFileExists(strPathlibSDL, "include/SDL.h") _
1765 And LogFileExists(strPathlibSDL, "include/SDL_syswm.h") _
1766 And LogFileExists(strPathlibSDL, "include/SDL_version.h") _
1767 then
1768 CheckForlibSDLSub = True
1769 end if
1770end function
1771
1772
1773''
1774' Checks for libxml2.
1775sub CheckForXml2(strOptXml2)
1776 dim strPathXml2, str
1777 PrintHdr "libxml2"
1778
1779 ' Skip if no COM/ATL.
1780 if g_blnDisableCOM then
1781 PrintResultMsg "libxml2", "Skipped (" & g_strDisableCOM & ")"
1782 exit sub
1783 end if
1784
1785 '
1786 ' Try find some xml2 dll/lib.
1787 '
1788 strPathXml2 = ""
1789 if (strPathXml2 = "") And (strOptXml2 <> "") then
1790 if CheckForXml2Sub(strOptXml2) then strPathXml2 = strOptXml2
1791 end if
1792
1793 if strPathXml2 = "" Then
1794 str = Which("libxml2.lib")
1795 if str <> "" Then
1796 str = PathParent(PathStripFilename(str))
1797 if CheckForXml2Sub(str) then strPathXml2 = str
1798 end if
1799 end if
1800
1801 ' Ignore failure if we're in 'internal' mode.
1802 if (strPathXml2 = "") and g_blnInternalMode then
1803 PrintResultMsg "libxml2", "ignored (internal mode)"
1804 exit sub
1805 end if
1806
1807 ' Success?
1808 if strPathXml2 = "" then
1809 if strOptXml2 = "" then
1810 MsgError "Can't locate libxml2. Try specify the path with the --with-libxml2=<path> argument. " _
1811 & "If still no luck, consult the configure.log and the build requirements."
1812 else
1813 MsgError "Can't locate libxml2. Please consult the configure.log and the build requirements."
1814 end if
1815 exit sub
1816 end if
1817
1818 strPathXml2 = UnixSlashes(PathAbs(strPathXml2))
1819 CfgPrint "SDK_VBOX_LIBXML2_INCS := " & strPathXml2 & "/include"
1820 CfgPrint "SDK_VBOX_LIBXML2_LIBS := " & strPathXml2 & "/lib/libxml2.lib"
1821
1822 PrintResult "libxml2", strPathXml2
1823end sub
1824
1825''
1826' Checks if the specified path points to an usable libxml2 or not.
1827function CheckForXml2Sub(strPathXml2)
1828 dim str
1829
1830 CheckForXml2Sub = False
1831 LogPrint "trying: strPathXml2=" & strPathXml2
1832 if LogFileExists(strPathXml2, "include/libxml/xmlexports.h") _
1833 And LogFileExists(strPathXml2, "include/libxml/xmlreader.h") _
1834 then
1835 str = LogFindFile(strPathXml2, "bin/libxml2.dll")
1836 if str <> "" then
1837 if LogFindFile(strPathXml2, "lib/libxml2.lib") <> "" then
1838 CheckForXml2Sub = True
1839 end if
1840 end if
1841 end if
1842end function
1843
1844
1845''
1846' Checks for openssl
1847sub CheckForSsl(strOptSsl, bln32Bit)
1848 dim strPathSsl, str
1849 PrintHdr "openssl"
1850
1851 strOpenssl = "openssl"
1852 if bln32Bit = True then
1853 strOpenssl = "openssl32"
1854 end if
1855
1856 '
1857 ' Try find some openssl dll/lib.
1858 '
1859 strPathSsl = ""
1860 if (strPathSsl = "") And (strOptSsl <> "") then
1861 if CheckForSslSub(strOptSsl) then strPathSsl = strOptSsl
1862 end if
1863
1864 if strPathSsl = "" Then
1865 str = Which("libssl.lib")
1866 if str <> "" Then
1867 str = PathParent(PathStripFilename(str))
1868 if CheckForSslSub(str) then strPathSsl = str
1869 end if
1870 end if
1871
1872 ' Ignore failure if we're in 'internal' mode.
1873 if (strPathSsl = "") and g_blnInternalMode then
1874 PrintResultMsg strOpenssl, "ignored (internal mode)"
1875 exit sub
1876 end if
1877
1878 ' Success?
1879 if strPathSsl = "" then
1880 if strOptSsl = "" then
1881 MsgError "Can't locate " & strOpenssl & ". " _
1882 & "Try specify the path with the --with-" & strOpenssl & "=<path> argument. " _
1883 & "If still no luck, consult the configure.log and the build requirements."
1884 else
1885 MsgError "Can't locate " & strOpenssl & ". " _
1886 & "Please consult the configure.log and the build requirements."
1887 end if
1888 exit sub
1889 end if
1890
1891 strPathSsl = UnixSlashes(PathAbs(strPathSsl))
1892 if bln32Bit = True then
1893 CfgPrint "SDK_VBOX_OPENSSL-x86_INCS := " & strPathSsl & "/include"
1894 CfgPrint "SDK_VBOX_OPENSSL-x86_LIBS := " & strPathSsl & "/lib/libcrypto.lib" & " " & strPathSsl & "/lib/libssl.lib"
1895 CfgPrint "SDK_VBOX_BLD_OPENSSL-x86_LIBS := " & strPathSsl & "/lib/libcrypto.lib" & " " & strPathSsl & "/lib/libssl.lib"
1896 else
1897 CfgPrint "SDK_VBOX_OPENSSL_INCS := " & strPathSsl & "/include"
1898 CfgPrint "SDK_VBOX_OPENSSL_LIBS := " & strPathSsl & "/lib/libcrypto.lib" & " " & strPathSsl & "/lib/libssl.lib"
1899 CfgPrint "SDK_VBOX_BLD_OPENSSL_LIBS := " & strPathSsl & "/lib/libcrypto.lib" & " " & strPathSsl & "/lib/libssl.lib"
1900 end if
1901
1902 PrintResult strOpenssl, strPathSsl
1903end sub
1904
1905''
1906' Checks if the specified path points to an usable openssl or not.
1907function CheckForSslSub(strPathSsl)
1908
1909 CheckForSslSub = False
1910 LogPrint "trying: strPathSsl=" & strPathSsl
1911 if LogFileExists(strPathSsl, "include/openssl/md5.h") _
1912 And LogFindFile(strPathSsl, "lib/libssl.lib") <> "" _
1913 then
1914 CheckForSslSub = True
1915 end if
1916end function
1917
1918
1919''
1920' Checks for libcurl
1921sub CheckForCurl(strOptCurl, bln32Bit)
1922 dim strPathCurl, str
1923 PrintHdr "libcurl"
1924
1925 strCurl = "libcurl"
1926 if bln32Bit = True then
1927 strCurl = "libcurl32"
1928 end if
1929
1930 '
1931 ' Try find some cURL dll/lib.
1932 '
1933 strPathCurl = ""
1934 if (strPathCurl = "") And (strOptCurl <> "") then
1935 if CheckForCurlSub(strOptCurl) then strPathCurl = strOptCurl
1936 end if
1937
1938 if strPathCurl = "" Then
1939 str = Which("libcurl.lib")
1940 if str <> "" Then
1941 str = PathParent(PathStripFilename(str))
1942 if CheckForCurlSub(str) then strPathCurl = str
1943 end if
1944 end if
1945
1946 ' Ignore failure if we're in 'internal' mode.
1947 if (strPathCurl = "") and g_blnInternalMode then
1948 PrintResultMsg strCurl, "ignored (internal mode)"
1949 exit sub
1950 end if
1951
1952 ' Success?
1953 if strPathCurl = "" then
1954 if strOptCurl = "" then
1955 MsgError "Can't locate " & strCurl & ". " _
1956 & "Try specify the path with the --with-" & strCurl & "=<path> argument. " _
1957 & "If still no luck, consult the configure.log and the build requirements."
1958 else
1959 MsgError "Can't locate " & strCurl & ". " _
1960 & "Please consult the configure.log and the build requirements."
1961 end if
1962 exit sub
1963 end if
1964
1965 strPathCurl = UnixSlashes(PathAbs(strPathCurl))
1966 if bln32Bit = True then
1967 CfgPrint "SDK_VBOX_LIBCURL-x86_INCS := " & strPathCurl & "/include"
1968 CfgPrint "SDK_VBOX_LIBCURL-x86_LIBS.x86 := " & strPathCurl & "/libcurl.lib"
1969 else
1970 CfgPrint "SDK_VBOX_LIBCURL_INCS := " & strPathCurl & "/include"
1971 CfgPrint "SDK_VBOX_LIBCURL_LIBS := " & strPathCurl & "/libcurl.lib"
1972 end if
1973
1974 PrintResult strCurl, strPathCurl
1975end sub
1976
1977''
1978' Checks if the specified path points to an usable libcurl or not.
1979function CheckForCurlSub(strPathCurl)
1980
1981 CheckForCurlSub = False
1982 LogPrint "trying: strPathCurl=" & strPathCurl
1983 if LogFileExists(strPathCurl, "include/curl/curl.h") _
1984 And LogFindFile(strPathCurl, "libcurl.dll") <> "" _
1985 And LogFindFile(strPathCurl, "libcurl.lib") <> "" _
1986 then
1987 CheckForCurlSub = True
1988 end if
1989end function
1990
1991
1992
1993''
1994' Checks for any Qt5 binaries.
1995sub CheckForQt(strOptQt5)
1996 PrintHdr "Qt5"
1997
1998 '
1999 ' Try to find the Qt5 installation (user specified path with --with-qt5)
2000 '
2001 strPathQt5 = ""
2002
2003 LogPrint "Checking for user specified path of Qt5 ... "
2004 if (strPathQt5 = "") And (strOptQt5 <> "") then
2005 strOptQt5 = UnixSlashes(strOptQt5)
2006 if CheckForQt5Sub(strOptQt5) then strPathQt5 = strOptQt5
2007 end if
2008
2009 ' Check the dev tools
2010 if (strPathQt5 = "") Then
2011 strPathQt5 = g_strPathDev & "/win." & g_strTargetArch & "/qt/v5.5.1-r138"
2012 if CheckForQt5Sub(strPathQt5) = False then strPathQt5 = ""
2013 end if
2014
2015 ' Display the result.
2016 if strPathQt5 = "" then
2017 PrintResultMsg "Qt5", "not found"
2018 else
2019 PrintResult "Qt5", strPathQt5
2020 end if
2021
2022 if strPathQt5 <> "" then
2023 CfgPrint "PATH_SDK_QT5 := " & strPathQt5
2024 CfgPrint "PATH_TOOL_QT5 := $(PATH_SDK_QT5)"
2025 CfgPrint "VBOX_PATH_QT := $(PATH_SDK_QT5)"
2026 end if
2027 if strPathQt5 = "" then
2028 CfgPrint "VBOX_WITH_QTGUI :="
2029 end if
2030end sub
2031
2032
2033''
2034' Checks if the specified path points to an usable Qt5 library.
2035function CheckForQt5Sub(strPathQt5)
2036
2037 CheckForQt5Sub = False
2038 LogPrint "trying: strPathQt5=" & strPathQt5
2039
2040 if LogFileExists(strPathQt5, "bin/moc.exe") _
2041 And LogFileExists(strPathQt5, "bin/uic.exe") _
2042 And LogFileExists(strPathQt5, "include/QtWidgets/qwidget.h") _
2043 And LogFileExists(strPathQt5, "include/QtWidgets/QApplication") _
2044 And LogFileExists(strPathQt5, "include/QtGui/QImage") _
2045 And LogFileExists(strPathQt5, "include/QtNetwork/QHostAddress") _
2046 And ( LogFileExists(strPathQt5, "lib/Qt5Core.lib") _
2047 Or LogFileExists(strPathQt5, "lib/Qt5CoreVBox.lib")) _
2048 And ( LogFileExists(strPathQt5, "lib/Qt5Network.lib") _
2049 Or LogFileExists(strPathQt5, "lib/Qt5NetworkVBox.lib")) _
2050 then
2051 CheckForQt5Sub = True
2052 end if
2053
2054end function
2055
2056
2057'
2058'
2059function CheckForPython(strPathPython)
2060
2061 PrintHdr "Python"
2062
2063 CheckForPython = False
2064 LogPrint "trying: strPathPython=" & strPathPython
2065
2066 if LogFileExists(strPathPython, "python.exe") then
2067 CfgPrint "VBOX_BLD_PYTHON := " & strPathPython & "\python.exe"
2068 CheckForPython = True
2069 end if
2070
2071 PrintResult "Python ", strPathPython
2072end function
2073
2074
2075'
2076'
2077function CheckForMkisofs(strFnameMkisofs)
2078
2079 PrintHdr "mkisofs"
2080
2081 CheckForMkisofs = False
2082 LogPrint "trying: strFnameMkisofs=" & strFnameMkisofs
2083
2084 if FileExists(strFnameMkisofs) = false then
2085 LogPrint "Testing '" & strFnameMkisofs & " not found"
2086 else
2087 CfgPrint "VBOX_MKISOFS := " & strFnameMkisofs
2088 CheckForMkisofs = True
2089 end if
2090
2091 PrintResult "mkisofs ", strFnameMkisofs
2092end function
2093
2094
2095''
2096' Show usage.
2097sub usage
2098 Print "Usage: cscript configure.vbs [options]"
2099 Print ""
2100 Print "Configuration:"
2101 Print " -h, --help"
2102 Print " --internal"
2103 Print " --internal-last"
2104 Print " --target-arch=x86|amd64"
2105 Print ""
2106 Print "Components:"
2107 Print " --disable-COM"
2108 Print " --disable-UDPTunnel"
2109 Print " --disable-SDL"
2110 Print ""
2111 Print "Locations:"
2112 Print " --with-kBuild=PATH "
2113 Print " --with-libSDL=PATH "
2114 Print " --with-MinGW32=PATH "
2115 Print " --with-MinGW-w64=PATH "
2116 Print " --with-Qt5=PATH "
2117 Print " --with-DDK=PATH "
2118 Print " --with-SDK=PATH "
2119 Print " --with-VC=PATH "
2120 Print " --with-VC-Common=PATH "
2121 Print " --with-VC-Express-Edition"
2122 Print " --with-W32API=PATH "
2123 Print " --with-libxml2=PATH "
2124 Print " --with-openssl=PATH "
2125 Print " --with-openssl32=PATH (only for 64-bit targets)"
2126 Print " --with-libcurl=PATH "
2127 Print " --with-libcurl32=PATH (only for 64-bit targets)"
2128 Print " --with-python=PATH "
2129 Print " --with-mkisofs=PATH "
2130end sub
2131
2132
2133''
2134' The main() like function.
2135'
2136Sub Main
2137 '
2138 ' Write the log header and check that we're not using wscript.
2139 '
2140 LogInit
2141 If UCase(Right(Wscript.FullName, 11)) = "WSCRIPT.EXE" Then
2142 Wscript.Echo "This script must be run under CScript."
2143 Wscript.Quit(1)
2144 End If
2145
2146 '
2147 ' Parse arguments.
2148 '
2149 strOptDDK = ""
2150 strOptDXDDK = ""
2151 strOptkBuild = ""
2152 strOptlibSDL = ""
2153 strOptMinGW32 = ""
2154 strOptMinGWw64 = ""
2155 strOptQt5 = ""
2156 strOptSDK = ""
2157 strOptVC = ""
2158 strOptVCCommon = ""
2159 blnOptVCExpressEdition = False
2160 strOptW32API = ""
2161 strOptXml2 = ""
2162 strOptSsl = ""
2163 strOptSsl32 = ""
2164 strOptCurl = ""
2165 strOptCurl32 = ""
2166 strOptPython = ""
2167 strOptMkisofs = ""
2168 blnOptDisableCOM = False
2169 blnOptDisableUDPTunnel = False
2170 blnOptDisableSDL = False
2171 for i = 1 to Wscript.Arguments.Count
2172 dim str, strArg, strPath
2173
2174 ' Separate argument and path value
2175 str = Wscript.Arguments.item(i - 1)
2176 if InStr(1, str, "=") > 0 then
2177 strArg = Mid(str, 1, InStr(1, str, "=") - 1)
2178 strPath = Mid(str, InStr(1, str, "=") + 1)
2179 if strPath = "" then MsgFatal "Syntax error! Argument #" & i & " is missing the path."
2180 else
2181 strArg = str
2182 strPath = ""
2183 end if
2184
2185 ' Process the argument
2186 select case LCase(strArg)
2187 case "--with-ddk"
2188 strOptDDK = strPath
2189 case "--with-dxsdk"
2190 MsgWarning "Ignoring --with-dxsdk (the DirectX SDK is no longer required)."
2191 case "--with-kbuild"
2192 strOptkBuild = strPath
2193 case "--with-libsdl"
2194 strOptlibSDL = strPath
2195 case "--with-mingw32"
2196 strOptMinGW32 = strPath
2197 case "--with-mingw-w64"
2198 strOptMinGWw64 = strPath
2199 case "--with-qt5"
2200 strOptQt5 = strPath
2201 case "--with-sdk"
2202 strOptSDK = strPath
2203 case "--with-vc"
2204 strOptVC = strPath
2205 case "--with-vc-common"
2206 strOptVCCommon = strPath
2207 case "--with-vc-express-edition"
2208 blnOptVCExpressEdition = True
2209 case "--with-w32api"
2210 strOptW32API = strPath
2211 case "--with-libxml2"
2212 strOptXml2 = strPath
2213 case "--with-openssl"
2214 strOptSsl = strPath
2215 case "--with-openssl32"
2216 strOptSsl32 = strPath
2217 case "--with-libcurl"
2218 strOptCurl = strPath
2219 case "--with-libcurl32"
2220 strOptCurl32 = strPath
2221 case "--with-python"
2222 strOptPython = strPath
2223 case "--with-mkisofs"
2224 strOptMkisofs = strPath
2225 case "--disable-com"
2226 blnOptDisableCOM = True
2227 case "--enable-com"
2228 blnOptDisableCOM = False
2229 case "--disable-udptunnel"
2230 blnOptDisableUDPTunnel = True
2231 case "--disable-sdl"
2232 blnOptDisableSDL = True
2233 case "--internal"
2234 g_blnInternalMode = True
2235 case "--internal-last"
2236 g_blnInternalFirst = False
2237 case "--target-arch"
2238 g_strTargetArch = strPath
2239 case "-h", "--help", "-?"
2240 usage
2241 Wscript.Quit(0)
2242 case else
2243 Wscript.echo "syntax error: Unknown option '" & str &"'."
2244 usage
2245 Wscript.Quit(1)
2246 end select
2247 next
2248
2249 '
2250 ' Initialize output files.
2251 '
2252 CfgInit
2253 EnvInit
2254
2255 '
2256 ' Check that the Shell function is sane.
2257 '
2258 g_objShell.Environment("PROCESS")("TESTING_ENVIRONMENT_INHERITANCE") = "This works"
2259 if Shell("set TESTING_ENVIRONMENT_INHERITANC", False) <> 0 then ' The 'E' is missing on purpose (4nt).
2260 MsgFatal "shell execution test failed!"
2261 end if
2262 if g_strShellOutput <> "TESTING_ENVIRONMENT_INHERITANCE=This works" & CHR(13) & CHR(10) then
2263 Print "Shell test Test -> '" & g_strShellOutput & "'"
2264 MsgFatal "shell inheritance or shell execution isn't working right. Make sure you use cmd.exe."
2265 end if
2266 g_objShell.Environment("PROCESS")("TESTING_ENVIRONMENT_INHERITANCE") = ""
2267 Print "Shell inheritance test: OK"
2268
2269 '
2270 ' Do the checks.
2271 '
2272 if blnOptDisableCOM = True then
2273 DisableCOM "--disable-com"
2274 end if
2275 if blnOptDisableUDPTunnel = True then
2276 DisableUDPTunnel "--disable-udptunnel"
2277 end if
2278 CheckSourcePath
2279 CheckForkBuild strOptkBuild
2280 CheckForWinDDK strOptDDK
2281 CfgPrint "VBOX_WITH_WDDM_W8 := " '' @todo look for WinDDKv8
2282 CheckForVisualCPP strOptVC, strOptVCCommon, blnOptVCExpressEdition
2283 CheckForPlatformSDK strOptSDK
2284 CheckForMidl
2285 CheckForMinGW32 strOptMinGW32, strOptW32API
2286 CheckForMinGWw64 strOptMinGWw64
2287 CfgPrint "VBOX_WITH_OPEN_WATCOM := " '' @todo look for openwatcom 1.9+
2288 EnvPrint "set PATH=%PATH%;" & g_strPath& "/tools/win." & g_strTargetArch & "/bin;" '' @todo look for yasm
2289 if blnOptDisableSDL = True then
2290 DisableSDL "--disable-sdl"
2291 else
2292 CheckForlibSDL strOptlibSDL
2293 end if
2294 ' Don't check for this library by default as it's part of the tarball
2295 ' Using an external library can add a dependency to iconv
2296 if (strOptXml2 <> "") then
2297 CheckForXml2 strOptXml2
2298 end if
2299 CheckForSsl strOptSsl, False
2300 if g_strTargetArch = "amd64" then
2301 ' 32-bit openssl required as well
2302 CheckForSsl strOptSsl32, True
2303 end if
2304 CheckForCurl strOptCurl, False
2305 if g_strTargetArch = "amd64" then
2306 ' 32-bit Curl required as well
2307 CheckForCurl strOptCurl32, True
2308 end if
2309 CheckForQt strOptQt5
2310 if (strOptPython <> "") then
2311 CheckForPython strOptPython
2312 end if
2313 if (strOptMkisofs <> "") then
2314 CheckForMkisofs strOptMkisofs
2315 end if
2316 if g_blnInternalMode then
2317 EnvPrint "call " & g_strPathDev & "/env.cmd %1 %2 %3 %4 %5 %6 %7 %8 %9"
2318 end if
2319
2320 Print ""
2321 Print "Execute env.bat once before you start to build VBox:"
2322 Print ""
2323 Print " env.bat"
2324 Print " kmk"
2325 Print ""
2326
2327End Sub
2328
2329
2330Main
2331
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette