VirtualBox

source: vbox/trunk/configure.vbs@ 42551

Last change on this file since 42551 was 42313, checked in by vboxsync, 12 years ago

configure.vbs: Direct X is no longer required.

  • Property svn:eol-style set to CRLF
  • Property svn:keywords set to Id
File size: 69.3 KB
Line 
1' $Id: configure.vbs 42313 2012-07-22 16:27:45Z 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-2012 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 = "x86"
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 end if
722end sub
723
724
725''
726' Prints a string to the config file.
727sub CfgPrint(str)
728 FileAppendLine g_strCfgFile, str
729end sub
730
731
732''
733' Initializes the environment batch script.
734sub EnvInit
735 FileDelete g_strEnvFile
736 EnvPrint "@echo off"
737 EnvPrint "rem"
738 EnvPrint "rem Environment setup script generated by " & GetCommandline()
739 EnvPrint "rem"
740end sub
741
742
743''
744' Prints a string to the environment batch script.
745sub EnvPrint(str)
746 FileAppendLine g_strEnvFile, str
747end sub
748
749
750''
751' No COM
752sub DisableCOM(strReason)
753 if g_blnDisableCOM = False then
754 LogPrint "Disabled COM components: " & strReason
755 g_blnDisableCOM = True
756 g_strDisableCOM = strReason
757 CfgPrint "VBOX_WITH_MAIN="
758 CfgPrint "VBOX_WITH_QTGUI="
759 CfgPrint "VBOX_WITH_VBOXSDL="
760 CfgPrint "VBOX_WITH_DEBUGGER_GUI="
761 CfgPrint "VBOX_WITHOUT_COM=1"
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' Checks the the path doesn't contain characters the tools cannot deal with.
780sub CheckSourcePath
781 dim sPwd
782
783 sPwd = PathAbs(g_strPath)
784 if InStr(1, sPwd, " ") > 0 then
785 MsgError "Source path contains spaces! Please move it. (" & sPwd & ")"
786 end if
787 if InStr(1, sPwd, "$") > 0 then
788 MsgError "Source path contains the '$' char! Please move it. (" & sPwd & ")"
789 end if
790 if InStr(1, sPwd, "%") > 0 then
791 MsgError "Source path contains the '%' char! Please move it. (" & sPwd & ")"
792 end if
793 if InStr(1, sPwd, Chr(10)) > 0 _
794 Or InStr(1, sPwd, Chr(13)) > 0 _
795 Or InStr(1, sPwd, Chr(9)) > 0 _
796 then
797 MsgError "Source path contains control characters! Please move it. (" & sPwd & ")"
798 end if
799 Print "Source path: OK"
800end sub
801
802
803''
804' Checks for kBuild - very simple :)
805sub CheckForkBuild(strOptkBuild)
806 PrintHdr "kBuild"
807
808 '
809 ' Check if there is a 'kmk' in the path somewhere without
810 ' any KBUILD_*PATH stuff around.
811 '
812 blnNeedEnvVars = True
813 g_strPathkBuild = strOptkBuild
814 g_strPathkBuildBin = ""
815 if (g_strPathkBuild = "") _
816 And (EnvGetFirst("KBUILD_PATH", "PATH_KBUILD") = "") _
817 And (EnvGetFirst("KBUILD_BIN_PATH", "PATH_KBUILD_BIN") = "") _
818 And (Shell("kmk.exe --version", True) = 0) _
819 And (InStr(1,g_strShellOutput, "kBuild Make 0.1") > 0) _
820 And (InStr(1,g_strShellOutput, "KBUILD_PATH") > 0) _
821 And (InStr(1,g_strShellOutput, "KBUILD_BIN_PATH") > 0) then
822 '' @todo Need to parse out the KBUILD_PATH and KBUILD_BIN_PATH values to complete the other tests.
823 'blnNeedEnvVars = False
824 MsgWarning "You've installed kBuild it seems. configure.vbs hasn't been updated to " _
825 & "deal with that yet and will use the one it ships with. Sorry."
826 end if
827
828 '
829 ' Check for the KBUILD_PATH env.var. and fall back on root/kBuild otherwise.
830 '
831 if g_strPathkBuild = "" then
832 g_strPathkBuild = EnvGetFirst("KBUILD_PATH", "PATH_KBUILD")
833 if (g_strPathkBuild <> "") and (FileExists(g_strPathkBuild & "/footer.kmk") = False) then
834 MsgWarning "Ignoring incorrect kBuild path (KBUILD_PATH=" & g_strPathkBuild & ")"
835 g_strPathkBuild = ""
836 end if
837
838 if g_strPathkBuild = "" then
839 g_strPathkBuild = g_strPath & "/kBuild"
840 end if
841 end if
842
843 g_strPathkBuild = UnixSlashes(PathAbs(g_strPathkBuild))
844
845 '
846 ' Check for env.vars that kBuild uses (do this early to set g_strTargetArch).
847 '
848 str = EnvGetFirst("KBUILD_TYPE", "BUILD_TYPE")
849 if (str <> "") _
850 And (InStr(1, "|release|debug|profile|kprofile", str) <= 0) then
851 EnvPrint "set KBUILD_TYPE=release"
852 EnvSet "KBUILD_TYPE", "release"
853 MsgWarning "Found unknown KBUILD_TYPE value '" & str &"' in your environment. Setting it to 'release'."
854 end if
855
856 str = EnvGetFirst("KBUILD_TARGET", "BUILD_TARGET")
857 if (str <> "") _
858 And (InStr(1, "win|win32|win64", str) <= 0) then '' @todo later only 'win' will be valid. remember to fix this check!
859 EnvPrint "set KBUILD_TARGET=win"
860 EnvSet "KBUILD_TARGET", "win"
861 MsgWarning "Found unknown KBUILD_TARGET value '" & str &"' in your environment. Setting it to 'win32'."
862 end if
863
864 str = EnvGetFirst("KBUILD_TARGET_ARCH", "BUILD_TARGET_ARCH")
865 if (str <> "") _
866 And (InStr(1, "x86|amd64", str) <= 0) then
867 EnvPrint "set KBUILD_TARGET_ARCH=x86"
868 EnvSet "KBUILD_TARGET_ARCH", "x86"
869 MsgWarning "Found unknown KBUILD_TARGET_ARCH value '" & str &"' in your environment. Setting it to 'x86'."
870 str = "x86"
871 end if
872 if str <> "" then
873 g_strTargetArch = str
874 elseif (EnvGet("PROCESSOR_ARCHITEW6432") = "AMD64" ) _
875 Or (EnvGet("PROCESSOR_ARCHITECTURE") = "AMD64" ) then
876 g_strTargetArch = "amd64"
877 else
878 g_strTargetArch = "x86"
879 end if
880
881 str = EnvGetFirst("KBUILD_TARGET_CPU", "BUILD_TARGET_CPU")
882 ' perhaps a bit pedantic this since this isn't clearly define nor used much...
883 if (str <> "") _
884 And (InStr(1, "i386|i486|i686|i786|i868|k5|k6|k7|k8", str) <= 0) then
885 EnvPrint "set BUILD_TARGET_CPU=i386"
886 EnvSet "KBUILD_TARGET_CPU", "i386"
887 MsgWarning "Found unknown KBUILD_TARGET_CPU value '" & str &"' in your environment. Setting it to 'i386'."
888 end if
889
890 str = EnvGetFirst("KBUILD_HOST", "BUILD_PLATFORM")
891 if (str <> "") _
892 And (InStr(1, "win|win32|win64", str) <= 0) then '' @todo later only 'win' will be valid. remember to fix this check!
893 EnvPrint "set KBUILD_HOST=win"
894 EnvSet "KBUILD_HOST", "win"
895 MsgWarning "Found unknown KBUILD_HOST value '" & str &"' in your environment. Setting it to 'win32'."
896 end if
897
898 str = EnvGetFirst("KBUILD_HOST_ARCH", "BUILD_PLATFORM_ARCH")
899 if (str <> "") _
900 And (InStr(1, "x86|amd64", str) <= 0) then
901 EnvPrint "set KBUILD_HOST_ARCH=x86"
902 EnvSet "KBUILD_HOST_ARCH", "x86"
903 MsgWarning "Found unknown KBUILD_HOST_ARCH value '" & str &"' in your environment. Setting it to 'x86'."
904 end if
905
906 str = EnvGetFirst("KBUILD_HOST_CPU", "BUILD_PLATFORM_CPU")
907 ' perhaps a bit pedantic this since this isn't clearly define nor used much...
908 if (str <> "") _
909 And (InStr(1, "i386|i486|i686|i786|i868|k5|k6|k7|k8", str) <= 0) then
910 EnvPrint "set KBUILD_HOST_CPU=i386"
911 EnvSet "KBUILD_HOST_CPU", "i386"
912 MsgWarning "Found unknown KBUILD_HOST_CPU value '" & str &"' in your environment. Setting it to 'i386'."
913 end if
914
915 '
916 ' Determin the location of the kBuild binaries.
917 '
918 if g_strPathkBuildBin = "" then
919 g_strPathkBuildBin = g_strPathkBuild & "/bin/win." & g_strTargetArch
920 if FileExists(g_strPathkBuild & "/kmk.exe") = False then
921 g_strPathkBuildBin = g_strPathkBuild & "/bin/win.x86"
922 end if
923 end if
924
925 '
926 ' Perform basic validations of the kBuild installation.
927 '
928 if (FileExists(g_strPathkBuild & "/footer.kmk") = False) _
929 Or (FileExists(g_strPathkBuild & "/header.kmk") = False) _
930 Or (FileExists(g_strPathkBuild & "/rules.kmk") = False) then
931 MsgFatal "Can't find valid kBuild at '" & g_strPathkBuild & "'. Either there is an " _
932 & "incorrect KBUILD_PATH in the environment or the checkout didn't succeed."
933 exit sub
934 end if
935 if (FileExists(g_strPathkBuildBin & "/kmk.exe") = False) _
936 Or (FileExists(g_strPathkBuildBin & "/kmk_ash.exe") = False) then
937 MsgFatal "Can't find valid kBuild binaries at '" & g_strPathkBuildBin & "'. Either there is an " _
938 & "incorrect KBUILD_PATH in the environment or the checkout didn't succeed."
939 exit sub
940 end if
941
942 if (Shell(DosSlashes(g_strPathkBuildBin & "/kmk.exe") & " --version", True) <> 0) Then
943 MsgFatal "Can't execute '" & g_strPathkBuildBin & "/kmk.exe --version'. check configure.log for the out."
944 exit sub
945 end if
946
947 '
948 ' If PATH_DEV is set, check that it's pointing to something useful.
949 '
950 str = EnvGet("PATH_DEV")
951 g_strPathDev = str
952 if (str <> "") _
953 And False then '' @todo add some proper tests here.
954 strNew = UnixSlashes(g_strPath & "/tools")
955 EnvPrint "set PATH_DEV=" & strNew
956 EnvSet "PATH_DEV", strNew
957 MsgWarning "Found PATH_DEV='" & str &"' in your environment. Setting it to '" & strNew & "'."
958 g_strPathDev = strNew
959 end if
960 if g_strPathDev = "" then g_strPathDev = UnixSlashes(g_strPath & "/tools")
961
962 '
963 ' Write KBUILD_PATH to the environment script if necessary.
964 '
965 if blnNeedEnvVars = True then
966 EnvPrint "set KBUILD_PATH=" & g_strPathkBuild
967 EnvSet "KBUILD_PATH", g_strPathkBuild
968 EnvPrint "set PATH=" & g_strPathkBuildBin & ";%PATH%"
969 EnvPrepend "PATH", g_strPathkBuildBin & ";"
970 end if
971
972 PrintResult "kBuild", g_strPathkBuild
973 PrintResult "kBuild binaries", g_strPathkBuildBin
974end sub
975
976
977''
978' Checks for Visual C++ version 10 (2010).
979sub CheckForVisualCPP(strOptVC, strOptVCCommon, blnOptVCExpressEdition)
980 dim strPathVC, strPathVCCommon, str, str2, blnNeedMsPDB
981 PrintHdr "Visual C++"
982
983 '
984 ' Try find it...
985 '
986 strPathVC = ""
987 strPathVCCommon = ""
988 if (strPathVC = "") And (strOptVC <> "") then
989 if CheckForVisualCPPSub(strOptVC, strOptVCCommon, blnOptVCExpressEdition) then
990 strPathVC = strOptVC
991 strPathVCCommon = strOptVCCommon
992 end if
993 end if
994
995 if (strPathVC = "") And (g_blnInternalFirst = True) Then
996 strPathVC = g_strPathDev & "/win.x86/vcc/v10sp1"
997 if CheckForVisualCPPSub(strPathVC, "", blnOptVCExpressEdition) = False then
998 strPathVC = ""
999 end if
1000 end if
1001
1002 if (strPathVC = "") _
1003 And (Shell("cl.exe", True) = 0) then
1004 str = Which("cl.exe")
1005 if FileExists(PathStripFilename(strClExe) & "/build.exe") then
1006 ' don't know how to deal with this cl.
1007 Warning "Ignoring DDK cl.exe (" & str & ")."
1008 else
1009 strPathVC = PathParent(PathStripFilename(str))
1010 strPathVCCommon = PathParent(strPathVC) & "/Common7"
1011 end if
1012 end if
1013
1014 if (strPathVC = "") then
1015 str = RegGetString("HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\Setup\VS\ProductDir")
1016 if str <> "" Then
1017 str2 = str & "Common7"
1018 str = str & "VC"
1019 if CheckForVisualCPPSub(str, str2, blnOptVCExpressEdition) then
1020 strPathVC = str
1021 strPathVCCommon = str2
1022 end if
1023 end if
1024 end if
1025
1026 if (strPathVC = "") then
1027 str = RegGetString("HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\Setup\VS\ProductDir")
1028 if str <> "" Then
1029 str2 = str & "Common7"
1030 str = str & "VC"
1031 if CheckForVisualCPPSub(str, str2, blnOptVCExpressEdition) then
1032 strPathVC = str
1033 strPathVCCommon = str2
1034 end if
1035 end if
1036 end if
1037
1038 if (strPathVC = "") And (g_blnInternalFirst = False) Then
1039 strPathVC = g_strPathDev & "/win.x86/vcc/v10sp1"
1040 if CheckForVisualCPPSub(strPathVC, "", blnOptVCExpressEdition) = False then
1041 strPathVC = ""
1042 end if
1043 end if
1044
1045 if strPathVC = "" then
1046 MsgError "Cannot find cl.exe (Visual C++) anywhere on your system. Check the build requirements."
1047 exit sub
1048 end if
1049
1050 '
1051 ' Clean up the path and determin the VC directory.
1052 '
1053 strPathVC = UnixSlashes(PathAbs(strPathVC))
1054 g_strPathVCC = strPathVC
1055
1056 '
1057 ' Check the version.
1058 ' We'll have to make sure mspdbXX.dll is somewhere in the PATH.
1059 '
1060 if (strPathVCCommon <> "") Then
1061 EnvAppend "PATH", ";" & strPathVCCommon & "/IDE"
1062 end if
1063 if Shell(DosSlashes(strPathVC & "/bin/cl.exe"), True) <> 0 then
1064 MsgError "Executing '" & strClExe & "' (which we believe to be the Visual C++ compiler driver) failed."
1065 exit sub
1066 end if
1067
1068 if (InStr(1, g_strShellOutput, "Version 16.") <= 0) _
1069 And (InStr(1, g_strShellOutput, "Version 17.") <= 0) then
1070 MsgError "The Visual C++ compiler we found ('" & strPathVC & "') isn't 10.0 or 11.0. Check the build requirements."
1071 exit sub
1072 end if
1073
1074 '
1075 ' Ok, emit build config variables.
1076 '
1077 if InStr(1, g_strShellOutput, "Version 16.") > 0 then
1078 CfgPrint "PATH_TOOL_VCC100 := " & g_strPathVCC
1079 CfgPrint "PATH_TOOL_VCC100X86 := $(PATH_TOOL_VCC100)"
1080 CfgPrint "PATH_TOOL_VCC100AMD64 := $(PATH_TOOL_VCC100)"
1081 if LogFileExists(strPathVC, "atlmfc/include/atlbase.h") then
1082 PrintResult "Visual C++ v10 with ATL", g_strPathVCC
1083 elseif LogFileExists(g_strPathDDK, "inc/atl71/atlbase.h") _
1084 And LogFileExists(g_strPathDDK, "lib/ATL/i386/atls.lib") then
1085 CfgPrint "VBOX_WITHOUT_COMPILER_REDIST=1"
1086 CfgPrint "PATH_TOOL_VCC100_ATLMFC_INC = " & g_strPathDDK & "/inc/atl71"
1087 CfgPrint "PATH_TOOL_VCC100_ATLMFC_LIB.amd64 = " & g_strPathDDK & "/lib/ATL/amd64"
1088 CfgPrint "PATH_TOOL_VCC100_ATLMFC_LIB.x86 = " & g_strPathDDK & "/lib/ATL/i386"
1089 CfgPrint "PATH_TOOL_VCC100AMD64_ATLMFC_INC = " & g_strPathDDK & "/inc/atl71"
1090 CfgPrint "PATH_TOOL_VCC100AMD64_ATLMFC_LIB = " & g_strPathDDK & "/lib/ATL/amd64"
1091 CfgPrint "PATH_TOOL_VCC100X86_ATLMFC_INC = " & g_strPathDDK & "/inc/atl71"
1092 CfgPrint "PATH_TOOL_VCC100X86_ATLMFC_LIB = " & g_strPathDDK & "/lib/ATL/i386"
1093 PrintResult "Visual C++ v10 with DDK ATL", g_strPathVCC
1094 else
1095 CfgPrint "VBOX_WITHOUT_COMPILER_REDIST=1"
1096 DisableCOM "No ATL"
1097 PrintResult "Visual C++ v10 (or later) without ATL", g_strPathVCC
1098 end if
1099
1100 elseif InStr(1, g_strShellOutput, "Version 17.") > 0 then
1101 CfgPrint "PATH_TOOL_VCC110 := " & g_strPathVCC
1102 CfgPrint "PATH_TOOL_VCC110X86 := $(PATH_TOOL_VCC110)"
1103 CfgPrint "PATH_TOOL_VCC110AMD64 := $(PATH_TOOL_VCC110)"
1104 PrintResult "Visual C++ v11", g_strPathVCC
1105 MsgWarning "The support for Visual C++ v11 (aka 2012) is experimental"
1106
1107 else
1108 MsgError "The Visual C++ compiler we found ('" & strPathVC & "') isn't 10.0 or 11.0. Check the build requirements."
1109 exit sub
1110 end if
1111
1112 ' and the env.bat path fix.
1113 if strPathVCCommon <> "" then
1114 EnvPrint "set PATH=%PATH%;" & strPathVCCommon & "/IDE;"
1115 end if
1116end sub
1117
1118''
1119' Checks if the specified path points to a usable PSDK.
1120function CheckForVisualCPPSub(strPathVC, strPathVCCommon, blnOptVCExpressEdition)
1121 strPathVC = UnixSlashes(PathAbs(strPathVC))
1122 CheckForVisualCPPSub = False
1123 LogPrint "trying: strPathVC=" & strPathVC & " strPathVCCommon=" & strPathVCCommon & " blnOptVCExpressEdition=" & blnOptVCExpressEdition
1124 if LogFileExists(strPathVC, "bin/cl.exe") _
1125 And LogFileExists(strPathVC, "bin/link.exe") _
1126 And LogFileExists(strPathVC, "include/string.h") _
1127 And LogFileExists(strPathVC, "lib/libcmt.lib") _
1128 And LogFileExists(strPathVC, "lib/msvcrt.lib") _
1129 then
1130 if blnOptVCExpressEdition _
1131 Or ( LogFileExists(strPathVC, "atlmfc/include/atlbase.h") _
1132 And LogFileExists(strPathVC, "atlmfc/lib/atls.lib")) _
1133 Or ( LogFileExists(g_strPathDDK, "inc/atl71/atlbase.h") _
1134 And LogFileExists(g_strPathDDK, "lib/ATL/i386/atls.lib")) _
1135 Then
1136 '' @todo figure out a way we can verify the version/build!
1137 CheckForVisualCPPSub = True
1138 end if
1139 end if
1140end function
1141
1142
1143''
1144' Checks for a platform SDK that works with the compiler
1145sub CheckForPlatformSDK(strOptSDK)
1146 dim strPathPSDK, str
1147 PrintHdr "Windows Platform SDK (recent)"
1148
1149 strPathPSDK = ""
1150
1151 ' Check the supplied argument first.
1152 str = strOptSDK
1153 if str <> "" then
1154 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1155 end if
1156
1157 ' The tools location (first).
1158 if strPathPSDK = "" And g_blnInternalFirst then
1159 str = g_strPathDev & "/win.x86/sdk/v7.1"
1160 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1161 end if
1162
1163 if strPathPSDK = "" And g_blnInternalFirst then
1164 str = g_strPathDev & "/win.x86/sdk/v8.0"
1165 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1166 end if
1167
1168 ' Look for it in the environment
1169 str = EnvGet("MSSdk")
1170 if strPathPSDK = "" And str <> "" then
1171 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1172 end if
1173
1174 str = EnvGet("Mstools")
1175 if strPathPSDK = "" And str <> "" then
1176 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1177 end if
1178
1179 ' Check if there is one installed with the compiler.
1180 if strPathPSDK = "" And str <> "" then
1181 str = g_strPathVCC & "/PlatformSDK"
1182 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1183 end if
1184
1185 ' Check the registry next (ASSUMES sorting).
1186 arrSubKeys = RegEnumSubKeysRSort("HKLM", "SOFTWARE\Microsoft\Microsoft SDKs\Windows")
1187 for each strSubKey in arrSubKeys
1188 str = RegGetString("HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\" & strSubKey & "\InstallationFolder")
1189 if strPathPSDK = "" And str <> "" then
1190 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1191 end if
1192 Next
1193 arrSubKeys = RegEnumSubKeysRSort("HKCU", "SOFTWARE\Microsoft\Microsoft SDKs\Windows")
1194 for each strSubKey in arrSubKeys
1195 str = RegGetString("HKCU\SOFTWARE\Microsoft\Microsoft SDKs\Windows\" & strSubKey & "\InstallationFolder")
1196 if strPathPSDK = "" And str <> "" then
1197 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1198 end if
1199 Next
1200
1201 ' The tools location (post).
1202 if (strPathPSDK = "") And (g_blnInternalFirst = False) then
1203 str = g_strPathDev & "/win.x86/sdk/v7.1"
1204 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1205 end if
1206
1207 if (strPathPSDK = "") And (g_blnInternalFirst = False) then
1208 str = g_strPathDev & "/win.x86/sdk/v8.0"
1209 if CheckForPlatformSDKSub(str) then strPathPSDK = str
1210 end if
1211
1212 ' Give up.
1213 if strPathPSDK = "" then
1214 MsgError "Cannot find a suitable Platform SDK. Check configure.log and the build requirements."
1215 exit sub
1216 end if
1217
1218 '
1219 ' Emit the config.
1220 '
1221 strPathPSDK = UnixSlashes(PathAbs(strPathPSDK))
1222 CfgPrint "PATH_SDK_WINPSDK" & g_strVerPSDK & " := " & strPathPSDK
1223 CfgPrint "VBOX_WINPSDK := WINPSDK" & g_strVerPSDK
1224
1225 PrintResult "Windows Platform SDK (v" & g_strVerPSDK & ")", strPathPSDK
1226 g_strPathPSDK = strPathPSDK
1227end sub
1228
1229''
1230' Checks if the specified path points to a usable PSDK.
1231function CheckForPlatformSDKSub(strPathPSDK)
1232 CheckForPlatformSDKSub = False
1233 LogPrint "trying: strPathPSDK=" & strPathPSDK
1234 if LogFileExists(strPathPSDK, "include/Windows.h") _
1235 And LogFileExists(strPathPSDK, "lib/Kernel32.Lib") _
1236 And LogFileExists(strPathPSDK, "lib/User32.Lib") _
1237 And LogFileExists(strPathPSDK, "bin/rc.exe") _
1238 And Shell("""" & DosSlashes(strPathPSDK & "/bin/rc.exe") & """" , True) <> 0 _
1239 then
1240 if InStr(1, g_strShellOutput, "Resource Compiler Version 6.2.") > 0 then
1241 g_strVerPSDK = "80"
1242 CheckForPlatformSDKSub = True
1243 elseif InStr(1, g_strShellOutput, "Resource Compiler Version 6.1.") > 0 then
1244 g_strVerPSDK = "71"
1245 CheckForPlatformSDKSub = True
1246 end if
1247 end if
1248end function
1249
1250
1251''
1252' Checks for a Windows 7 Driver Kit.
1253sub CheckForWinDDK(strOptDDK)
1254 dim strPathDDK, str, strSubKeys
1255 PrintHdr "Windows DDK v7.1"
1256
1257 '
1258 ' Find the DDK.
1259 '
1260 strPathDDK = ""
1261 ' The specified path.
1262 if strPathDDK = "" And strOptDDK <> "" then
1263 if CheckForWinDDKSub(strOptDDK, True) then strPathDDK = strOptDDK
1264 end if
1265
1266 ' The tools location (first).
1267 if strPathDDK = "" And g_blnInternalFirst then
1268 str = g_strPathDev & "/win.x86/ddk/7600.16385.1"
1269 if CheckForWinDDKSub(str, False) then strPathDDK = str
1270 end if
1271
1272 ' Check the environment
1273 str = EnvGet("DDK_INC_PATH")
1274 if strPathDDK = "" And str <> "" then
1275 str = PathParent(PathParent(str))
1276 if CheckForWinDDKSub(str, True) then strPathDDK = str
1277 end if
1278
1279 str = EnvGet("BASEDIR")
1280 if strPathDDK = "" And str <> "" then
1281 if CheckForWinDDKSub(str, True) then strPathDDK = str
1282 end if
1283
1284 ' Some array constants to ease the work.
1285 arrSoftwareKeys = array("SOFTWARE", "SOFTWARE\Wow6432Node")
1286 arrRoots = array("HKLM", "HKCU")
1287
1288 ' Windows 7 WDK.
1289 arrLocations = array()
1290 for each strSoftwareKey in arrSoftwareKeys
1291 for each strSubKey in RegEnumSubKeysFull("HKLM", strSoftwareKey & "\Microsoft\KitSetup\configured-kits")
1292 for each strSubKey2 in RegEnumSubKeysFull("HKLM", strSubKey)
1293 str = RegGetString("HKLM\" & strSubKey2 & "\setup-install-location")
1294 if str <> "" then
1295 arrLocations = ArrayAppend(arrLocations, PathAbsLong(str))
1296 end if
1297 next
1298 next
1299 next
1300 arrLocations = ArrayRSortStrings(arrLocations)
1301
1302 ' Check the locations we've gathered.
1303 for each str in arrLocations
1304 if strPathDDK = "" then
1305 if CheckForWinDDKSub(str, True) then strPathDDK = str
1306 end if
1307 next
1308
1309 ' The tools location (post).
1310 if (strPathDDK = "") And (g_blnInternalFirst = False) then
1311 str = g_strPathDev & "/win.x86/ddk/7600.16385.1"
1312 if CheckForWinDDKSub(str, False) then strPathDDK = str
1313 end if
1314
1315 ' Give up.
1316 if strPathDDK = "" then
1317 MsgError "Cannot find the Windows DDK v7.1. Check configure.log and the build requirements."
1318 exit sub
1319 end if
1320
1321 '
1322 ' Emit the config.
1323 '
1324 strPathDDK = UnixSlashes(PathAbs(strPathDDK))
1325 CfgPrint "PATH_SDK_WINDDK71 := " & strPathDDK
1326
1327 PrintResult "Windows DDK v7.1", strPathDDK
1328 g_strPathDDK = strPathDDK
1329end sub
1330
1331'' Quick check if the DDK is in the specified directory or not.
1332function CheckForWinDDKSub(strPathDDK, blnCheckBuild)
1333 CheckForWinDDKSub = False
1334 LogPrint "trying: strPathDDK=" & strPathDDK & " blnCheckBuild=" & blnCheckBuild
1335 if LogFileExists(strPathDDK, "inc/api/ntdef.h") _
1336 And LogFileExists(strPathDDK, "lib/win7/i386/int64.lib") _
1337 And LogFileExists(strPathDDK, "lib/wlh/i386/int64.lib") _
1338 And LogFileExists(strPathDDK, "lib/wnet/i386/int64.lib") _
1339 And LogFileExists(strPathDDK, "lib/wxp/i386/int64.lib") _
1340 And Not LogFileExists(strPathDDK, "lib/win8/i386/int64.lib") _
1341 And LogFileExists(strPathDDK, "bin/x86/rc.exe") _
1342 then
1343 if Not blnCheckBuild then
1344 CheckForWinDDKSub = True
1345 '' @todo Find better build check.
1346 elseif Shell("""" & DosSlashes(strPathDDK & "/bin/x86/rc.exe") & """" , True) <> 0 _
1347 And InStr(1, g_strShellOutput, "Resource Compiler Version 6.1.") > 0 then
1348 CheckForWinDDKSub = True
1349 end if
1350 end if
1351end function
1352
1353
1354''
1355' Finds midl.exe
1356sub CheckForMidl()
1357 dim strMidl
1358 PrintHdr "Midl.exe"
1359
1360 ' Skip if no COM/ATL.
1361 if g_blnDisableCOM then
1362 PrintResultMsg "Midl", "Skipped (" & g_strDisableCOM & ")"
1363 exit sub
1364 end if
1365
1366 if LogFileExists(g_strPathPSDK, "bin/Midl.exe") then
1367 strMidl = g_strPathPSDK & "/bin/Midl.exe"
1368 elseif LogFileExists(g_strPathVCC, "Common7/Tools/Bin/Midl.exe") then
1369 strMidl = g_strPathVCC & "/Common7/Tools/Bin/Midl.exe"
1370 elseif LogFileExists(g_strPathDDK, "bin/x86/Midl.exe") then
1371 strMidl = g_strPathDDK & "/bin/x86/Midl.exe"
1372 elseif LogFileExists(g_strPathDDK, "bin/Midl.exe") then
1373 strMidl = g_strPathDDK & "/bin/Midl.exe"
1374 elseif LogFileExists(g_strPathDev, "win.x86/bin/Midl.exe") then
1375 strMidl = g_strPathDev & "/win.x86/bin/Midl.exe"
1376 else
1377 MsgWarning "Midl.exe not found!"
1378 exit sub
1379 end if
1380
1381 CfgPrint "VBOX_MAIN_IDL := " & strMidl
1382 PrintResult "Midl.exe", strMidl
1383end sub
1384
1385
1386''
1387' Checks for a MingW32 suitable for building the recompiler.
1388'
1389' strOptW32API is currently ignored.
1390'
1391sub CheckForMingW(strOptMingw, strOptW32API)
1392 dim strPathMingW, strPathW32API, str
1393 PrintHdr "MinGW GCC v3.3.x + Binutils + Runtime + W32API"
1394
1395 '
1396 ' Find the MinGW and W32API tools.
1397 '
1398 strPathMingW = ""
1399 strPathW32API = ""
1400
1401 ' The specified path.
1402 if (strPathMingW = "") And (strOptMingW <> "") then
1403 if CheckForMingWSub(strOptMingW, strOptW32API) then
1404 strPathMingW = strOptMingW
1405 strPathW32API = strOptW32API
1406 end if
1407 end if
1408
1409 ' The tools location (first).
1410 if (strPathMingW = "") And (g_blnInternalFirst = True) then
1411 str = g_strPathDev & "/win.x86/mingw32/v3.3.3"
1412 str2 = g_strPathDev & "/win.x86/w32api/v2.5"
1413 if CheckForMingWSub(str, str2) then
1414 strPathMingW = str
1415 strPathW32API = str2
1416 end if
1417 end if
1418
1419 ' See if there is any gcc around.
1420 if strPathMingW = "" then
1421 str = Which("mingw32-gcc.exe")
1422 if (str <> "") then
1423 str = PathParent(PathStripFilename(str))
1424 if CheckForMingWSub(str, str) then strPathMingW = str
1425 end if
1426 end if
1427
1428 if strPathMingW = "" then
1429 str = Which("gcc.exe")
1430 if (str <> "") then
1431 str = PathParent(PathStripFilename(str))
1432 if CheckForMingWSub(str, str) then strPathMingW = str
1433 end if
1434 end if
1435
1436 ' The tools location (post).
1437 if (strPathMingW = "") And (g_blnInternalFirst = False) then
1438 str = g_strPathDev & "/win.x86/mingw32/v3.3.3"
1439 str2 = g_strPathDev & "/win.x86/w32api/v2.5"
1440 if CheckForMingWSub(str, str2) then
1441 strPathMingW = str
1442 strPathW32API = str2
1443 end if
1444 end if
1445
1446 ' Success?
1447 if strPathMingW = "" then
1448 if strOptMingw = "" then
1449 MsgError "Can't locate a suitable MinGW installation. Try specify the path with " _
1450 & "the --with-MinGW=<path> argument. If still no luck, consult the configure.log and the build requirements."
1451 else
1452 MsgError "Can't locate a suitable MinGW installation. Please consult the configure.log and the build requirements."
1453 end if
1454 exit sub
1455 end if
1456
1457 '
1458 ' Emit the config.
1459 '
1460 strPathMingW = UnixSlashes(PathAbs(strPathMingW))
1461 CfgPrint "PATH_TOOL_MINGW32 := " & strPathMingW
1462 PrintResult "MinGW (GCC v" & g_strSubOutput & ")", strPathMingW
1463 if (strPathMingW = strPathW32API) Or strPathW32API = "" then
1464 CfgPrint "PATH_SDK_W32API := $(PATH_TOOL_MINGW32)"
1465 else
1466 CfgPrint "PATH_SDK_W32API := " & strPathW32API
1467 PrintResult "W32API", strPathW32API
1468 end if
1469end sub
1470
1471''
1472' Checks if the specified path points to an usable MinGW or not.
1473function CheckForMingWSub(strPathMingW, strPathW32API)
1474 g_strSubOutput = ""
1475 if strPathW32API = "" then strPathW32API = strPathMingW
1476 LogPrint "trying: strPathMingW=" &strPathMingW & " strPathW32API=" & strPathW32API
1477
1478 if LogFileExists(strPathMingW, "bin/mingw32-gcc.exe") _
1479 And LogFileExists(strPathMingW, "bin/ld.exe") _
1480 And LogFileExists(strPathMingW, "bin/objdump.exe") _
1481 And LogFileExists(strPathMingW, "bin/dllwrap.exe") _
1482 And LogFileExists(strPathMingW, "bin/as.exe") _
1483 And LogFileExists(strPathMingW, "include/string.h") _
1484 And LogFileExists(strPathMingW, "include/_mingw.h") _
1485 And LogFileExists(strPathMingW, "lib/dllcrt1.o") _
1486 And LogFileExists(strPathMingW, "lib/dllcrt2.o") _
1487 And LogFileExists(strPathMingW, "lib/libmsvcrt.a") _
1488 _
1489 And LogFileExists(strPathW32API, "lib/libkernel32.a") _
1490 And LogFileExists(strPathW32API, "include/windows.h") _
1491 then
1492 if Shell(DosSlashes(strPathMingW & "/bin/gcc.exe") & " --version", True) = 0 then
1493 dim offVer, iMajor, iMinor, iPatch, strVer
1494
1495 ' extract the version.
1496 strVer = ""
1497 offVer = InStr(1, g_strShellOutput, "(GCC) ")
1498 if offVer > 0 then
1499 strVer = LTrim(Mid(g_strShellOutput, offVer + Len("(GCC) ")))
1500 strVer = RTrim(Left(strVer, InStr(1, strVer, " ")))
1501 if (Mid(strVer, 2, 1) = ".") _
1502 And (Mid(strVer, 4, 1) = ".") then
1503 iMajor = Int(Left(strVer, 1)) ' Is Int() the right thing here? I want atoi()!!!
1504 iMinor = Int(Mid(strVer, 3, 1))
1505 iPatch = Int(Mid(strVer, 5))
1506 else
1507 LogPrint "Malformed version: '" & strVer & "'"
1508 strVer = ""
1509 end if
1510 end if
1511 if strVer <> "" then
1512 if (iMajor = 3) And (iMinor = 3) then
1513 CheckForMingWSub = True
1514 g_strSubOutput = strVer
1515 else
1516 LogPrint "MinGW version '" & iMajor & "." & iMinor & "." & iPatch & "' is not supported (or configure.vbs failed to parse it correctly)."
1517 end if
1518 else
1519 LogPrint "Couldn't locate the GCC version in the output!"
1520 end if
1521
1522 else
1523 LogPrint "Failed to run gcc.exe!"
1524 end if
1525 end if
1526end function
1527
1528
1529''
1530' Checks for any libSDL binaries.
1531sub CheckForlibSDL(strOptlibSDL)
1532 dim strPathlibSDL, str
1533 PrintHdr "libSDL"
1534
1535 '
1536 ' Try find some SDL library.
1537 '
1538
1539 ' First, the specific location.
1540 strPathlibSDL = ""
1541 if (strPathlibSDL = "") And (strOptlibSDL <> "") then
1542 if CheckForlibSDLSub(strOptlibSDL) then strPathlibSDL = strOptlibSDL
1543 end if
1544
1545 ' The tools location (first).
1546 if (strPathlibSDL = "") And (g_blnInternalFirst = True) Then
1547 str = g_strPathDev & "/win.x86/libsdl/v1.2.11"
1548 if CheckForlibSDLSub(str) then strPathlibSDL = str
1549 end if
1550
1551 if (strPathlibSDL = "") And (g_blnInternalFirst = True) Then
1552 str = g_strPathDev & "/win.x86/libsdl/v1.2.7-InnoTek"
1553 if CheckForlibSDLSub(str) then strPathlibSDL = str
1554 end if
1555
1556 ' Poke about in the path.
1557 str = Which("SDLmain.lib")
1558 if (strPathlibSDL = "") And (str <> "") Then
1559 str = PathParent(PathStripFilename(str))
1560 if CheckForlibSDLSub(str) then strPathlibSDL = str
1561 end if
1562
1563 str = Which("SDL.dll")
1564 if (strPathlibSDL = "") And (str <> "") Then
1565 str = PathParent(PathStripFilename(str))
1566 if CheckForlibSDLSub(str) then strPathlibSDL = str
1567 end if
1568
1569 ' The tools location (post).
1570 if (strPathlibSDL = "") And (g_blnInternalFirst = False) Then
1571 str = g_strPathDev & "/win.x86/libsdl/v1.2.11"
1572 if CheckForlibSDLSub(str) then strPathlibSDL = str
1573 end if
1574
1575 if (strPathlibSDL = "") And (g_blnInternalFirst = False) Then
1576 str = g_strPathDev & "/win.x86/libsdl/v1.2.7-InnoTek"
1577 if CheckForlibSDLSub(str) then strPathlibSDL = str
1578 end if
1579
1580 ' Success?
1581 if strPathlibSDL = "" then
1582 if strOptlibSDL = "" then
1583 MsgError "Can't locate libSDL. Try specify the path with the --with-libSDL=<path> argument. " _
1584 & "If still no luck, consult the configure.log and the build requirements."
1585 else
1586 MsgError "Can't locate libSDL. Please consult the configure.log and the build requirements."
1587 end if
1588 exit sub
1589 end if
1590
1591 strPathLibSDL = UnixSlashes(PathAbs(strPathLibSDL))
1592 CfgPrint "PATH_SDK_LIBSDL := " & strPathlibSDL
1593
1594 PrintResult "libSDL", strPathlibSDL
1595end sub
1596
1597''
1598' Checks if the specified path points to an usable libSDL or not.
1599function CheckForlibSDLSub(strPathlibSDL)
1600 CheckForlibSDLSub = False
1601 LogPrint "trying: strPathlibSDL=" & strPathlibSDL
1602 if LogFileExists(strPathlibSDL, "lib/SDL.lib") _
1603 And LogFileExists(strPathlibSDL, "lib/SDLmain.lib") _
1604 And LogFileExists(strPathlibSDL, "lib/SDL.dll") _
1605 And LogFileExists(strPathlibSDL, "include/SDL.h") _
1606 And LogFileExists(strPathlibSDL, "include/SDL_syswm.h") _
1607 And LogFileExists(strPathlibSDL, "include/SDL_version.h") _
1608 then
1609 CheckForlibSDLSub = True
1610 end if
1611end function
1612
1613
1614''
1615' Checks for libxml2.
1616sub CheckForXml2(strOptXml2)
1617 dim strPathXml2, str
1618 PrintHdr "libxml2"
1619
1620 ' Skip if no COM/ATL.
1621 if g_blnDisableCOM then
1622 PrintResultMsg "libxml2", "Skipped (" & g_strDisableCOM & ")"
1623 exit sub
1624 end if
1625
1626 '
1627 ' Try find some xml2 dll/lib.
1628 '
1629 strPathXml2 = ""
1630 if (strPathXml2 = "") And (strOptXml2 <> "") then
1631 if CheckForXml2Sub(strOptXml2) then strPathXml2 = strOptXml2
1632 end if
1633
1634 if strPathXml2 = "" Then
1635 str = Which("libxml2.lib")
1636 if str <> "" Then
1637 str = PathParent(PathStripFilename(str))
1638 if CheckForXml2Sub(str) then strPathXml2 = str
1639 end if
1640 end if
1641
1642 ' Ignore failure if we're in 'internal' mode.
1643 if (strPathXml2 = "") and g_blnInternalMode then
1644 PrintResultMsg "libxml2", "ignored (internal mode)"
1645 exit sub
1646 end if
1647
1648 ' Success?
1649 if strPathXml2 = "" then
1650 if strOptXml2 = "" then
1651 MsgError "Can't locate libxml2. Try specify the path with the --with-libxml2=<path> argument. " _
1652 & "If still no luck, consult the configure.log and the build requirements."
1653 else
1654 MsgError "Can't locate libxml2. Please consult the configure.log and the build requirements."
1655 end if
1656 exit sub
1657 end if
1658
1659 strPathXml2 = UnixSlashes(PathAbs(strPathXml2))
1660 CfgPrint "SDK_VBOX_LIBXML2_INCS := " & strPathXml2 & "/include"
1661 CfgPrint "SDK_VBOX_LIBXML2_LIBS := " & strPathXml2 & "/lib/libxml2.lib"
1662
1663 PrintResult "libxml2", strPathXml2
1664end sub
1665
1666''
1667' Checks if the specified path points to an usable libxml2 or not.
1668function CheckForXml2Sub(strPathXml2)
1669 dim str
1670
1671 CheckForXml2Sub = False
1672 LogPrint "trying: strPathXml2=" & strPathXml2
1673 if LogFileExists(strPathXml2, "include/libxml/xmlexports.h") _
1674 And LogFileExists(strPathXml2, "include/libxml/xmlreader.h") _
1675 then
1676 str = LogFindFile(strPathXml2, "bin/libxml2.dll")
1677 if str <> "" then
1678 if LogFindFile(strPathXml2, "lib/libxml2.lib") <> "" then
1679 CheckForXml2Sub = True
1680 end if
1681 end if
1682 end if
1683end function
1684
1685
1686''
1687' Checks for libxslt.
1688sub CheckForXslt(strOptXslt)
1689 dim strPathXslt, str
1690 PrintHdr "libxslt"
1691
1692 ' Skip if no COM/ATL.
1693 if g_blnDisableCOM then
1694 PrintResultMsg "libxslt", "Skipped (" & g_strDisableCOM & ")"
1695 exit sub
1696 end if
1697
1698 '
1699 ' Try find some libxslt dll/lib.
1700 '
1701 strPathXslt = ""
1702 if (strPathXslt = "") And (strOptXslt <> "") then
1703 if CheckForXsltSub(strOptXslt) then strPathXslt = strOptXslt
1704 end if
1705
1706 if strPathXslt = "" Then
1707 str = Which("libxslt.lib")
1708 if str <> "" Then
1709 str = PathParent(PathStripFilename(str))
1710 if CheckForXsltSub(str) then strPathXslt = str
1711 end if
1712 end if
1713
1714 if strPathXslt = "" Then
1715 str = Which("libxslt.dll")
1716 if str <> "" Then
1717 str = PathParent(PathStripFilename(str))
1718 if CheckForXsltSub(str) then strPathXslt = str
1719 end if
1720 end if
1721
1722 ' Ignore failure if we're in 'internal' mode.
1723 if (strPathXslt = "") and g_blnInternalMode then
1724 PrintResultMsg "libxslt", "ignored (internal mode)"
1725 exit sub
1726 end if
1727
1728 ' Success?
1729 if strPathXslt = "" then
1730 if strOptXslt = "" then
1731 MsgError "Can't locate libxslt. Try specify the path with the --with-libxslt=<path> argument. " _
1732 & "If still no luck, consult the configure.log and the build requirements."
1733 else
1734 MsgError "Can't locate libxslt. Please consult the configure.log and the build requirements."
1735 end if
1736 exit sub
1737 end if
1738
1739 strPathXslt = UnixSlashes(PathAbs(strPathXslt))
1740 CfgPrint "SDK_VBOX_LIBXSLT_INCS := " & strPathXslt & "/include"
1741 CfgPrint "SDK_VBOX_LIBXSLT_LIBS := " & strPathXslt & "/lib/libxslt.lib"
1742
1743 PrintResult "libxslt", strPathXslt
1744end sub
1745
1746
1747''
1748' Checks if the specified path points to an usable libxslt or not.
1749function CheckForXsltSub(strPathXslt)
1750 dim str
1751
1752 CheckForXsltSub = False
1753 LogPrint "trying: strPathXslt=" & strPathXslt
1754
1755 if LogFileExists(strPathXslt, "include/libxslt/namespaces.h") _
1756 And LogFileExists(strPathXslt, "include/libxslt/xsltutils.h") _
1757 then
1758 str = LogFindFile(strPathXslt, "lib/libxslt.dll")
1759 if str <> "" then
1760 if LogFileExists(strPathXslt, "lib/libxslt.lib") _
1761 then
1762 CheckForXsltSub = True
1763 end if
1764 end if
1765 end if
1766end function
1767
1768
1769''
1770' Checks for openssl
1771sub CheckForSsl(strOptSsl)
1772 dim strPathSsl, str
1773 PrintHdr "openssl"
1774
1775 '
1776 ' Try find some openssl dll/lib.
1777 '
1778 strPathSsl = ""
1779 if (strPathSsl = "") And (strOptSsl <> "") then
1780 if CheckForSslSub(strOptSsl) then strPathSsl = strOptSsl
1781 end if
1782
1783 if strPathSsl = "" Then
1784 str = Which("ssleay32.lib")
1785 if str <> "" Then
1786 str = PathParent(PathStripFilename(str))
1787 if CheckForSslSub(str) then strPathSsl = str
1788 end if
1789 end if
1790
1791 ' Ignore failure if we're in 'internal' mode.
1792 if (strPathSsl = "") and g_blnInternalMode then
1793 PrintResultMsg "openssl", "ignored (internal mode)"
1794 exit sub
1795 end if
1796
1797 ' Success?
1798 if strPathSsl = "" then
1799 if strOptSsl = "" then
1800 MsgError "Can't locate openssl. Try specify the path with the --with-openssl=<path> argument. " _
1801 & "If still no luck, consult the configure.log and the build requirements."
1802 else
1803 MsgError "Can't locate openssl. Please consult the configure.log and the build requirements."
1804 end if
1805 exit sub
1806 end if
1807
1808 strPathSsl = UnixSlashes(PathAbs(strPathSsl))
1809 CfgPrint "SDK_VBOX_OPENSSL_INCS := " & strPathSsl & "/include"
1810 CfgPrint "SDK_VBOX_OPENSSL_LIBS := " & strPathSsl & "/lib/ssleay32.lib" & " " & strPathSsl & "/lib/libeay32.lib"
1811 CfgPrint "SDK_VBOX_BLD_OPENSSL_LIBS := " & strPathSsl & "/lib/ssleay32.lib" & " " & strPathSsl & "/lib/libeay32.lib"
1812
1813 PrintResult "openssl", strPathSsl
1814end sub
1815
1816''
1817' Checks if the specified path points to an usable openssl or not.
1818function CheckForSslSub(strPathSsl)
1819
1820 CheckForSslSub = False
1821 LogPrint "trying: strPathSsl=" & strPathSsl
1822 if LogFileExists(strPathSsl, "include/openssl/md5.h") _
1823 And LogFindFile(strPathSsl, "bin/ssleay32.dll") <> "" _
1824 And LogFindFile(strPathSsl, "lib/ssleay32.lib") <> "" _
1825 And LogFindFile(strPathSsl, "bin/libeay32.dll") <> "" _
1826 And LogFindFile(strPathSsl, "lib/libeay32.lib") <> "" _
1827 then
1828 CheckForSslSub = True
1829 end if
1830end function
1831
1832
1833''
1834' Checks for libcurl
1835sub CheckForCurl(strOptCurl)
1836 dim strPathCurl, str
1837 PrintHdr "libcurl"
1838
1839 '
1840 ' Try find some cURL dll/lib.
1841 '
1842 strPathCurl = ""
1843 if (strPathCurl = "") And (strOptCurl <> "") then
1844 if CheckForCurlSub(strOptCurl) then strPathCurl = strOptCurl
1845 end if
1846
1847 if strPathCurl = "" Then
1848 str = Which("libcurl.lib")
1849 if str <> "" Then
1850 str = PathParent(PathStripFilename(str))
1851 if CheckForCurlSub(str) then strPathCurl = str
1852 end if
1853 end if
1854
1855 ' Ignore failure if we're in 'internal' mode.
1856 if (strPathCurl = "") and g_blnInternalMode then
1857 PrintResultMsg "curl", "ignored (internal mode)"
1858 exit sub
1859 end if
1860
1861 ' Success?
1862 if strPathCurl = "" then
1863 if strOptCurl = "" then
1864 MsgError "Can't locate libcurl. Try specify the path with the --with-libcurl=<path> argument. " _
1865 & "If still no luck, consult the configure.log and the build requirements."
1866 else
1867 MsgError "Can't locate libcurl. Please consult the configure.log and the build requirements."
1868 end if
1869 exit sub
1870 end if
1871
1872 strPathCurl = UnixSlashes(PathAbs(strPathCurl))
1873 CfgPrint "SDK_VBOX_LIBCURL_INCS := " & strPathCurl & "/include"
1874 CfgPrint "SDK_VBOX_LIBCURL_LIBS := " & strPathCurl & "/libcurl.lib"
1875
1876 PrintResult "libcurl", strPathCurl
1877end sub
1878
1879''
1880' Checks if the specified path points to an usable libcurl or not.
1881function CheckForCurlSub(strPathCurl)
1882
1883 CheckForCurlSub = False
1884 LogPrint "trying: strPathCurl=" & strPathCurl
1885 if LogFileExists(strPathCurl, "include/curl/curl.h") _
1886 And LogFindFile(strPathCurl, "libcurl.dll") <> "" _
1887 And LogFindFile(strPathCurl, "libcurl.lib") <> "" _
1888 then
1889 CheckForCurlSub = True
1890 end if
1891end function
1892
1893
1894
1895''
1896' Checks for any Qt4 binaries.
1897sub CheckForQt4(strOptQt4)
1898 dim strPathQt4
1899
1900 PrintHdr "Qt4"
1901
1902 '
1903 ' Try to find the Qt4 installation (user specified path with --with-qt4)
1904 '
1905 strPathQt4 = ""
1906
1907 LogPrint "Checking for user specified path of Qt4 ... "
1908 if (strPathQt4 = "") And (strOptQt4 <> "") then
1909 strOptQt4 = UnixSlashes(strOptQt4)
1910 if CheckForQt4Sub(strOptQt4) then strPathQt4 = strOptQt4
1911 end if
1912
1913 ' Check the dev tools
1914 if (strPathQt4 = "") Then
1915 strPathQt4 = g_strPathDev & "/win." & g_strTargetArch & "/qt/v4.7.3-vcc100"
1916 if CheckForQt4Sub(strPathQt4) = False then strPathQt4 = ""
1917 end if
1918
1919 ' Display the result.
1920 if strPathQt4 = "" then
1921 CfgPrint "VBOX_WITH_QT4GUI="
1922 PrintResultMsg "Qt4", "not found"
1923 else
1924 CfgPrint "PATH_SDK_QT4 := " & strPathQt4
1925 CfgPrint "PATH_TOOL_QT4 := $(PATH_SDK_QT4)"
1926 CfgPrint "VBOX_PATH_QT4 := $(PATH_SDK_QT4)"
1927 PrintResult "Qt4 ", strPathQt4
1928 end if
1929end sub
1930
1931
1932''
1933' Checks if the specified path points to an usable Qt library.
1934function CheckForQt4Sub(strPathQt4)
1935
1936 CheckForQt4Sub = False
1937 LogPrint "trying: strPathQt4=" & strPathQt4
1938
1939 if LogFileExists(strPathQt4, "bin/moc.exe") _
1940 And LogFileExists(strPathQt4, "bin/uic.exe") _
1941 And LogFileExists(strPathQt4, "include/Qt/qwidget.h") _
1942 And LogFileExists(strPathQt4, "include/QtGui/QApplication") _
1943 And LogFileExists(strPathQt4, "include/QtNetwork/QHostAddress") _
1944 And ( LogFileExists(strPathQt4, "lib/QtCore4.lib") _
1945 Or LogFileExists(strPathQt4, "lib/VBoxQtCore4.lib") _
1946 Or LogFileExists(strPathQt4, "lib/QtCoreVBox4.lib")) _
1947 And ( LogFileExists(strPathQt4, "lib/QtNetwork4.lib") _
1948 Or LogFileExists(strPathQt4, "lib/VBoxQtNetwork4.lib") _
1949 Or LogFileExists(strPathQt4, "lib/QtNetworkVBox4.lib")) _
1950 then
1951 CheckForQt4Sub = True
1952 end if
1953
1954end function
1955
1956
1957'
1958'
1959function CheckForPython(strPathPython)
1960
1961 PrintHdr "Python"
1962
1963 CheckForPython = False
1964 LogPrint "trying: strPathPython=" & strPathPython
1965
1966 if LogFileExists(strPathPython, "python.exe") then
1967 CfgPrint "VBOX_BLD_PYTHON := " & strPathPython & "\python.exe"
1968 CheckForPython = True
1969 end if
1970
1971 PrintResult "Python ", strPathPython
1972end function
1973
1974
1975'
1976'
1977function CheckForMkisofs(strFnameMkisofs)
1978
1979 PrintHdr "mkisofs"
1980
1981 CheckForMkisofs = False
1982 LogPrint "trying: strFnameMkisofs=" & strFnameMkisofs
1983
1984 if FileExists(strFnameMkisofs) = false then
1985 LogPrint "Testing '" & strFnameMkisofs & " not found"
1986 else
1987 CfgPrint "VBOX_MKISOFS := " & strFnameMkisofs
1988 CheckForMkisofs = True
1989 end if
1990
1991 PrintResult "mkisofs ", strFnameMkisofs
1992end function
1993
1994
1995''
1996' Show usage.
1997sub usage
1998 Print "Usage: cscript configure.vbs [options]"
1999 Print ""
2000 Print "Configuration:"
2001 Print " -h, --help"
2002 Print " --internal"
2003 Print " --internal-last"
2004 Print ""
2005 Print "Components:"
2006 Print " --disable-COM"
2007 Print " --disable-UDPTunnel"
2008 Print ""
2009 Print "Locations:"
2010 Print " --with-DDK=PATH "
2011 Print " --with-DXSDK=PATH "
2012 Print " --with-kBuild=PATH "
2013 Print " --with-libSDL=PATH "
2014 Print " --with-MinGW=PATH "
2015 Print " --with-Qt4=PATH "
2016 Print " --with-SDK=PATH "
2017 Print " --with-VC=PATH "
2018 Print " --with-VC-Common=PATH "
2019 Print " --with-VC-Express-Edition"
2020 Print " --with-W32API=PATH "
2021 Print " --with-libxml2=PATH "
2022 Print " --with-libxslt=PATH "
2023 Print " --with-openssl=PATH "
2024 Print " --with-libcurl=PATH "
2025 Print " --with-python=PATH "
2026end sub
2027
2028
2029''
2030' The main() like function.
2031'
2032Sub Main
2033 '
2034 ' Write the log header and check that we're not using wscript.
2035 '
2036 LogInit
2037 If UCase(Right(Wscript.FullName, 11)) = "WSCRIPT.EXE" Then
2038 Wscript.Echo "This script must be run under CScript."
2039 Wscript.Quit(1)
2040 End If
2041
2042 '
2043 ' Parse arguments.
2044 '
2045 strOptDDK = ""
2046 strOptDXDDK = ""
2047 strOptkBuild = ""
2048 strOptlibSDL = ""
2049 strOptMingW = ""
2050 strOptQt4 = ""
2051 strOptSDK = ""
2052 strOptVC = ""
2053 strOptVCCommon = ""
2054 blnOptVCExpressEdition = False
2055 strOptW32API = ""
2056 strOptXml2 = ""
2057 strOptXslt = ""
2058 strOptSsl = ""
2059 strOptCurl = ""
2060 strOptPython = ""
2061 strOptMkisofs = ""
2062 blnOptDisableCOM = False
2063 blnOptDisableUDPTunnel = False
2064 for i = 1 to Wscript.Arguments.Count
2065 dim str, strArg, strPath
2066
2067 ' Separate argument and path value
2068 str = Wscript.Arguments.item(i - 1)
2069 if InStr(1, str, "=") > 0 then
2070 strArg = Mid(str, 1, InStr(1, str, "=") - 1)
2071 strPath = Mid(str, InStr(1, str, "=") + 1)
2072 if strPath = "" then MsgFatal "Syntax error! Argument #" & i & " is missing the path."
2073 else
2074 strArg = str
2075 strPath = ""
2076 end if
2077
2078 ' Process the argument
2079 select case LCase(strArg)
2080 case "--with-ddk"
2081 strOptDDK = strPath
2082 case "--with-dxsdk"
2083 MsgWarning "Ignornig --with-dxsdk (the DirectX SDK is no longer required)."
2084 case "--with-kbuild"
2085 strOptkBuild = strPath
2086 case "--with-libsdl"
2087 strOptlibSDL = strPath
2088 case "--with-mingw"
2089 strOptMingW = strPath
2090 case "--with-qt4"
2091 strOptQt4 = strPath
2092 case "--with-sdk"
2093 strOptSDK = strPath
2094 case "--with-vc"
2095 strOptVC = strPath
2096 case "--with-vc-common"
2097 strOptVCCommon = strPath
2098 case "--with-vc-express-edition"
2099 blnOptVCExpressEdition = True
2100 case "--with-w32api"
2101 strOptW32API = strPath
2102 case "--with-libxml2"
2103 strOptXml2 = strPath
2104 case "--with-libxslt"
2105 strOptXslt = strPath
2106 case "--with-openssl"
2107 strOptSsl = strPath
2108 case "--with-libcurl"
2109 strOptCurl = strPath
2110 case "--with-python"
2111 strOptPython = strPath
2112 case "--with-mkisofs"
2113 strOptMkisofs = strPath
2114 case "--disable-com"
2115 blnOptDisableCOM = True
2116 case "--enable-com"
2117 blnOptDisableCOM = False
2118 case "--disable-udptunnel"
2119 blnOptDisableUDPTunnel = True
2120 case "--internal"
2121 g_blnInternalMode = True
2122 case "--internal-last"
2123 g_blnInternalFirst = False
2124 case "-h", "--help", "-?"
2125 usage
2126 Wscript.Quit(0)
2127 case else
2128 Wscript.echo "syntax error: Unknown option '" & str &"'."
2129 usage
2130 Wscript.Quit(1)
2131 end select
2132 next
2133
2134 '
2135 ' Initialize output files.
2136 '
2137 CfgInit
2138 EnvInit
2139
2140 '
2141 ' Check that the Shell function is sane.
2142 '
2143 g_objShell.Environment("PROCESS")("TESTING_ENVIRONMENT_INHERITANCE") = "This works"
2144 if Shell("set TESTING_ENVIRONMENT_INHERITANC", False) <> 0 then ' The 'E' is missing on purpose (4nt).
2145 MsgFatal "shell execution test failed!"
2146 end if
2147 if g_strShellOutput <> "TESTING_ENVIRONMENT_INHERITANCE=This works" & CHR(13) & CHR(10) then
2148 Print "Shell test Test -> '" & g_strShellOutput & "'"
2149 MsgFatal "shell inheritance or shell execution isn't working right. Make sure you use cmd.exe."
2150 end if
2151 g_objShell.Environment("PROCESS")("TESTING_ENVIRONMENT_INHERITANCE") = ""
2152 Print "Shell inheritance test: OK"
2153
2154 '
2155 ' Do the checks.
2156 '
2157 if blnOptDisableCOM = True then
2158 DisableCOM "--disable-com"
2159 end if
2160 if blnOptDisableUDPTunnel = True then
2161 DisableUDPTunnel "--disable-udptunnel"
2162 end if
2163 CheckSourcePath
2164 CheckForkBuild strOptkBuild
2165 CheckForWinDDK strOptDDK
2166 CfgPrint "VBOX_WITH_WDDM_W8 := " '' @todo look for WinDDKv8; Check with Misha if we _really_ need the v8 DDK...
2167 CheckForVisualCPP strOptVC, strOptVCCommon, blnOptVCExpressEdition
2168 CheckForPlatformSDK strOptSDK
2169 CheckForMidl
2170 CheckForMingW strOptMingw, strOptW32API
2171 CfgPrint "VBOX_WITH_OPEN_WATCOM := " '' @todo look for openwatcom 1.9+
2172 EnvPrint "set PATH=%PATH%;" & g_strPath& "/tools/win." & g_strTargetArch & "/bin;" '' @todo look for yasm
2173 CheckForlibSDL strOptlibSDL
2174 ' Don't check for these libraries by default as they are part of OSE
2175 ' Using external libs can add a dependency to iconv
2176 if (strOptXml2 <> "") then
2177 CheckForXml2 strOptXml2
2178 end if
2179 if (strOptXslt <> "") then
2180 CheckForXslt strOptXslt
2181 end if
2182 CheckForSsl strOptSsl
2183 CheckForCurl strOptCurl
2184 CheckForQt4 strOptQt4
2185 if (strOptPython <> "") then
2186 CheckForPython strOptPython
2187 end if
2188 if (strOptMkisofs <> "") then
2189 CheckForMkisofs strOptMkisofs
2190 end if
2191 if g_blnInternalMode then
2192 EnvPrint "call " & g_strPathDev & "/env.cmd %1 %2 %3 %4 %5 %6 %7 %8 %9"
2193 end if
2194
2195 Print ""
2196 Print "Execute env.bat once before you start to build VBox:"
2197 Print ""
2198 Print " env.bat"
2199 Print " kmk"
2200 Print ""
2201
2202End Sub
2203
2204
2205Main
2206
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