blob: aaeb67bdfb98df1ad7730dc161d289fd7f29014d [file] [log] [blame]
mistachkin31856a32012-07-27 07:13:25 +00001@ECHO OFF
2
3::
4:: build-all-msvc.bat --
5::
6:: Multi-Platform Build Tool for MSVC
7::
8
mistachkin7c5dbdf2012-10-19 00:23:31 +00009REM
10REM This batch script is used to build the SQLite DLL for multiple platforms
11REM and configurations using MSVC. The built SQLite DLLs, their associated
12REM import libraries, and optionally their symbols files, are placed within
13REM the directory specified on the command line, in sub-directories named for
14REM their respective platforms and configurations. This batch script must be
15REM run from inside a Visual Studio Command Prompt for the desired version of
16REM Visual Studio ^(the initial platform configured for the command prompt does
17REM not really matter^). Exactly one command line argument is required, the
18REM name of an existing directory to be used as the final destination directory
19REM for the generated output files, which will be placed in sub-directories
20REM created therein. Ideally, the directory specified should be empty.
21REM
22REM Example:
23REM
24REM CD /D C:\dev\sqlite\core
mistachkinb0c99af2016-02-19 05:07:56 +000025REM CALL tool\build-all-msvc.bat C:\Temp
mistachkin7c5dbdf2012-10-19 00:23:31 +000026REM
27REM In the example above, "C:\dev\sqlite\core" represents the root of the
28REM source tree for SQLite and "C:\Temp" represents the final destination
29REM directory for the generated output files.
30REM
mistachkin88eb7fa2015-04-19 18:58:29 +000031REM Please note that the SQLite build process performed by the Makefile
mistachkinfcbe99a2015-10-12 03:56:21 +000032REM associated with this batch script requires a Tcl shell to be present
33REM in a directory contained in the PATH environment variable unless a
34REM pre-existing amalgamation file is used.
mistachkin88eb7fa2015-04-19 18:58:29 +000035REM
mistachkin7c5dbdf2012-10-19 00:23:31 +000036REM There are several environment variables that may be set to modify the
37REM behavior of this batch script and its associated Makefile. The list of
38REM platforms to build may be overriden by using the PLATFORMS environment
39REM variable, which should contain a list of platforms ^(e.g. x86 x86_amd64
40REM x86_arm^). All platforms must be supported by the version of Visual Studio
41REM being used. The list of configurations to build may be overridden by
42REM setting the CONFIGURATIONS environment variable, which should contain a
43REM list of configurations to build ^(e.g. Debug Retail^). Neither of these
44REM variable values may contain any double quotes, surrounding or embedded.
mistachkin7c5dbdf2012-10-19 00:23:31 +000045REM
mistachkin88eb7fa2015-04-19 18:58:29 +000046REM Finally, the NCRTLIBPATH, NUCRTLIBPATH, and NSDKLIBPATH environment
47REM variables may be set to specify the location of the CRT, Universal CRT, and
48REM Windows SDK, respectively, that may be needed to compile executables native
49REM to the architecture of the build machine during any cross-compilation that
50REM may be necessary, depending on the platforms to be built. These values in
51REM these three variables should be surrounded by double quotes if they contain
52REM spaces.
53REM
54REM There are a few other environment variables that impact the build process
55REM when set ^(to anything^), they are:
56REM
mistachkinb0c99af2016-02-19 05:07:56 +000057REM USE_AUTOCONF_MAKEFILE
58REM
59REM When set, the "autoconf" Makefile for MSVC will be used instead of the main
60REM Makefile for MSVC. It must exist at "%ROOT%\autoconf\Makefile.msc".
61REM
mistachkin88eb7fa2015-04-19 18:58:29 +000062REM NOCLEAN
63REM
64REM When set, the "clean" target will not be used during each build iteration.
65REM However, the target binaries, if any, will still be deleted manually prior
66REM to being rebuilt. Setting this environment variable is only rarely needed
67REM and could cause issues in some circumstances; therefore, setting it is not
68REM recommended.
69REM
70REM NOSYMBOLS
71REM
72REM When set, copying of symbol files ^(*.pdb^) created during the build will
73REM be skipped and they will not appear in the final destination directory.
74REM Setting this environment variable is never strictly needed and could cause
75REM issues in some circumstances; therefore, setting it is not recommended.
76REM
mistachkinb9076ba2016-02-19 00:47:18 +000077REM NOMEMDEBUG
78REM
79REM When set, disables use of MEMDEBUG when building binaries for the "Debug"
80REM configuration.
81REM
mistachkin88eb7fa2015-04-19 18:58:29 +000082REM BUILD_ALL_SHELL
83REM
84REM When set, the command line shell will be built for each selected platform
85REM and configuration as well. In addition, the command line shell binaries
86REM will be copied, with their symbols, to the final destination directory.
87REM
88REM USE_WINV63_NSDKLIBPATH
89REM
90REM When set, modifies how the NSDKLIBPATH environment variable is built, based
91REM on the WindowsSdkDir environment variable. It forces this batch script to
92REM assume the Windows 8.1 SDK location should be used.
93REM
94REM USE_WINV100_NSDKLIBPATH
95REM
96REM When set, modifies how the NSDKLIBPATH environment variable is built, based
97REM on the WindowsSdkDir environment variable. It causes this batch script to
98REM assume the Windows 10.0 SDK location should be used.
mistachkin7c5dbdf2012-10-19 00:23:31 +000099REM
mistachkin1c89a772015-04-19 19:53:43 +0000100REM NMAKE_ARGS
mistachkinb0c99af2016-02-19 05:07:56 +0000101REM NMAKE_ARGS_DEBUG
102REM NMAKE_ARGS_RETAIL
mistachkin1c89a772015-04-19 19:53:43 +0000103REM
mistachkinb0c99af2016-02-19 05:07:56 +0000104REM When set, these values are expanded and passed to the NMAKE command line,
105REM after its other arguments. These may be used to specify additional NMAKE
106REM options, for example:
mistachkin1c89a772015-04-19 19:53:43 +0000107REM
108REM SET NMAKE_ARGS=FOR_WINRT=1
mistachkinb0c99af2016-02-19 05:07:56 +0000109REM SET NMAKE_ARGS_DEBUG=MEMDEBUG=1
110REM SET NMAKE_ARGS_RETAIL=WIN32HEAP=1
mistachkin1c89a772015-04-19 19:53:43 +0000111REM
mistachkinde4148e2015-10-29 01:11:39 +0000112REM Using the above command before running this tool will cause the compiled
113REM binaries to target the WinRT environment, which provides a subset of the
114REM Win32 API.
115REM
mistachkinb9076ba2016-02-19 00:47:18 +0000116REM DLL_FILE_NAME
117REM DLL_PDB_FILE_NAME
118REM LIB_FILE_NAME
119REM EXE_FILE_NAME
120REM EXE_PDB_FILE_NAME
121REM
122REM When set, these values will override the associated target file name used
123REM for the build.
124REM
mistachkin31856a32012-07-27 07:13:25 +0000125SETLOCAL
126
127REM SET __ECHO=ECHO
128REM SET __ECHO2=ECHO
mistachkin0ec07442012-10-12 18:06:07 +0000129REM SET __ECHO3=ECHO
mistachkin31856a32012-07-27 07:13:25 +0000130IF NOT DEFINED _AECHO (SET _AECHO=REM)
131IF NOT DEFINED _CECHO (SET _CECHO=REM)
132IF NOT DEFINED _VECHO (SET _VECHO=REM)
133
mistachkin44723ce2015-03-21 02:22:37 +0000134SET REDIRECT=^>
135IF DEFINED __ECHO SET REDIRECT=^^^>
136
mistachkin31856a32012-07-27 07:13:25 +0000137%_AECHO% Running %0 %*
138
139REM SET DFLAGS=/L
140
141%_VECHO% DFlags = '%DFLAGS%'
142
143SET FFLAGS=/V /F /G /H /I /R /Y /Z
144
145%_VECHO% FFlags = '%FFLAGS%'
146
147SET ROOT=%~dp0\..
148SET ROOT=%ROOT:\\=\%
149
150%_VECHO% Root = '%ROOT%'
151
152REM
153REM NOTE: The first and only argument to this batch file should be the output
154REM directory where the platform-specific binary directories should be
155REM created.
156REM
157SET BINARYDIRECTORY=%1
158
159IF NOT DEFINED BINARYDIRECTORY (
160 GOTO usage
161)
162
163%_VECHO% BinaryDirectory = '%BINARYDIRECTORY%'
164
165SET DUMMY=%2
166
167IF DEFINED DUMMY (
168 GOTO usage
169)
170
171REM
172REM NOTE: From this point, we need a clean error level. Reset it now.
173REM
174CALL :fn_ResetErrorLevel
175
176REM
177REM NOTE: Change the current directory to the root of the source tree, saving
178REM the current directory on the directory stack.
179REM
180%__ECHO2% PUSHD "%ROOT%"
181
182IF ERRORLEVEL 1 (
183 ECHO Could not change directory to "%ROOT%".
184 GOTO errors
185)
186
187REM
188REM NOTE: This batch file requires the ComSpec environment variable to be set,
189REM typically to something like "C:\Windows\System32\cmd.exe".
190REM
191IF NOT DEFINED ComSpec (
192 ECHO The ComSpec environment variable must be defined.
193 GOTO errors
194)
195
196REM
197REM NOTE: This batch file requires the VcInstallDir environment variable to be
198REM set. Tyipcally, this means this batch file needs to be run from an
199REM MSVC command prompt.
200REM
201IF NOT DEFINED VCINSTALLDIR (
202 ECHO The VCINSTALLDIR environment variable must be defined.
203 GOTO errors
204)
205
206REM
207REM NOTE: If the list of platforms is not already set, use the default list.
208REM
209IF NOT DEFINED PLATFORMS (
210 SET PLATFORMS=x86 x86_amd64 x86_arm
211)
212
213%_VECHO% Platforms = '%PLATFORMS%'
214
215REM
mistachkin7c5dbdf2012-10-19 00:23:31 +0000216REM NOTE: If the list of configurations is not already set, use the default
217REM list.
218REM
219IF NOT DEFINED CONFIGURATIONS (
220 SET CONFIGURATIONS=Debug Retail
221)
222
223%_VECHO% Configurations = '%CONFIGURATIONS%'
224
225REM
mistachkin220942b2014-05-05 21:08:47 +0000226REM NOTE: If the command used to invoke NMAKE is not already set, use the
227REM default.
228REM
229IF NOT DEFINED NMAKE_CMD (
mistachkinb0c99af2016-02-19 05:07:56 +0000230 IF DEFINED USE_AUTOCONF_MAKEFILE (
231 SET NMAKE_CMD=nmake -B -f autoconf\Makefile.msc
232 ) ELSE (
233 SET NMAKE_CMD=nmake -B -f Makefile.msc
234 )
mistachkin220942b2014-05-05 21:08:47 +0000235)
236
237%_VECHO% NmakeCmd = '%NMAKE_CMD%'
238%_VECHO% NmakeArgs = '%NMAKE_ARGS%'
mistachkinb0c99af2016-02-19 05:07:56 +0000239%_VECHO% NmakeArgsDebug = '%NMAKE_ARGS_DEBUG%'
240%_VECHO% NmakeArgsRetail = '%NMAKE_ARGS_RETAIL%'
mistachkin220942b2014-05-05 21:08:47 +0000241
242REM
mistachkin31856a32012-07-27 07:13:25 +0000243REM NOTE: Setup environment variables to translate between the MSVC platform
244REM names and the names to be used for the platform-specific binary
245REM directories.
246REM
mistachkin0f801702012-10-20 08:40:05 +0000247SET amd64_NAME=x64
248SET arm_NAME=ARM
249SET x64_NAME=x64
mistachkin31856a32012-07-27 07:13:25 +0000250SET x86_NAME=x86
251SET x86_amd64_NAME=x64
252SET x86_arm_NAME=ARM
mistachkin0f801702012-10-20 08:40:05 +0000253SET x86_x64_NAME=x64
mistachkin31856a32012-07-27 07:13:25 +0000254
mistachkin0f801702012-10-20 08:40:05 +0000255%_VECHO% amd64_Name = '%amd64_NAME%'
256%_VECHO% arm_Name = '%arm_NAME%'
257%_VECHO% x64_Name = '%x64_NAME%'
mistachkin31856a32012-07-27 07:13:25 +0000258%_VECHO% x86_Name = '%x86_NAME%'
259%_VECHO% x86_amd64_Name = '%x86_amd64_NAME%'
260%_VECHO% x86_arm_Name = '%x86_arm_NAME%'
mistachkin0f801702012-10-20 08:40:05 +0000261%_VECHO% x86_x64_Name = '%x86_x64_NAME%'
mistachkin31856a32012-07-27 07:13:25 +0000262
263REM
264REM NOTE: Check for the external tools needed during the build process ^(i.e.
265REM those that do not get compiled as part of the build process itself^)
266REM along the PATH.
267REM
mistachkinfcbe99a2015-10-12 03:56:21 +0000268IF DEFINED TCLSH_CMD (
269 SET TCLSH_FILE=%TCLSH_CMD%
270) ELSE (
mistachkina622d902016-11-03 21:35:10 +0000271 SET TCLSH_FILE=tclsh.exe
mistachkinfcbe99a2015-10-12 03:56:21 +0000272)
273
274FOR %%T IN (%TCLSH_FILE%) DO (
mistachkin31856a32012-07-27 07:13:25 +0000275 SET %%T_PATH=%%~dp$PATH:T
276)
277
278REM
mistachkinfcbe99a2015-10-12 03:56:21 +0000279REM NOTE: A Tcl shell executable is required during the SQLite build process
280REM unless a pre-existing amalgamation file is used.
mistachkin7c5dbdf2012-10-19 00:23:31 +0000281REM
mistachkinfcbe99a2015-10-12 03:56:21 +0000282IF NOT DEFINED %TCLSH_FILE%_PATH (
283 ECHO The Tcl shell executable "%TCLSH_FILE%" is required to be in the PATH.
mistachkin7c5dbdf2012-10-19 00:23:31 +0000284 GOTO errors
285)
286
287REM
mistachkinb9076ba2016-02-19 00:47:18 +0000288REM NOTE: Setup the default names for the build targets we are creating. Any
289REM ^(or all^) of these may end up being overridden.
290REM
291IF NOT DEFINED DLL_FILE_NAME (
292 SET DLL_FILE_NAME=sqlite3.dll
293)
294
295IF NOT DEFINED DLL_PDB_FILE_NAME (
296 SET DLL_PDB_FILE_NAME=sqlite3.pdb
297)
298
299IF NOT DEFINED LIB_FILE_NAME (
300 SET LIB_FILE_NAME=sqlite3.lib
301)
302
303IF NOT DEFINED EXE_FILE_NAME (
304 SET EXE_FILE_NAME=sqlite3.exe
305)
306
307IF NOT DEFINED EXE_PDB_FILE_NAME (
308 SET EXE_PDB_FILE_NAME=sqlite3sh.pdb
309)
310
311REM
mistachkin31856a32012-07-27 07:13:25 +0000312REM NOTE: Set the TOOLPATH variable to contain all the directories where the
313REM external tools were found in the search above.
314REM
mistachkinfcbe99a2015-10-12 03:56:21 +0000315CALL :fn_CopyVariable %TCLSH_FILE%_PATH TOOLPATH
mistachkin31856a32012-07-27 07:13:25 +0000316
317%_VECHO% ToolPath = '%TOOLPATH%'
318
319REM
mistachkin6bbe3df2015-04-19 06:18:10 +0000320REM NOTE: Setting the Windows SDK library path is only required for MSVC
321REM 2012, 2013, and 2015.
322REM
323CALL :fn_UnsetVariable SET_NSDKLIBPATH
324
325REM
326REM NOTE: Setting the Universal CRT library path is only required for MSVC
327REM 2015.
328REM
329CALL :fn_UnsetVariable SET_NUCRTLIBPATH
330
331REM
332REM NOTE: Check for MSVC 2012, 2013, and 2015 specially because the Windows
333REM SDK directory handling is slightly different for those versions.
mistachkinfd0ba2a2012-07-27 08:21:45 +0000334REM
335IF "%VisualStudioVersion%" == "11.0" (
mistachkin7c5dbdf2012-10-19 00:23:31 +0000336 REM
337 REM NOTE: If the Windows SDK library path has already been set, do not set
338 REM it to something else later on.
339 REM
340 IF NOT DEFINED NSDKLIBPATH (
341 SET SET_NSDKLIBPATH=1
342 )
mistachkin50420542013-06-20 18:53:33 +0000343) ELSE IF "%VisualStudioVersion%" == "12.0" (
344 REM
345 REM NOTE: If the Windows SDK library path has already been set, do not set
346 REM it to something else later on.
347 REM
348 IF NOT DEFINED NSDKLIBPATH (
349 SET SET_NSDKLIBPATH=1
350 )
mistachkin6bbe3df2015-04-19 06:18:10 +0000351) ELSE IF "%VisualStudioVersion%" == "14.0" (
352 REM
353 REM NOTE: If the Windows SDK library path has already been set, do not set
354 REM it to something else later on.
355 REM
356 IF NOT DEFINED NSDKLIBPATH (
357 SET SET_NSDKLIBPATH=1
358 )
359
360 REM
361 REM NOTE: If the Universal CRT library path has already been set, do not set
362 REM it to something else later on.
363 REM
364 IF NOT DEFINED NUCRTLIBPATH (
365 SET SET_NUCRTLIBPATH=1
366 )
mistachkinfd0ba2a2012-07-27 08:21:45 +0000367)
368
369REM
mistachkina09767b2015-08-24 17:18:43 +0000370REM NOTE: This is the name of the sub-directory where the UCRT libraries may
371REM be found. It is only used when compiling against the UCRT.
372REM
373IF DEFINED UCRTVersion (
374 SET NUCRTVER=%UCRTVersion%
375) ELSE (
mistachkin855ed4a2015-12-07 23:31:59 +0000376 SET NUCRTVER=10.0.10586.0
mistachkina09767b2015-08-24 17:18:43 +0000377)
378
379REM
mistachkin9b714142015-07-28 19:35:26 +0000380REM NOTE: This is the name of the sub-directory where the Windows 10.0 SDK
381REM libraries may be found. It is only used when compiling with the
382REM Windows 10.0 SDK.
383REM
mistachkina09767b2015-08-24 17:18:43 +0000384IF DEFINED WindowsSDKLibVersion (
385 SET WIN10SDKVER=%WindowsSDKLibVersion:\=%
386) ELSE (
387 SET WIN10SDKVER=%NUCRTVER%
388)
mistachkin9b714142015-07-28 19:35:26 +0000389
390REM
mistachkin0f801702012-10-20 08:40:05 +0000391REM NOTE: Check if this is the Windows Phone SDK. If so, a different batch
392REM file is necessary to setup the build environment. Since the variable
393REM values involved here may contain parenthesis, using GOTO instead of
394REM an IF block is required.
395REM
396IF DEFINED WindowsPhoneKitDir GOTO set_vcvarsall_phone
397SET VCVARSALL=%VCINSTALLDIR%\vcvarsall.bat
398GOTO set_vcvarsall_done
399:set_vcvarsall_phone
400SET VCVARSALL=%VCINSTALLDIR%\WPSDK\WP80\vcvarsphoneall.bat
401:set_vcvarsall_done
mistachkinf6a23422014-05-05 20:24:34 +0000402SET VCVARSALL=%VCVARSALL:\\=\%
mistachkin0f801702012-10-20 08:40:05 +0000403
404REM
mistachkin31856a32012-07-27 07:13:25 +0000405REM NOTE: This is the outer loop. There should be exactly one iteration per
406REM platform.
407REM
408FOR %%P IN (%PLATFORMS%) DO (
409 REM
410 REM NOTE: Using the MSVC platform name, lookup the simpler platform name to
411 REM be used for the name of the platform-specific binary directory via
412 REM the environment variables setup earlier.
413 REM
mistachkind744fcc2012-10-05 07:36:34 +0000414 CALL :fn_CopyVariable %%P_NAME PLATFORMNAME
mistachkin31856a32012-07-27 07:13:25 +0000415
416 REM
mistachkin293566e2013-10-31 06:39:15 +0000417 REM NOTE: This is the second loop. There should be exactly one iteration.
mistachkin31856a32012-07-27 07:13:25 +0000418 REM This loop is necessary because the PlatformName environment
419 REM variable was set above and that value is needed by some of the
420 REM commands contained in the inner loop. If these commands were
421 REM directly contained in the outer loop, the PlatformName environment
422 REM variable would be stuck with its initial empty value instead.
423 REM
424 FOR /F "tokens=2* delims==" %%D IN ('SET PLATFORMNAME') DO (
425 REM
426 REM NOTE: Attempt to clean the environment of all variables used by MSVC
427 REM and/or Visual Studio. This block may need to be updated in the
428 REM future to account for additional environment variables.
429 REM
mistachkin7dd9fb62014-05-05 22:43:17 +0000430 CALL :fn_UnsetVariable CommandPromptType
mistachkin31856a32012-07-27 07:13:25 +0000431 CALL :fn_UnsetVariable DevEnvDir
mistachkina09767b2015-08-24 17:18:43 +0000432 CALL :fn_UnsetVariable DNX_HOME
mistachkinfd0ba2a2012-07-27 08:21:45 +0000433 CALL :fn_UnsetVariable ExtensionSdkDir
mistachkin31856a32012-07-27 07:13:25 +0000434 CALL :fn_UnsetVariable Framework35Version
mistachkinf6a23422014-05-05 20:24:34 +0000435 CALL :fn_UnsetVariable Framework40Version
mistachkin31856a32012-07-27 07:13:25 +0000436 CALL :fn_UnsetVariable FrameworkDir
437 CALL :fn_UnsetVariable FrameworkDir32
438 CALL :fn_UnsetVariable FrameworkVersion
439 CALL :fn_UnsetVariable FrameworkVersion32
mistachkinfd0ba2a2012-07-27 08:21:45 +0000440 CALL :fn_UnsetVariable FSHARPINSTALLDIR
mistachkin31856a32012-07-27 07:13:25 +0000441 CALL :fn_UnsetVariable INCLUDE
442 CALL :fn_UnsetVariable LIB
443 CALL :fn_UnsetVariable LIBPATH
mistachkina09767b2015-08-24 17:18:43 +0000444 CALL :fn_UnsetVariable NETFXSDKDir
mistachkin31856a32012-07-27 07:13:25 +0000445 CALL :fn_UnsetVariable Platform
mistachkina09767b2015-08-24 17:18:43 +0000446 CALL :fn_UnsetVariable UCRTVersion
mistachkin6bbe3df2015-04-19 06:18:10 +0000447 CALL :fn_UnsetVariable UniversalCRTSdkDir
mistachkin31856a32012-07-27 07:13:25 +0000448 REM CALL :fn_UnsetVariable VCINSTALLDIR
449 CALL :fn_UnsetVariable VSINSTALLDIR
mistachkina09767b2015-08-24 17:18:43 +0000450 CALL :fn_UnsetVariable WindowsLibPath
mistachkin0f801702012-10-20 08:40:05 +0000451 CALL :fn_UnsetVariable WindowsPhoneKitDir
mistachkin31856a32012-07-27 07:13:25 +0000452 CALL :fn_UnsetVariable WindowsSdkDir
mistachkinfd0ba2a2012-07-27 08:21:45 +0000453 CALL :fn_UnsetVariable WindowsSdkDir_35
454 CALL :fn_UnsetVariable WindowsSdkDir_old
mistachkina09767b2015-08-24 17:18:43 +0000455 CALL :fn_UnsetVariable WindowsSDKLibVersion
456 CALL :fn_UnsetVariable WindowsSDKVersion
mistachkinf6a23422014-05-05 20:24:34 +0000457 CALL :fn_UnsetVariable WindowsSDK_ExecutablePath_x86
458 CALL :fn_UnsetVariable WindowsSDK_ExecutablePath_x64
mistachkin31856a32012-07-27 07:13:25 +0000459
460 REM
461 REM NOTE: Reset the PATH here to the absolute bare minimum required.
462 REM
mistachkin6e5688d2017-02-27 17:16:27 +0000463 CALL :fn_ResetPath
mistachkin31856a32012-07-27 07:13:25 +0000464
mistachkin293566e2013-10-31 06:39:15 +0000465 REM
466 REM NOTE: This is the inner loop. There are normally two iterations, one
467 REM for each supported build configuration, e.g. Debug or Retail.
468 REM
mistachkin7c5dbdf2012-10-19 00:23:31 +0000469 FOR %%B IN (%CONFIGURATIONS%) DO (
mistachkin31856a32012-07-27 07:13:25 +0000470 REM
mistachkin0ec07442012-10-12 18:06:07 +0000471 REM NOTE: When preparing the debug build, set the DEBUG and MEMDEBUG
472 REM environment variables to be picked up by the MSVC makefile
473 REM itself.
mistachkin31856a32012-07-27 07:13:25 +0000474 REM
mistachkin7dd9fb62014-05-05 22:43:17 +0000475 %_AECHO% Building the %%B configuration for platform %%P with name %%D...
mistachkin220942b2014-05-05 21:08:47 +0000476
mistachkin0ec07442012-10-12 18:06:07 +0000477 IF /I "%%B" == "Debug" (
mistachkin774f42b2015-03-21 22:23:46 +0000478 REM
479 REM NOTE: Using this level for the DEBUG environment variable should
480 REM disable all compiler optimizations and prevent use of the
481 REM NDEBUG define. Additionally, both SQLITE_ENABLE_API_ARMOR
482 REM and SQLITE_DEBUG defines should be enabled.
483 REM
mistachkin082be632015-03-21 22:13:47 +0000484 SET DEBUG=3
mistachkin774f42b2015-03-21 22:23:46 +0000485
486 REM
487 REM NOTE: Setting this to non-zero should enable the SQLITE_MEMDEBUG
488 REM define.
489 REM
mistachkinb9076ba2016-02-19 00:47:18 +0000490 IF NOT DEFINED NOMEMDEBUG (
491 SET MEMDEBUG=1
492 )
mistachkin0b5ae722012-07-27 23:03:47 +0000493 ) ELSE (
mistachkin0ec07442012-10-12 18:06:07 +0000494 CALL :fn_UnsetVariable DEBUG
495 CALL :fn_UnsetVariable MEMDEBUG
496 )
497
498 REM
mistachkinb0c99af2016-02-19 05:07:56 +0000499 REM NOTE: Copy the extra NMAKE arguments for this configuration into the
500 REM common variable used by the actual commands.
501 REM
502 CALL :fn_CopyVariable NMAKE_ARGS_%%B NMAKE_ARGS_CFG
503
504 REM
mistachkin0ec07442012-10-12 18:06:07 +0000505 REM NOTE: Launch a nested command shell to perform the following steps:
506 REM
507 REM 1. Setup the MSVC environment for this platform using the
508 REM official batch file.
509 REM
510 REM 2. Make sure that no stale build output files are present.
511 REM
512 REM 3. Build the "sqlite3.dll" and "sqlite3.lib" binaries for this
513 REM platform.
514 REM
515 REM 4. Copy the "sqlite3.dll" and "sqlite3.lib" binaries for this
516 REM platform to the platform-specific directory beneath the
517 REM binary directory.
518 REM
mistachkin293566e2013-10-31 06:39:15 +0000519 REM 5. Unless prevented from doing so, copy the "sqlite3.pdb"
520 REM symbols file for this platform to the platform-specific
521 REM directory beneath the binary directory.
522 REM
mistachkin0ec07442012-10-12 18:06:07 +0000523 "%ComSpec%" /C (
mistachkin0b5ae722012-07-27 23:03:47 +0000524 REM
mistachkin0ec07442012-10-12 18:06:07 +0000525 REM NOTE: Attempt to setup the MSVC environment for this platform.
mistachkin0b5ae722012-07-27 23:03:47 +0000526 REM
mistachkin0f801702012-10-20 08:40:05 +0000527 %__ECHO3% CALL "%VCVARSALL%" %%P
mistachkin391b3642012-07-31 00:43:31 +0000528
529 IF ERRORLEVEL 1 (
mistachkin0f801702012-10-20 08:40:05 +0000530 ECHO Failed to call "%VCVARSALL%" for platform %%P.
mistachkin391b3642012-07-31 00:43:31 +0000531 GOTO errors
532 )
mistachkin0ec07442012-10-12 18:06:07 +0000533
534 REM
535 REM NOTE: If this batch file is not running in "what-if" mode, check to
536 REM be sure we were actually able to setup the MSVC environment
537 REM as current versions of their official batch file do not set
538 REM the exit code upon failure.
539 REM
mistachkin0f801702012-10-20 08:40:05 +0000540 IF NOT DEFINED __ECHO3 (
541 IF NOT DEFINED WindowsPhoneKitDir (
542 IF NOT DEFINED WindowsSdkDir (
543 ECHO Cannot build, Windows SDK not found for platform %%P.
544 GOTO errors
545 )
mistachkin0ec07442012-10-12 18:06:07 +0000546 )
547 )
548
549 REM
mistachkin6bbe3df2015-04-19 06:18:10 +0000550 REM NOTE: When using MSVC 2012, 2013, or 2015, the native SDK path
551 REM cannot simply be the "lib" sub-directory beneath the location
mistachkin293566e2013-10-31 06:39:15 +0000552 REM specified in the WindowsSdkDir environment variable because
553 REM that location does not actually contain the necessary library
554 REM files for x86. This must be done for each iteration because
555 REM it relies upon the WindowsSdkDir environment variable being
556 REM set by the batch file used to setup the MSVC environment.
mistachkin0ec07442012-10-12 18:06:07 +0000557 REM
558 IF DEFINED SET_NSDKLIBPATH (
mistachkin293566e2013-10-31 06:39:15 +0000559 REM
560 REM NOTE: The Windows Phone SDK has a slightly different directory
561 REM structure and must be handled specially here.
562 REM
mistachkin0f801702012-10-20 08:40:05 +0000563 IF DEFINED WindowsPhoneKitDir (
564 CALL :fn_CopyVariable WindowsPhoneKitDir NSDKLIBPATH
565 CALL :fn_AppendVariable NSDKLIBPATH \lib\x86
566 ) ELSE IF DEFINED WindowsSdkDir (
567 CALL :fn_CopyVariable WindowsSdkDir NSDKLIBPATH
mistachkin50420542013-06-20 18:53:33 +0000568
mistachkin293566e2013-10-31 06:39:15 +0000569 REM
mistachkin88eb7fa2015-04-19 18:58:29 +0000570 REM NOTE: The Windows 8.x and Windows 10.0 SDKs have a slightly
mistachkin6bbe3df2015-04-19 06:18:10 +0000571 REM different directory naming conventions.
mistachkin293566e2013-10-31 06:39:15 +0000572 REM
mistachkin6bbe3df2015-04-19 06:18:10 +0000573 IF DEFINED USE_WINV100_NSDKLIBPATH (
mistachkina09767b2015-08-24 17:18:43 +0000574 CALL :fn_AppendVariable NSDKLIBPATH \..\10\lib\%WIN10SDKVER%\um\x86
575 CALL :fn_CopyVariable WindowsSdkDir PSDKLIBPATH
576 CALL :fn_AppendVariable PSDKLIBPATH lib\%WIN10SDKVER%\um\%%D
mistachkin6bbe3df2015-04-19 06:18:10 +0000577 ) ELSE IF DEFINED USE_WINV63_NSDKLIBPATH (
mistachkin50420542013-06-20 18:53:33 +0000578 CALL :fn_AppendVariable NSDKLIBPATH \lib\winv6.3\um\x86
mistachkin7dd9fb62014-05-05 22:43:17 +0000579 ) ELSE IF "%VisualStudioVersion%" == "12.0" (
580 CALL :fn_AppendVariable NSDKLIBPATH \..\8.0\lib\win8\um\x86
mistachkin6bbe3df2015-04-19 06:18:10 +0000581 ) ELSE IF "%VisualStudioVersion%" == "14.0" (
582 CALL :fn_AppendVariable NSDKLIBPATH \..\8.0\lib\win8\um\x86
mistachkin50420542013-06-20 18:53:33 +0000583 ) ELSE (
584 CALL :fn_AppendVariable NSDKLIBPATH \lib\win8\um\x86
585 )
mistachkin0f801702012-10-20 08:40:05 +0000586 )
mistachkin0ec07442012-10-12 18:06:07 +0000587 )
588
589 REM
mistachkin6bbe3df2015-04-19 06:18:10 +0000590 REM NOTE: When using MSVC 2015, setting the Universal CRT library path
591 REM for x86 may be required as well. This must also be done for
592 REM each iteration because it relies upon the UniversalCRTSdkDir
593 REM environment variable being set by the batch file used to
594 REM setup the MSVC environment.
595 REM
596 IF DEFINED SET_NUCRTLIBPATH (
597 IF DEFINED UniversalCRTSdkDir (
598 CALL :fn_CopyVariable UniversalCRTSdkDir NUCRTLIBPATH
mistachkina09767b2015-08-24 17:18:43 +0000599 CALL :fn_AppendVariable NUCRTLIBPATH \lib\%NUCRTVER%\ucrt\x86
mistachkin6bbe3df2015-04-19 06:18:10 +0000600 )
601 )
602
603 REM
mistachkin0ec07442012-10-12 18:06:07 +0000604 REM NOTE: Unless prevented from doing so, invoke NMAKE with the MSVC
605 REM makefile to clean any stale build output from previous
606 REM iterations of this loop and/or previous runs of this batch
607 REM file, etc.
608 REM
609 IF NOT DEFINED NOCLEAN (
mistachkinb0c99af2016-02-19 05:07:56 +0000610 CALL :fn_MakeClean %%D
mistachkin0ec07442012-10-12 18:06:07 +0000611
612 IF ERRORLEVEL 1 (
613 ECHO Failed to clean for platform %%P.
614 GOTO errors
615 )
616 ) ELSE (
617 REM
618 REM NOTE: Even when the cleaning step has been disabled, we still
mistachkin44723ce2015-03-21 02:22:37 +0000619 REM need to remove the build output for all the files we are
mistachkin0ec07442012-10-12 18:06:07 +0000620 REM specifically wanting to build for each platform.
621 REM
mistachkin44723ce2015-03-21 02:22:37 +0000622 %_AECHO% Cleaning final core library output files only...
mistachkinb9076ba2016-02-19 00:47:18 +0000623 %__ECHO% DEL /Q *.lo "%DLL_FILE_NAME%" "%LIB_FILE_NAME%" "%DLL_PDB_FILE_NAME%" 2%REDIRECT% NUL
mistachkin0ec07442012-10-12 18:06:07 +0000624 )
625
626 REM
627 REM NOTE: Call NMAKE with the MSVC makefile to build the "sqlite3.dll"
628 REM binary. The x86 compiler will be used to compile the native
629 REM command line tools needed during the build process itself.
630 REM Also, disable looking for and/or linking to the native Tcl
631 REM runtime library.
632 REM
mistachkinb0c99af2016-02-19 05:07:56 +0000633 CALL :fn_MakeDll %%D
mistachkin0ec07442012-10-12 18:06:07 +0000634
635 IF ERRORLEVEL 1 (
mistachkinb9076ba2016-02-19 00:47:18 +0000636 ECHO Failed to build %%B "%DLL_FILE_NAME%" for platform %%P.
mistachkin0ec07442012-10-12 18:06:07 +0000637 GOTO errors
638 )
639
640 REM
641 REM NOTE: Copy the "sqlite3.dll" file to the appropriate directory for
642 REM the build and platform beneath the binary directory.
643 REM
mistachkinb9076ba2016-02-19 00:47:18 +0000644 %__ECHO% XCOPY "%DLL_FILE_NAME%" "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
mistachkin0ec07442012-10-12 18:06:07 +0000645
646 IF ERRORLEVEL 1 (
mistachkinb9076ba2016-02-19 00:47:18 +0000647 ECHO Failed to copy "%DLL_FILE_NAME%" to "%BINARYDIRECTORY%\%%B\%%D\".
mistachkin0ec07442012-10-12 18:06:07 +0000648 GOTO errors
649 )
650
651 REM
652 REM NOTE: Copy the "sqlite3.lib" file to the appropriate directory for
653 REM the build and platform beneath the binary directory.
654 REM
mistachkinb9076ba2016-02-19 00:47:18 +0000655 %__ECHO% XCOPY "%LIB_FILE_NAME%" "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
mistachkin0ec07442012-10-12 18:06:07 +0000656
657 IF ERRORLEVEL 1 (
mistachkinb9076ba2016-02-19 00:47:18 +0000658 ECHO Failed to copy "%LIB_FILE_NAME%" to "%BINARYDIRECTORY%\%%B\%%D\".
mistachkin0ec07442012-10-12 18:06:07 +0000659 GOTO errors
660 )
661
662 REM
663 REM NOTE: Copy the "sqlite3.pdb" file to the appropriate directory for
664 REM the build and platform beneath the binary directory unless we
665 REM are prevented from doing so.
666 REM
667 IF NOT DEFINED NOSYMBOLS (
mistachkina0ca3bc2016-03-10 19:08:44 +0000668 IF EXIST "%DLL_PDB_FILE_NAME%" (
669 %__ECHO% XCOPY "%DLL_PDB_FILE_NAME%" "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
mistachkin0ec07442012-10-12 18:06:07 +0000670
mistachkina0ca3bc2016-03-10 19:08:44 +0000671 IF ERRORLEVEL 1 (
672 ECHO Failed to copy "%DLL_PDB_FILE_NAME%" to "%BINARYDIRECTORY%\%%B\%%D\".
673 GOTO errors
674 )
mistachkin0ec07442012-10-12 18:06:07 +0000675 )
676 )
mistachkin44723ce2015-03-21 02:22:37 +0000677
678 REM
679 REM NOTE: If requested, also build the shell executable.
680 REM
681 IF DEFINED BUILD_ALL_SHELL (
682 REM
683 REM NOTE: If necessary, make sure any previous build output for the
684 REM shell executable is deleted.
685 REM
686 IF DEFINED NOCLEAN (
687 REM
688 REM NOTE: Even when the cleaning step has been disabled, we still
689 REM need to remove the build output for all the files we are
690 REM specifically wanting to build for each platform.
691 REM
692 %_AECHO% Cleaning final shell executable output files only...
mistachkinb9076ba2016-02-19 00:47:18 +0000693 %__ECHO% DEL /Q "%EXE_FILE_NAME%" "%EXE_PDB_FILE_NAME%" 2%REDIRECT% NUL
mistachkin44723ce2015-03-21 02:22:37 +0000694 )
695
696 REM
697 REM NOTE: Call NMAKE with the MSVC makefile to build the "sqlite3.exe"
698 REM binary. The x86 compiler will be used to compile the native
699 REM command line tools needed during the build process itself.
700 REM Also, disable looking for and/or linking to the native Tcl
701 REM runtime library.
702 REM
mistachkinb0c99af2016-02-19 05:07:56 +0000703 CALL :fn_MakeExe %%D
mistachkin44723ce2015-03-21 02:22:37 +0000704
705 IF ERRORLEVEL 1 (
mistachkinb9076ba2016-02-19 00:47:18 +0000706 ECHO Failed to build %%B "%EXE_FILE_NAME%" for platform %%P.
mistachkin44723ce2015-03-21 02:22:37 +0000707 GOTO errors
708 )
709
710 REM
711 REM NOTE: Copy the "sqlite3.exe" file to the appropriate directory
712 REM for the build and platform beneath the binary directory.
713 REM
mistachkinb9076ba2016-02-19 00:47:18 +0000714 %__ECHO% XCOPY "%EXE_FILE_NAME%" "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
mistachkin44723ce2015-03-21 02:22:37 +0000715
716 IF ERRORLEVEL 1 (
mistachkinb9076ba2016-02-19 00:47:18 +0000717 ECHO Failed to copy "%EXE_FILE_NAME%" to "%BINARYDIRECTORY%\%%B\%%D\".
mistachkin44723ce2015-03-21 02:22:37 +0000718 GOTO errors
719 )
720
721 REM
722 REM NOTE: Copy the "sqlite3sh.pdb" file to the appropriate directory
723 REM for the build and platform beneath the binary directory
724 REM unless we are prevented from doing so.
725 REM
726 IF NOT DEFINED NOSYMBOLS (
mistachkina0ca3bc2016-03-10 19:08:44 +0000727 IF EXIST "%EXE_PDB_FILE_NAME%" (
728 %__ECHO% XCOPY "%EXE_PDB_FILE_NAME%" "%BINARYDIRECTORY%\%%B\%%D\" %FFLAGS% %DFLAGS%
mistachkin44723ce2015-03-21 02:22:37 +0000729
mistachkina0ca3bc2016-03-10 19:08:44 +0000730 IF ERRORLEVEL 1 (
731 ECHO Failed to copy "%EXE_PDB_FILE_NAME%" to "%BINARYDIRECTORY%\%%B\%%D\".
732 GOTO errors
733 )
mistachkin44723ce2015-03-21 02:22:37 +0000734 )
735 )
736 )
mistachkin391b3642012-07-31 00:43:31 +0000737 )
mistachkin31856a32012-07-27 07:13:25 +0000738 )
739 )
740
741 REM
742 REM NOTE: Handle any errors generated during the nested command shell.
743 REM
744 IF ERRORLEVEL 1 (
745 GOTO errors
746 )
747)
748
749REM
750REM NOTE: Restore the saved current directory from the directory stack.
751REM
752%__ECHO2% POPD
753
754IF ERRORLEVEL 1 (
755 ECHO Could not restore directory.
756 GOTO errors
757)
758
759REM
760REM NOTE: If we get to this point, we have succeeded.
761REM
762GOTO no_errors
763
mistachkinb0c99af2016-02-19 05:07:56 +0000764:fn_MakeClean
mistachkinc03c2cf2016-02-19 19:29:44 +0000765 %__ECHO% %NMAKE_CMD% clean "PLATFORM=%1" XCOMPILE=1 USE_NATIVE_LIBPATHS=1 NO_TCL=1 %NMAKE_ARGS% %NMAKE_ARGS_CFG%
mistachkinb0c99af2016-02-19 05:07:56 +0000766 GOTO :EOF
767
768:fn_MakeDll
769 %__ECHO% %NMAKE_CMD% "%DLL_FILE_NAME%" "PLATFORM=%1" XCOMPILE=1 USE_NATIVE_LIBPATHS=1 NO_TCL=1 %NMAKE_ARGS% %NMAKE_ARGS_CFG%
770 GOTO :EOF
771
772:fn_MakeExe
773 %__ECHO% %NMAKE_CMD% "%EXE_FILE_NAME%" "PLATFORM=%1" XCOMPILE=1 USE_NATIVE_LIBPATHS=1 NO_TCL=1 %NMAKE_ARGS% %NMAKE_ARGS_CFG%
774 GOTO :EOF
775
mistachkin318d38c2015-04-22 01:33:53 +0000776:fn_ShowVariable
777 SETLOCAL
778 SET __ECHO_CMD=ECHO %%%2%%
779 FOR /F "delims=" %%V IN ('%__ECHO_CMD%') DO (
780 IF NOT "%%V" == "" (
781 IF NOT "%%V" == "%%%2%%" (
782 %_VECHO% %1 = '%%V'
783 )
784 )
785 )
786 ENDLOCAL
787 GOTO :EOF
788
mistachkin31856a32012-07-27 07:13:25 +0000789:fn_ResetErrorLevel
790 VERIFY > NUL
791 GOTO :EOF
792
793:fn_SetErrorLevel
794 VERIFY MAYBE 2> NUL
795 GOTO :EOF
796
mistachkind744fcc2012-10-05 07:36:34 +0000797:fn_CopyVariable
mistachkin31856a32012-07-27 07:13:25 +0000798 IF NOT DEFINED %1 GOTO :EOF
799 IF "%2" == "" GOTO :EOF
mistachkinf2014962013-11-22 00:49:43 +0000800 SETLOCAL
mistachkin31856a32012-07-27 07:13:25 +0000801 SET __ECHO_CMD=ECHO %%%1%%
802 FOR /F "delims=" %%V IN ('%__ECHO_CMD%') DO (
803 SET VALUE=%%V
804 )
805 ENDLOCAL && SET %2=%VALUE%
806 GOTO :EOF
807
808:fn_UnsetVariable
mistachkin02de84e2016-02-05 04:39:11 +0000809 SETLOCAL
mistachkin5a2412f2016-01-27 23:50:14 +0000810 SET VALUE=%1
811 IF DEFINED VALUE (
mistachkin00029a12016-01-28 00:04:32 +0000812 SET VALUE=
mistachkin02de84e2016-02-05 04:39:11 +0000813 ENDLOCAL
814 SET %VALUE%=
mistachkin02de84e2016-02-05 04:39:11 +0000815 ) ELSE (
816 ENDLOCAL
mistachkin31856a32012-07-27 07:13:25 +0000817 )
mistachkinb91d2212016-02-05 04:55:01 +0000818 CALL :fn_ResetErrorLevel
mistachkin31856a32012-07-27 07:13:25 +0000819 GOTO :EOF
820
mistachkin6e5688d2017-02-27 17:16:27 +0000821:fn_ResetPath
822 SET PATH=%TOOLPATH%;%SystemRoot%\System32;%SystemRoot%
823 GOTO :EOF
824
mistachkinfd0ba2a2012-07-27 08:21:45 +0000825:fn_AppendVariable
826 SET __ECHO_CMD=ECHO %%%1%%
827 IF DEFINED %1 (
828 FOR /F "delims=" %%V IN ('%__ECHO_CMD%') DO (
829 SET %1=%%V%~2
830 )
831 ) ELSE (
832 SET %1=%~2
833 )
834 SET __ECHO_CMD=
835 CALL :fn_ResetErrorLevel
836 GOTO :EOF
837
mistachkin31856a32012-07-27 07:13:25 +0000838:usage
839 ECHO.
840 ECHO Usage: %~nx0 ^<binaryDirectory^>
841 ECHO.
842 GOTO errors
843
844:errors
845 CALL :fn_SetErrorLevel
846 ENDLOCAL
847 ECHO.
848 ECHO Failure, errors were encountered.
849 GOTO end_of_file
850
851:no_errors
852 CALL :fn_ResetErrorLevel
853 ENDLOCAL
854 ECHO.
855 ECHO Success, no errors were encountered.
856 GOTO end_of_file
857
858:end_of_file
859%__ECHO% EXIT /B %ERRORLEVEL%