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