1@echo off 2rem *************************************************************************** 3rem * _ _ ____ _ 4rem * Project ___| | | | _ \| | 5rem * / __| | | | |_) | | 6rem * | (__| |_| | _ <| |___ 7rem * \___|\___/|_| \_\_____| 8rem * 9rem * Copyright (C) 2014 - 2020, Steve Holme, <steve_holme@hotmail.com>. 10rem * 11rem * This software is licensed as described in the file COPYING, which 12rem * you should have received as part of this distribution. The terms 13rem * are also available at https://curl.se/docs/copyright.html. 14rem * 15rem * You may opt to use, copy, modify, merge, publish, distribute and/or sell 16rem * copies of the Software, and permit persons to whom the Software is 17rem * furnished to do so, under the terms of the COPYING file. 18rem * 19rem * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20rem * KIND, either express or implied. 21rem * 22rem *************************************************************************** 23 24:begin 25 rem Check we are running on a Windows NT derived OS 26 if not "%OS%" == "Windows_NT" goto nodos 27 28 rem Set our variables 29 setlocal ENABLEEXTENSIONS 30 set VERSION=ALL 31 set MODE=GENERATE 32 33 rem Check we are not running on a network drive 34 if "%~d0."=="\\." goto nonetdrv 35 36 rem Switch to this batch file's directory 37 cd /d "%~0\.." 1>NUL 2>&1 38 39 rem Check we are running from a curl git repository 40 if not exist ..\GIT-INFO goto norepo 41 42:parseArgs 43 if "%~1" == "" goto start 44 45 if /i "%~1" == "pre" ( 46 set VERSION=PRE 47 ) else if /i "%~1" == "vc6" ( 48 set VERSION=VC6 49 ) else if /i "%~1" == "vc7" ( 50 set VERSION=VC7 51 ) else if /i "%~1" == "vc7.1" ( 52 set VERSION=VC7.1 53 ) else if /i "%~1" == "vc8" ( 54 set VERSION=VC8 55 ) else if /i "%~1" == "vc9" ( 56 set VERSION=VC9 57 ) else if /i "%~1" == "vc10" ( 58 set VERSION=VC10 59 ) else if /i "%~1" == "vc11" ( 60 set VERSION=VC11 61 ) else if /i "%~1" == "vc12" ( 62 set VERSION=VC12 63 ) else if /i "%~1" == "vc14" ( 64 set VERSION=VC14 65 ) else if /i "%~1" == "vc15" ( 66 set VERSION=VC15 67 ) else if /i "%~1" == "-clean" ( 68 set MODE=CLEAN 69 ) else if /i "%~1" == "-?" ( 70 goto syntax 71 ) else if /i "%~1" == "-h" ( 72 goto syntax 73 ) else if /i "%~1" == "-help" ( 74 goto syntax 75 ) else ( 76 goto unknown 77 ) 78 79 shift & goto parseArgs 80 81:start 82 if exist ..\buildconf.bat ( 83 if "%MODE%" == "GENERATE" ( 84 call ..\buildconf 85 ) else if "%VERSION%" == "PRE" ( 86 call ..\buildconf -clean 87 ) else if "%VERSION%" == "ALL" ( 88 call ..\buildconf -clean 89 ) 90 ) 91 if "%VERSION%" == "PRE" goto success 92 if "%VERSION%" == "VC6" goto vc6 93 if "%VERSION%" == "VC7" goto vc7 94 if "%VERSION%" == "VC7.1" goto vc71 95 if "%VERSION%" == "VC8" goto vc8 96 if "%VERSION%" == "VC9" goto vc9 97 if "%VERSION%" == "VC10" goto vc10 98 if "%VERSION%" == "VC11" goto vc11 99 if "%VERSION%" == "VC12" goto vc12 100 if "%VERSION%" == "VC14" goto vc14 101 if "%VERSION%" == "VC15" goto vc15 102 103:vc6 104 echo. 105 106 if "%MODE%" == "GENERATE" ( 107 echo Generating VC6 project files 108 call :generate dsp Windows\VC6\src\curl.tmpl Windows\VC6\src\curl.dsp 109 call :generate dsp Windows\VC6\lib\libcurl.tmpl Windows\VC6\lib\libcurl.dsp 110 ) else ( 111 echo Removing VC6 project files 112 call :clean Windows\VC6\src\curl.dsp 113 call :clean Windows\VC6\lib\libcurl.dsp 114 ) 115 116 if not "%VERSION%" == "ALL" goto success 117 118:vc7 119 echo. 120 121 if "%MODE%" == "GENERATE" ( 122 echo Generating VC7 project files 123 call :generate vcproj1 Windows\VC7\src\curl.tmpl Windows\VC7\src\curl.vcproj 124 call :generate vcproj1 Windows\VC7\lib\libcurl.tmpl Windows\VC7\lib\libcurl.vcproj 125 ) else ( 126 echo Removing VC7 project files 127 call :clean Windows\VC7\src\curl.vcproj 128 call :clean Windows\VC7\lib\libcurl.vcproj 129 ) 130 131 if not "%VERSION%" == "ALL" goto success 132 133:vc71 134 echo. 135 136 if "%MODE%" == "GENERATE" ( 137 echo Generating VC7.1 project files 138 call :generate vcproj1 Windows\VC7.1\src\curl.tmpl Windows\VC7.1\src\curl.vcproj 139 call :generate vcproj1 Windows\VC7.1\lib\libcurl.tmpl Windows\VC7.1\lib\libcurl.vcproj 140 ) else ( 141 echo Removing VC7.1 project files 142 call :clean Windows\VC7.1\src\curl.vcproj 143 call :clean Windows\VC7.1\lib\libcurl.vcproj 144 ) 145 146 if not "%VERSION%" == "ALL" goto success 147 148:vc8 149 echo. 150 151 if "%MODE%" == "GENERATE" ( 152 echo Generating VC8 project files 153 call :generate vcproj2 Windows\VC8\src\curl.tmpl Windows\VC8\src\curl.vcproj 154 call :generate vcproj2 Windows\VC8\lib\libcurl.tmpl Windows\VC8\lib\libcurl.vcproj 155 ) else ( 156 echo Removing VC8 project files 157 call :clean Windows\VC8\src\curl.vcproj 158 call :clean Windows\VC8\lib\libcurl.vcproj 159 ) 160 161 if not "%VERSION%" == "ALL" goto success 162 163:vc9 164 echo. 165 166 if "%MODE%" == "GENERATE" ( 167 echo Generating VC9 project files 168 call :generate vcproj2 Windows\VC9\src\curl.tmpl Windows\VC9\src\curl.vcproj 169 call :generate vcproj2 Windows\VC9\lib\libcurl.tmpl Windows\VC9\lib\libcurl.vcproj 170 ) else ( 171 echo Removing VC9 project files 172 call :clean Windows\VC9\src\curl.vcproj 173 call :clean Windows\VC9\lib\libcurl.vcproj 174 ) 175 176 if not "%VERSION%" == "ALL" goto success 177 178:vc10 179 echo. 180 181 if "%MODE%" == "GENERATE" ( 182 echo Generating VC10 project files 183 call :generate vcxproj Windows\VC10\src\curl.tmpl Windows\VC10\src\curl.vcxproj 184 call :generate vcxproj Windows\VC10\lib\libcurl.tmpl Windows\VC10\lib\libcurl.vcxproj 185 ) else ( 186 echo Removing VC10 project files 187 call :clean Windows\VC10\src\curl.vcxproj 188 call :clean Windows\VC10\lib\libcurl.vcxproj 189 ) 190 191 if not "%VERSION%" == "ALL" goto success 192 193:vc11 194 echo. 195 196 if "%MODE%" == "GENERATE" ( 197 echo Generating VC11 project files 198 call :generate vcxproj Windows\VC11\src\curl.tmpl Windows\VC11\src\curl.vcxproj 199 call :generate vcxproj Windows\VC11\lib\libcurl.tmpl Windows\VC11\lib\libcurl.vcxproj 200 ) else ( 201 echo Removing VC11 project files 202 call :clean Windows\VC11\src\curl.vcxproj 203 call :clean Windows\VC11\lib\libcurl.vcxproj 204 ) 205 206 if not "%VERSION%" == "ALL" goto success 207 208:vc12 209 echo. 210 211 if "%MODE%" == "GENERATE" ( 212 echo Generating VC12 project files 213 call :generate vcxproj Windows\VC12\src\curl.tmpl Windows\VC12\src\curl.vcxproj 214 call :generate vcxproj Windows\VC12\lib\libcurl.tmpl Windows\VC12\lib\libcurl.vcxproj 215 ) else ( 216 echo Removing VC12 project files 217 call :clean Windows\VC12\src\curl.vcxproj 218 call :clean Windows\VC12\lib\libcurl.vcxproj 219 ) 220 221 if not "%VERSION%" == "ALL" goto success 222 223:vc14 224 echo. 225 226 if "%MODE%" == "GENERATE" ( 227 echo Generating VC14 project files 228 call :generate vcxproj Windows\VC14\src\curl.tmpl Windows\VC14\src\curl.vcxproj 229 call :generate vcxproj Windows\VC14\lib\libcurl.tmpl Windows\VC14\lib\libcurl.vcxproj 230 ) else ( 231 echo Removing VC14 project files 232 call :clean Windows\VC14\src\curl.vcxproj 233 call :clean Windows\VC14\lib\libcurl.vcxproj 234 ) 235 236 if not "%VERSION%" == "ALL" goto success 237 238:vc15 239 echo. 240 241 if "%MODE%" == "GENERATE" ( 242 echo Generating VC15 project files 243 call :generate vcxproj Windows\VC15\src\curl.tmpl Windows\VC15\src\curl.vcxproj 244 call :generate vcxproj Windows\VC15\lib\libcurl.tmpl Windows\VC15\lib\libcurl.vcxproj 245 ) else ( 246 echo Removing VC15 project files 247 call :clean Windows\VC15\src\curl.vcxproj 248 call :clean Windows\VC15\lib\libcurl.vcxproj 249 ) 250 251 goto success 252 253rem Main generate function. 254rem 255rem %1 - Project Type (dsp for VC6, vcproj1 for VC7 and VC7.1, vcproj2 for VC8 and VC9 256rem or vcxproj for VC10, VC11, VC12, VC14 and VC15) 257rem %2 - Input template file 258rem %3 - Output project file 259rem 260:generate 261 if not exist %2 ( 262 echo. 263 echo Error: Cannot open %2 264 exit /B 265 ) 266 267 if exist %3 ( 268 del %3 269 ) 270 271 echo * %CD%\%3 272 for /f "usebackq delims=" %%i in (`"findstr /n ^^ %2"`) do ( 273 set "var=%%i" 274 setlocal enabledelayedexpansion 275 set "var=!var:*:=!" 276 277 if "!var!" == "CURL_SRC_C_FILES" ( 278 for /f "delims=" %%c in ('dir /b ..\src\*.c') do call :element %1 src "%%c" %3 279 ) else if "!var!" == "CURL_SRC_H_FILES" ( 280 for /f "delims=" %%h in ('dir /b ..\src\*.h') do call :element %1 src "%%h" %3 281 ) else if "!var!" == "CURL_SRC_RC_FILES" ( 282 for /f "delims=" %%r in ('dir /b ..\src\*.rc') do call :element %1 src "%%r" %3 283 ) else if "!var!" == "CURL_SRC_X_C_FILES" ( 284 call :element %1 lib "strtoofft.c" %3 285 call :element %1 lib "nonblock.c" %3 286 call :element %1 lib "warnless.c" %3 287 call :element %1 lib "curl_ctype.c" %3 288 call :element %1 lib "curl_multibyte.c" %3 289 call :element %1 lib "version_win32.c" %3 290 call :element %1 lib "dynbuf.c" %3 291 ) else if "!var!" == "CURL_SRC_X_H_FILES" ( 292 call :element %1 lib "config-win32.h" %3 293 call :element %1 lib "curl_setup.h" %3 294 call :element %1 lib "strtoofft.h" %3 295 call :element %1 lib "nonblock.h" %3 296 call :element %1 lib "warnless.h" %3 297 call :element %1 lib "curl_ctype.h" %3 298 call :element %1 lib "curl_multibyte.h" %3 299 call :element %1 lib "version_win32.h" %3 300 call :element %1 lib "dynbuf.h" %3 301 ) else if "!var!" == "CURL_LIB_C_FILES" ( 302 for /f "delims=" %%c in ('dir /b ..\lib\*.c') do call :element %1 lib "%%c" %3 303 ) else if "!var!" == "CURL_LIB_H_FILES" ( 304 for /f "delims=" %%h in ('dir /b ..\include\curl\*.h') do call :element %1 include\curl "%%h" %3 305 for /f "delims=" %%h in ('dir /b ..\lib\*.h') do call :element %1 lib "%%h" %3 306 ) else if "!var!" == "CURL_LIB_RC_FILES" ( 307 for /f "delims=" %%r in ('dir /b ..\lib\*.rc') do call :element %1 lib "%%r" %3 308 ) else if "!var!" == "CURL_LIB_VAUTH_C_FILES" ( 309 for /f "delims=" %%c in ('dir /b ..\lib\vauth\*.c') do call :element %1 lib\vauth "%%c" %3 310 ) else if "!var!" == "CURL_LIB_VAUTH_H_FILES" ( 311 for /f "delims=" %%h in ('dir /b ..\lib\vauth\*.h') do call :element %1 lib\vauth "%%h" %3 312 ) else if "!var!" == "CURL_LIB_VQUIC_C_FILES" ( 313 for /f "delims=" %%c in ('dir /b ..\lib\vquic\*.c') do call :element %1 lib\vquic "%%c" %3 314 ) else if "!var!" == "CURL_LIB_VQUIC_H_FILES" ( 315 for /f "delims=" %%h in ('dir /b ..\lib\vquic\*.h') do call :element %1 lib\vquic "%%h" %3 316 ) else if "!var!" == "CURL_LIB_VSSH_C_FILES" ( 317 for /f "delims=" %%c in ('dir /b ..\lib\vssh\*.c') do call :element %1 lib\vssh "%%c" %3 318 ) else if "!var!" == "CURL_LIB_VSSH_H_FILES" ( 319 for /f "delims=" %%h in ('dir /b ..\lib\vssh\*.h') do call :element %1 lib\vssh "%%h" %3 320 ) else if "!var!" == "CURL_LIB_VTLS_C_FILES" ( 321 for /f "delims=" %%c in ('dir /b ..\lib\vtls\*.c') do call :element %1 lib\vtls "%%c" %3 322 ) else if "!var!" == "CURL_LIB_VTLS_H_FILES" ( 323 for /f "delims=" %%h in ('dir /b ..\lib\vtls\*.h') do call :element %1 lib\vtls "%%h" %3 324 ) else ( 325 echo.!var!>> %3 326 ) 327 328 endlocal 329 ) 330 exit /B 331 332rem Generates a single file xml element. 333rem 334rem %1 - Project Type (dsp for VC6, vcproj1 for VC7 and VC7.1, vcproj2 for VC8 and VC9 335rem or vcxproj for VC10, VC11, VC12, VC14 and VC15) 336rem %2 - Directory (src, lib, lib\vauth, lib\vquic, lib\vssh, lib\vtls) 337rem %3 - Source filename 338rem %4 - Output project file 339rem 340:element 341 set "SPACES= " 342 if "%2" == "lib\vauth" ( 343 set "TABS= " 344 ) else if "%2" == "lib\vquic" ( 345 set "TABS= " 346 ) else if "%2" == "lib\vssh" ( 347 set "TABS= " 348 ) else if "%2" == "lib\vtls" ( 349 set "TABS= " 350 ) else ( 351 set "TABS= " 352 ) 353 354 call :extension %3 ext 355 356 if "%1" == "dsp" ( 357 echo # Begin Source File>> %4 358 echo.>> %4 359 echo SOURCE=..\..\..\..\%2\%~3>> %4 360 echo # End Source File>> %4 361 ) else if "%1" == "vcproj1" ( 362 echo %TABS%^<File>> %4 363 echo %TABS% RelativePath="..\..\..\..\%2\%~3"^>>> %4 364 echo %TABS%^</File^>>> %4 365 ) else if "%1" == "vcproj2" ( 366 echo %TABS%^<File>> %4 367 echo %TABS% RelativePath="..\..\..\..\%2\%~3">> %4 368 echo %TABS%^>>> %4 369 echo %TABS%^</File^>>> %4 370 ) else if "%1" == "vcxproj" ( 371 if "%ext%" == "c" ( 372 echo %SPACES%^<ClCompile Include=^"..\..\..\..\%2\%~3^" /^>>> %4 373 ) else if "%ext%" == "h" ( 374 echo %SPACES%^<ClInclude Include=^"..\..\..\..\%2\%~3^" /^>>> %4 375 ) else if "%ext%" == "rc" ( 376 echo %SPACES%^<ResourceCompile Include=^"..\..\..\..\%2\%~3^" /^>>> %4 377 ) 378 ) 379 380 exit /B 381 382rem Returns the extension for a given filename. 383rem 384rem %1 - The filename 385rem %2 - The return value 386rem 387:extension 388 set fname=%~1 389 set ename= 390:loop1 391 if "%fname%"=="" ( 392 set %2= 393 exit /B 394 ) 395 396 if not "%fname:~-1%"=="." ( 397 set ename=%fname:~-1%%ename% 398 set fname=%fname:~0,-1% 399 goto loop1 400 ) 401 402 set %2=%ename% 403 exit /B 404 405rem Removes the given project file. 406rem 407rem %1 - The filename 408rem 409:clean 410 echo * %CD%\%1 411 412 if exist %1 ( 413 del %1 414 ) 415 416 exit /B 417 418:syntax 419 rem Display the help 420 echo. 421 echo Usage: generate [what] [-clean] 422 echo. 423 echo What to generate: 424 echo. 425 echo pre - Prerequisites only 426 echo vc6 - Use Visual Studio 6 427 echo vc7 - Use Visual Studio .NET 428 echo vc7.1 - Use Visual Studio .NET 2003 429 echo vc8 - Use Visual Studio 2005 430 echo vc9 - Use Visual Studio 2008 431 echo vc10 - Use Visual Studio 2010 432 echo vc11 - Use Visual Studio 2012 433 echo vc12 - Use Visual Studio 2013 434 echo vc14 - Use Visual Studio 2015 435 echo vc15 - Use Visual Studio 2017 436 echo. 437 echo -clean - Removes the project files 438 goto error 439 440:unknown 441 echo. 442 echo Error: Unknown argument '%1' 443 goto error 444 445:nodos 446 echo. 447 echo Error: Only a Windows NT based Operating System is supported 448 goto error 449 450:nonetdrv 451 echo. 452 echo Error: This batch file cannot run from a network drive 453 goto error 454 455:norepo 456 echo. 457 echo Error: This batch file should only be used from a curl git repository 458 goto error 459 460:seterr 461 rem Set the caller's errorlevel. 462 rem %1[opt]: Errorlevel as integer. 463 rem If %1 is empty the errorlevel will be set to 0. 464 rem If %1 is not empty and not an integer the errorlevel will be set to 1. 465 setlocal 466 set EXITCODE=%~1 467 if not defined EXITCODE set EXITCODE=0 468 echo %EXITCODE%|findstr /r "[^0-9\-]" 1>NUL 2>&1 469 if %ERRORLEVEL% EQU 0 set EXITCODE=1 470 exit /b %EXITCODE% 471 472:error 473 if "%OS%" == "Windows_NT" endlocal 474 exit /B 1 475 476:success 477 endlocal 478 exit /B 0 479