Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / sqlite / src / tool / build-all-msvc.bat
blob5f20ff4372a5fe5c76a629c9040552919e21bfc2
1 @ECHO OFF
3 ::
4 :: build-all-msvc.bat --
5 ::
6 :: Multi-Platform Build Tool for MSVC
7 ::
9 REM
10 REM This batch script is used to build the SQLite DLL for multiple platforms
11 REM and configurations using MSVC.  The built SQLite DLLs, their associated
12 REM import libraries, and optionally their symbols files, are placed within
13 REM the directory specified on the command line, in sub-directories named for
14 REM their respective platforms and configurations.  This batch script must be
15 REM run from inside a Visual Studio Command Prompt for the desired version of
16 REM Visual Studio ^(the initial platform configured for the command prompt does
17 REM not really matter^).  Exactly one command line argument is required, the
18 REM name of an existing directory to be used as the final destination directory
19 REM for the generated output files, which will be placed in sub-directories
20 REM created therein.  Ideally, the directory specified should be empty.
21 REM
22 REM Example:
23 REM
24 REM                        CD /D C:\dev\sqlite\core
25 REM                        tool\build-all-msvc.bat C:\Temp
26 REM
27 REM In the example above, "C:\dev\sqlite\core" represents the root of the
28 REM source tree for SQLite and "C:\Temp" represents the final destination
29 REM directory for the generated output files.
30 REM
31 REM There are several environment variables that may be set to modify the
32 REM behavior of this batch script and its associated Makefile.  The list of
33 REM platforms to build may be overriden by using the PLATFORMS environment
34 REM variable, which should contain a list of platforms ^(e.g. x86 x86_amd64
35 REM x86_arm^).  All platforms must be supported by the version of Visual Studio
36 REM being used.  The list of configurations to build may be overridden by
37 REM setting the CONFIGURATIONS environment variable, which should contain a
38 REM list of configurations to build ^(e.g. Debug Retail^).  Neither of these
39 REM variable values may contain any double quotes, surrounding or embedded.
40 REM Finally, the NCRTLIBPATH and NSDKLIBPATH environment variables may be set
41 REM to specify the location of the CRT and SDK, respectively, needed to compile
42 REM executables native to the architecture of the build machine during any
43 REM cross-compilation that may be necessary, depending on the platforms to be
44 REM built.  These values in these two variables should be surrounded by double
45 REM quotes if they contain spaces.
46 REM
47 REM Please note that the SQLite build process performed by the Makefile
48 REM associated with this batch script requires both Gawk ^(gawk.exe^) and Tcl
49 REM 8.5 ^(tclsh85.exe^) to be present in a directory contained in the PATH
50 REM environment variable unless a pre-existing amalgamation file is used.
51 REM
52 SETLOCAL
54 REM SET __ECHO=ECHO
55 REM SET __ECHO2=ECHO
56 REM SET __ECHO3=ECHO
57 IF NOT DEFINED _AECHO (SET _AECHO=REM)
58 IF NOT DEFINED _CECHO (SET _CECHO=REM)
59 IF NOT DEFINED _VECHO (SET _VECHO=REM)
61 %_AECHO% Running %0 %*
63 REM SET DFLAGS=/L
65 %_VECHO% DFlags = '%DFLAGS%'
67 SET FFLAGS=/V /F /G /H /I /R /Y /Z
69 %_VECHO% FFlags = '%FFLAGS%'
71 SET ROOT=%~dp0\..
72 SET ROOT=%ROOT:\\=\%
74 %_VECHO% Root = '%ROOT%'
76 REM
77 REM NOTE: The first and only argument to this batch file should be the output
78 REM       directory where the platform-specific binary directories should be
79 REM       created.
80 REM
81 SET BINARYDIRECTORY=%1
83 IF NOT DEFINED BINARYDIRECTORY (
84   GOTO usage
87 %_VECHO% BinaryDirectory = '%BINARYDIRECTORY%'
89 SET DUMMY=%2
91 IF DEFINED DUMMY (
92   GOTO usage
95 REM
96 REM NOTE: From this point, we need a clean error level.  Reset it now.
97 REM
98 CALL :fn_ResetErrorLevel
101 REM NOTE: Change the current directory to the root of the source tree, saving
102 REM       the current directory on the directory stack.
104 %__ECHO2% PUSHD "%ROOT%"
106 IF ERRORLEVEL 1 (
107   ECHO Could not change directory to "%ROOT%".
108   GOTO errors
112 REM NOTE: This batch file requires the ComSpec environment variable to be set,
113 REM       typically to something like "C:\Windows\System32\cmd.exe".
115 IF NOT DEFINED ComSpec (
116   ECHO The ComSpec environment variable must be defined.
117   GOTO errors
121 REM NOTE: This batch file requires the VcInstallDir environment variable to be
122 REM       set.  Tyipcally, this means this batch file needs to be run from an
123 REM       MSVC command prompt.
125 IF NOT DEFINED VCINSTALLDIR (
126   ECHO The VCINSTALLDIR environment variable must be defined.
127   GOTO errors
131 REM NOTE: If the list of platforms is not already set, use the default list.
133 IF NOT DEFINED PLATFORMS (
134   SET PLATFORMS=x86 x86_amd64 x86_arm
137 %_VECHO% Platforms = '%PLATFORMS%'
140 REM NOTE: If the list of configurations is not already set, use the default
141 REM       list.
143 IF NOT DEFINED CONFIGURATIONS (
144   SET CONFIGURATIONS=Debug Retail
147 %_VECHO% Configurations = '%CONFIGURATIONS%'
150 REM NOTE: If the command used to invoke NMAKE is not already set, use the
151 REM       default.
153 IF NOT DEFINED NMAKE_CMD (
154   SET NMAKE_CMD=nmake -B -f Makefile.msc
157 %_VECHO% NmakeCmd = '%NMAKE_CMD%'
158 %_VECHO% NmakeArgs = '%NMAKE_ARGS%'
161 REM NOTE: Setup environment variables to translate between the MSVC platform
162 REM       names and the names to be used for the platform-specific binary
163 REM       directories.
165 SET amd64_NAME=x64
166 SET arm_NAME=ARM
167 SET x64_NAME=x64
168 SET x86_NAME=x86
169 SET x86_amd64_NAME=x64
170 SET x86_arm_NAME=ARM
171 SET x86_x64_NAME=x64
173 %_VECHO% amd64_Name = '%amd64_NAME%'
174 %_VECHO% arm_Name = '%arm_NAME%'
175 %_VECHO% x64_Name = '%x64_NAME%'
176 %_VECHO% x86_Name = '%x86_NAME%'
177 %_VECHO% x86_amd64_Name = '%x86_amd64_NAME%'
178 %_VECHO% x86_arm_Name = '%x86_arm_NAME%'
179 %_VECHO% x86_x64_Name = '%x86_x64_NAME%'
182 REM NOTE: Check for the external tools needed during the build process ^(i.e.
183 REM       those that do not get compiled as part of the build process itself^)
184 REM       along the PATH.
186 FOR %%T IN (gawk.exe tclsh85.exe) DO (
187   SET %%T_PATH=%%~dp$PATH:T
191 REM NOTE: The Gawk executable "gawk.exe" is required during the SQLite build
192 REM       process unless a pre-existing amalgamation file is used.
194 IF NOT DEFINED gawk.exe_PATH (
195   ECHO The Gawk executable "gawk.exe" is required to be in the PATH.
196   GOTO errors
200 REM NOTE: The Tcl 8.5 executable "tclsh85.exe" is required during the SQLite
201 REM       build process unless a pre-existing amalgamation file is used.
203 IF NOT DEFINED tclsh85.exe_PATH (
204   ECHO The Tcl 8.5 executable "tclsh85.exe" is required to be in the PATH.
205   GOTO errors
209 REM NOTE: Set the TOOLPATH variable to contain all the directories where the
210 REM       external tools were found in the search above.
212 SET TOOLPATH=%gawk.exe_PATH%;%tclsh85.exe_PATH%
214 %_VECHO% ToolPath = '%TOOLPATH%'
217 REM NOTE: Check for MSVC 2012/2013 because the Windows SDK directory handling
218 REM       is slightly different for those versions.
220 IF "%VisualStudioVersion%" == "11.0" (
221   REM
222   REM NOTE: If the Windows SDK library path has already been set, do not set
223   REM       it to something else later on.
224   REM
225   IF NOT DEFINED NSDKLIBPATH (
226     SET SET_NSDKLIBPATH=1
227   )
228 ) ELSE IF "%VisualStudioVersion%" == "12.0" (
229   REM
230   REM NOTE: If the Windows SDK library path has already been set, do not set
231   REM       it to something else later on.
232   REM
233   IF NOT DEFINED NSDKLIBPATH (
234     SET SET_NSDKLIBPATH=1
235   )
236 ) ELSE (
237   CALL :fn_UnsetVariable SET_NSDKLIBPATH
241 REM NOTE: Check if this is the Windows Phone SDK.  If so, a different batch
242 REM       file is necessary to setup the build environment.  Since the variable
243 REM       values involved here may contain parenthesis, using GOTO instead of
244 REM       an IF block is required.
246 IF DEFINED WindowsPhoneKitDir GOTO set_vcvarsall_phone
247 SET VCVARSALL=%VCINSTALLDIR%\vcvarsall.bat
248 GOTO set_vcvarsall_done
249 :set_vcvarsall_phone
250 SET VCVARSALL=%VCINSTALLDIR%\WPSDK\WP80\vcvarsphoneall.bat
251 :set_vcvarsall_done
252 SET VCVARSALL=%VCVARSALL:\\=\%
255 REM NOTE: This is the outer loop.  There should be exactly one iteration per
256 REM       platform.
258 FOR %%P IN (%PLATFORMS%) DO (
259   REM
260   REM NOTE: Using the MSVC platform name, lookup the simpler platform name to
261   REM       be used for the name of the platform-specific binary directory via
262   REM       the environment variables setup earlier.
263   REM
264   CALL :fn_CopyVariable %%P_NAME PLATFORMNAME
266   REM
267   REM NOTE: This is the second loop.  There should be exactly one iteration.
268   REM       This loop is necessary because the PlatformName environment
269   REM       variable was set above and that value is needed by some of the
270   REM       commands contained in the inner loop.  If these commands were
271   REM       directly contained in the outer loop, the PlatformName environment
272   REM       variable would be stuck with its initial empty value instead.
273   REM
274   FOR /F "tokens=2* delims==" %%D IN ('SET PLATFORMNAME') DO (
275     REM
276     REM NOTE: Attempt to clean the environment of all variables used by MSVC
277     REM       and/or Visual Studio.  This block may need to be updated in the
278     REM       future to account for additional environment variables.
279     REM
280     CALL :fn_UnsetVariable CommandPromptType
281     CALL :fn_UnsetVariable DevEnvDir
282     CALL :fn_UnsetVariable ExtensionSdkDir
283     CALL :fn_UnsetVariable Framework35Version
284     CALL :fn_UnsetVariable Framework40Version
285     CALL :fn_UnsetVariable FrameworkDir
286     CALL :fn_UnsetVariable FrameworkDir32
287     CALL :fn_UnsetVariable FrameworkVersion
288     CALL :fn_UnsetVariable FrameworkVersion32
289     CALL :fn_UnsetVariable FSHARPINSTALLDIR
290     CALL :fn_UnsetVariable INCLUDE
291     CALL :fn_UnsetVariable LIB
292     CALL :fn_UnsetVariable LIBPATH
293     CALL :fn_UnsetVariable Platform
294     REM CALL :fn_UnsetVariable VCINSTALLDIR
295     CALL :fn_UnsetVariable VSINSTALLDIR
296     CALL :fn_UnsetVariable WindowsPhoneKitDir
297     CALL :fn_UnsetVariable WindowsSdkDir
298     CALL :fn_UnsetVariable WindowsSdkDir_35
299     CALL :fn_UnsetVariable WindowsSdkDir_old
300     CALL :fn_UnsetVariable WindowsSDK_ExecutablePath_x86
301     CALL :fn_UnsetVariable WindowsSDK_ExecutablePath_x64
303     REM
304     REM NOTE: Reset the PATH here to the absolute bare minimum required.
305     REM
306     SET PATH=%TOOLPATH%;%SystemRoot%\System32;%SystemRoot%
308     REM
309     REM NOTE: This is the inner loop.  There are normally two iterations, one
310     REM       for each supported build configuration, e.g. Debug or Retail.
311     REM
312     FOR %%B IN (%CONFIGURATIONS%) DO (
313       REM
314       REM NOTE: When preparing the debug build, set the DEBUG and MEMDEBUG
315       REM       environment variables to be picked up by the MSVC makefile
316       REM       itself.
317       REM
318       %_AECHO% Building the %%B configuration for platform %%P with name %%D...
320       IF /I "%%B" == "Debug" (
321         SET DEBUG=2
322         SET MEMDEBUG=1
323       ) ELSE (
324         CALL :fn_UnsetVariable DEBUG
325         CALL :fn_UnsetVariable MEMDEBUG
326       )
328       REM
329       REM NOTE: Launch a nested command shell to perform the following steps:
330       REM
331       REM       1. Setup the MSVC environment for this platform using the
332       REM          official batch file.
333       REM
334       REM       2. Make sure that no stale build output files are present.
335       REM
336       REM       3. Build the "sqlite3.dll" and "sqlite3.lib" binaries for this
337       REM          platform.
338       REM
339       REM       4. Copy the "sqlite3.dll" and "sqlite3.lib" binaries for this
340       REM          platform to the platform-specific directory beneath the
341       REM          binary directory.
342       REM
343       REM       5. Unless prevented from doing so, copy the "sqlite3.pdb"
344       REM          symbols file for this platform to the platform-specific
345       REM          directory beneath the binary directory.
346       REM
347       "%ComSpec%" /C (
348         REM
349         REM NOTE: Attempt to setup the MSVC environment for this platform.
350         REM
351         %__ECHO3% CALL "%VCVARSALL%" %%P
353         IF ERRORLEVEL 1 (
354           ECHO Failed to call "%VCVARSALL%" for platform %%P.
355           GOTO errors
356         )
358         REM
359         REM NOTE: If this batch file is not running in "what-if" mode, check to
360         REM       be sure we were actually able to setup the MSVC environment
361         REM       as current versions of their official batch file do not set
362         REM       the exit code upon failure.
363         REM
364         IF NOT DEFINED __ECHO3 (
365           IF NOT DEFINED WindowsPhoneKitDir (
366             IF NOT DEFINED WindowsSdkDir (
367               ECHO Cannot build, Windows SDK not found for platform %%P.
368               GOTO errors
369             )
370           )
371         )
373         REM
374         REM NOTE: When using MSVC 2012 and/or 2013, the native SDK path cannot
375         REM       simply use the "lib" sub-directory beneath the location
376         REM       specified in the WindowsSdkDir environment variable because
377         REM       that location does not actually contain the necessary library
378         REM       files for x86.  This must be done for each iteration because
379         REM       it relies upon the WindowsSdkDir environment variable being
380         REM       set by the batch file used to setup the MSVC environment.
381         REM
382         IF DEFINED SET_NSDKLIBPATH (
383           REM
384           REM NOTE: The Windows Phone SDK has a slightly different directory
385           REM       structure and must be handled specially here.
386           REM
387           IF DEFINED WindowsPhoneKitDir (
388             CALL :fn_CopyVariable WindowsPhoneKitDir NSDKLIBPATH
389             CALL :fn_AppendVariable NSDKLIBPATH \lib\x86
390           ) ELSE IF DEFINED WindowsSdkDir (
391             CALL :fn_CopyVariable WindowsSdkDir NSDKLIBPATH
393             REM
394             REM NOTE: The Windows 8.1 SDK has a slightly different directory
395             REM       naming convention.
396             REM
397             IF DEFINED USE_WINV63_NSDKLIBPATH (
398               CALL :fn_AppendVariable NSDKLIBPATH \lib\winv6.3\um\x86
399             ) ELSE IF "%VisualStudioVersion%" == "12.0" (
400               CALL :fn_AppendVariable NSDKLIBPATH \..\8.0\lib\win8\um\x86
401             ) ELSE (
402               CALL :fn_AppendVariable NSDKLIBPATH \lib\win8\um\x86
403             )
404           )
405         )
407         REM
408         REM NOTE: Unless prevented from doing so, invoke NMAKE with the MSVC
409         REM       makefile to clean any stale build output from previous
410         REM       iterations of this loop and/or previous runs of this batch
411         REM       file, etc.
412         REM
413         IF NOT DEFINED NOCLEAN (
414           %__ECHO% %NMAKE_CMD% clean
416           IF ERRORLEVEL 1 (
417             ECHO Failed to clean for platform %%P.
418             GOTO errors
419           )
420         ) ELSE (
421           REM
422           REM NOTE: Even when the cleaning step has been disabled, we still
423           REM       need to remove the build output for the files we are
424           REM       specifically wanting to build for each platform.
425           REM
426           %_AECHO% Cleaning final output files only...
427           %__ECHO% DEL /Q *.lo sqlite3.dll sqlite3.lib sqlite3.pdb
428         )
430         REM
431         REM NOTE: Call NMAKE with the MSVC makefile to build the "sqlite3.dll"
432         REM       binary.  The x86 compiler will be used to compile the native
433         REM       command line tools needed during the build process itself.
434         REM       Also, disable looking for and/or linking to the native Tcl
435         REM       runtime library.
436         REM
437         %__ECHO% %NMAKE_CMD% sqlite3.dll XCOMPILE=1 USE_NATIVE_LIBPATHS=1 NO_TCL=1 %NMAKE_ARGS%
439         IF ERRORLEVEL 1 (
440           ECHO Failed to build %%B "sqlite3.dll" for platform %%P.
441           GOTO errors
442         )
444         REM
445         REM NOTE: Copy the "sqlite3.dll" file to the appropriate directory for
446         REM       the build and platform beneath the binary directory.
447         REM
448         %__ECHO% XCOPY sqlite3.dll "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
450         IF ERRORLEVEL 1 (
451           ECHO Failed to copy "sqlite3.dll" to "%BINARYDIRECTORY%\%%B\%%D\".
452           GOTO errors
453         )
455         REM
456         REM NOTE: Copy the "sqlite3.lib" file to the appropriate directory for
457         REM       the build and platform beneath the binary directory.
458         REM
459         %__ECHO% XCOPY sqlite3.lib "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
461         IF ERRORLEVEL 1 (
462           ECHO Failed to copy "sqlite3.lib" to "%BINARYDIRECTORY%\%%B\%%D\".
463           GOTO errors
464         )
466         REM
467         REM NOTE: Copy the "sqlite3.pdb" file to the appropriate directory for
468         REM       the build and platform beneath the binary directory unless we
469         REM       are prevented from doing so.
470         REM
471         IF NOT DEFINED NOSYMBOLS (
472           %__ECHO% XCOPY sqlite3.pdb "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
474           IF ERRORLEVEL 1 (
475             ECHO Failed to copy "sqlite3.pdb" to "%BINARYDIRECTORY%\%%B\%%D\".
476             GOTO errors
477           )
478         )
479       )
480     )
481   )
483   REM
484   REM NOTE: Handle any errors generated during the nested command shell.
485   REM
486   IF ERRORLEVEL 1 (
487     GOTO errors
488   )
492 REM NOTE: Restore the saved current directory from the directory stack.
494 %__ECHO2% POPD
496 IF ERRORLEVEL 1 (
497   ECHO Could not restore directory.
498   GOTO errors
502 REM NOTE: If we get to this point, we have succeeded.
504 GOTO no_errors
506 :fn_ResetErrorLevel
507   VERIFY > NUL
508   GOTO :EOF
510 :fn_SetErrorLevel
511   VERIFY MAYBE 2> NUL
512   GOTO :EOF
514 :fn_CopyVariable
515   IF NOT DEFINED %1 GOTO :EOF
516   IF "%2" == "" GOTO :EOF
517   SETLOCAL
518   SET __ECHO_CMD=ECHO %%%1%%
519   FOR /F "delims=" %%V IN ('%__ECHO_CMD%') DO (
520     SET VALUE=%%V
521   )
522   ENDLOCAL && SET %2=%VALUE%
523   GOTO :EOF
525 :fn_UnsetVariable
526   IF NOT "%1" == "" (
527     SET %1=
528     CALL :fn_ResetErrorLevel
529   )
530   GOTO :EOF
532 :fn_AppendVariable
533   SET __ECHO_CMD=ECHO %%%1%%
534   IF DEFINED %1 (
535     FOR /F "delims=" %%V IN ('%__ECHO_CMD%') DO (
536       SET %1=%%V%~2
537     )
538   ) ELSE (
539     SET %1=%~2
540   )
541   SET __ECHO_CMD=
542   CALL :fn_ResetErrorLevel
543   GOTO :EOF
545 :usage
546   ECHO.
547   ECHO Usage: %~nx0 ^<binaryDirectory^>
548   ECHO.
549   GOTO errors
551 :errors
552   CALL :fn_SetErrorLevel
553   ENDLOCAL
554   ECHO.
555   ECHO Failure, errors were encountered.
556   GOTO end_of_file
558 :no_errors
559   CALL :fn_ResetErrorLevel
560   ENDLOCAL
561   ECHO.
562   ECHO Success, no errors were encountered.
563   GOTO end_of_file
565 :end_of_file
566 %__ECHO% EXIT /B %ERRORLEVEL%