OLD | NEW |
| (Empty) |
1 @ECHO OFF | |
2 | |
3 :: | |
4 :: build-all-msvc.bat -- | |
5 :: | |
6 :: Multi-Platform Build Tool for MSVC | |
7 :: | |
8 | |
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 | |
53 | |
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) | |
60 | |
61 %_AECHO% Running %0 %* | |
62 | |
63 REM SET DFLAGS=/L | |
64 | |
65 %_VECHO% DFlags = '%DFLAGS%' | |
66 | |
67 SET FFLAGS=/V /F /G /H /I /R /Y /Z | |
68 | |
69 %_VECHO% FFlags = '%FFLAGS%' | |
70 | |
71 SET ROOT=%~dp0\.. | |
72 SET ROOT=%ROOT:\\=\% | |
73 | |
74 %_VECHO% Root = '%ROOT%' | |
75 | |
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 | |
82 | |
83 IF NOT DEFINED BINARYDIRECTORY ( | |
84 GOTO usage | |
85 ) | |
86 | |
87 %_VECHO% BinaryDirectory = '%BINARYDIRECTORY%' | |
88 | |
89 SET DUMMY=%2 | |
90 | |
91 IF DEFINED DUMMY ( | |
92 GOTO usage | |
93 ) | |
94 | |
95 REM | |
96 REM NOTE: From this point, we need a clean error level. Reset it now. | |
97 REM | |
98 CALL :fn_ResetErrorLevel | |
99 | |
100 REM | |
101 REM NOTE: Change the current directory to the root of the source tree, saving | |
102 REM the current directory on the directory stack. | |
103 REM | |
104 %__ECHO2% PUSHD "%ROOT%" | |
105 | |
106 IF ERRORLEVEL 1 ( | |
107 ECHO Could not change directory to "%ROOT%". | |
108 GOTO errors | |
109 ) | |
110 | |
111 REM | |
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". | |
114 REM | |
115 IF NOT DEFINED ComSpec ( | |
116 ECHO The ComSpec environment variable must be defined. | |
117 GOTO errors | |
118 ) | |
119 | |
120 REM | |
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. | |
124 REM | |
125 IF NOT DEFINED VCINSTALLDIR ( | |
126 ECHO The VCINSTALLDIR environment variable must be defined. | |
127 GOTO errors | |
128 ) | |
129 | |
130 REM | |
131 REM NOTE: If the list of platforms is not already set, use the default list. | |
132 REM | |
133 IF NOT DEFINED PLATFORMS ( | |
134 SET PLATFORMS=x86 x86_amd64 x86_arm | |
135 ) | |
136 | |
137 %_VECHO% Platforms = '%PLATFORMS%' | |
138 | |
139 REM | |
140 REM NOTE: If the list of configurations is not already set, use the default | |
141 REM list. | |
142 REM | |
143 IF NOT DEFINED CONFIGURATIONS ( | |
144 SET CONFIGURATIONS=Debug Retail | |
145 ) | |
146 | |
147 %_VECHO% Configurations = '%CONFIGURATIONS%' | |
148 | |
149 REM | |
150 REM NOTE: If the command used to invoke NMAKE is not already set, use the | |
151 REM default. | |
152 REM | |
153 IF NOT DEFINED NMAKE_CMD ( | |
154 SET NMAKE_CMD=nmake -B -f Makefile.msc | |
155 ) | |
156 | |
157 %_VECHO% NmakeCmd = '%NMAKE_CMD%' | |
158 %_VECHO% NmakeArgs = '%NMAKE_ARGS%' | |
159 | |
160 REM | |
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. | |
164 REM | |
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 | |
172 | |
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%' | |
180 | |
181 REM | |
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. | |
185 REM | |
186 FOR %%T IN (gawk.exe tclsh85.exe) DO ( | |
187 SET %%T_PATH=%%~dp$PATH:T | |
188 ) | |
189 | |
190 REM | |
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. | |
193 REM | |
194 IF NOT DEFINED gawk.exe_PATH ( | |
195 ECHO The Gawk executable "gawk.exe" is required to be in the PATH. | |
196 GOTO errors | |
197 ) | |
198 | |
199 REM | |
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. | |
202 REM | |
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 | |
206 ) | |
207 | |
208 REM | |
209 REM NOTE: Set the TOOLPATH variable to contain all the directories where the | |
210 REM external tools were found in the search above. | |
211 REM | |
212 SET TOOLPATH=%gawk.exe_PATH%;%tclsh85.exe_PATH% | |
213 | |
214 %_VECHO% ToolPath = '%TOOLPATH%' | |
215 | |
216 REM | |
217 REM NOTE: Check for MSVC 2012/2013 because the Windows SDK directory handling | |
218 REM is slightly different for those versions. | |
219 REM | |
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 | |
238 ) | |
239 | |
240 REM | |
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. | |
245 REM | |
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:\\=\% | |
253 | |
254 REM | |
255 REM NOTE: This is the outer loop. There should be exactly one iteration per | |
256 REM platform. | |
257 REM | |
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 | |
265 | |
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 | |
302 | |
303 REM | |
304 REM NOTE: Reset the PATH here to the absolute bare minimum required. | |
305 REM | |
306 SET PATH=%TOOLPATH%;%SystemRoot%\System32;%SystemRoot% | |
307 | |
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... | |
319 | |
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 ) | |
327 | |
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 | |
352 | |
353 IF ERRORLEVEL 1 ( | |
354 ECHO Failed to call "%VCVARSALL%" for platform %%P. | |
355 GOTO errors | |
356 ) | |
357 | |
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 ) | |
372 | |
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 | |
392 | |
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 ) | |
406 | |
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 | |
415 | |
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 ) | |
429 | |
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% | |
438 | |
439 IF ERRORLEVEL 1 ( | |
440 ECHO Failed to build %%B "sqlite3.dll" for platform %%P. | |
441 GOTO errors | |
442 ) | |
443 | |
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
% | |
449 | |
450 IF ERRORLEVEL 1 ( | |
451 ECHO Failed to copy "sqlite3.dll" to "%BINARYDIRECTORY%\%%B\%%D\". | |
452 GOTO errors | |
453 ) | |
454 | |
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
% | |
460 | |
461 IF ERRORLEVEL 1 ( | |
462 ECHO Failed to copy "sqlite3.lib" to "%BINARYDIRECTORY%\%%B\%%D\". | |
463 GOTO errors | |
464 ) | |
465 | |
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% %DFLA
GS% | |
473 | |
474 IF ERRORLEVEL 1 ( | |
475 ECHO Failed to copy "sqlite3.pdb" to "%BINARYDIRECTORY%\%%B\%%D\". | |
476 GOTO errors | |
477 ) | |
478 ) | |
479 ) | |
480 ) | |
481 ) | |
482 | |
483 REM | |
484 REM NOTE: Handle any errors generated during the nested command shell. | |
485 REM | |
486 IF ERRORLEVEL 1 ( | |
487 GOTO errors | |
488 ) | |
489 ) | |
490 | |
491 REM | |
492 REM NOTE: Restore the saved current directory from the directory stack. | |
493 REM | |
494 %__ECHO2% POPD | |
495 | |
496 IF ERRORLEVEL 1 ( | |
497 ECHO Could not restore directory. | |
498 GOTO errors | |
499 ) | |
500 | |
501 REM | |
502 REM NOTE: If we get to this point, we have succeeded. | |
503 REM | |
504 GOTO no_errors | |
505 | |
506 :fn_ResetErrorLevel | |
507 VERIFY > NUL | |
508 GOTO :EOF | |
509 | |
510 :fn_SetErrorLevel | |
511 VERIFY MAYBE 2> NUL | |
512 GOTO :EOF | |
513 | |
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 | |
524 | |
525 :fn_UnsetVariable | |
526 IF NOT "%1" == "" ( | |
527 SET %1= | |
528 CALL :fn_ResetErrorLevel | |
529 ) | |
530 GOTO :EOF | |
531 | |
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 | |
544 | |
545 :usage | |
546 ECHO. | |
547 ECHO Usage: %~nx0 ^<binaryDirectory^> | |
548 ECHO. | |
549 GOTO errors | |
550 | |
551 :errors | |
552 CALL :fn_SetErrorLevel | |
553 ENDLOCAL | |
554 ECHO. | |
555 ECHO Failure, errors were encountered. | |
556 GOTO end_of_file | |
557 | |
558 :no_errors | |
559 CALL :fn_ResetErrorLevel | |
560 ENDLOCAL | |
561 ECHO. | |
562 ECHO Success, no errors were encountered. | |
563 GOTO end_of_file | |
564 | |
565 :end_of_file | |
566 %__ECHO% EXIT /B %ERRORLEVEL% | |
OLD | NEW |