1@echo off 2rem *************************************************************************** 3rem * _ _ ____ _ 4rem * Project ___| | | | _ \| | 5rem * / __| | | | |_) | | 6rem * | (__| |_| | _ <| |___ 7rem * \___|\___/|_| \_\_____| 8rem * 9rem * Copyright (C) 2014 - 2017, 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.haxx.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 ) else if "!var!" == "CURL_SRC_X_H_FILES" ( 289 call :element %1 lib "config-win32.h" %3 290 call :element %1 lib "curl_setup.h" %3 291 call :element %1 lib "strtoofft.h" %3 292 call :element %1 lib "nonblock.h" %3 293 call :element %1 lib "warnless.h" %3 294 call :element %1 lib "curl_ctype.h" %3 295 ) else if "!var!" == "CURL_LIB_C_FILES" ( 296 for /f "delims=" %%c in ('dir /b ..\lib\*.c') do call :element %1 lib "%%c" %3 297 ) else if "!var!" == "CURL_LIB_H_FILES" ( 298 for /f "delims=" %%h in ('dir /b ..\include\curl\*.h') do call :element %1 include\curl "%%h" %3 299 for /f "delims=" %%h in ('dir /b ..\lib\*.h') do call :element %1 lib "%%h" %3 300 ) else if "!var!" == "CURL_LIB_RC_FILES" ( 301 for /f "delims=" %%r in ('dir /b ..\lib\*.rc') do call :element %1 lib "%%r" %3 302 ) else if "!var!" == "CURL_LIB_VAUTH_C_FILES" ( 303 for /f "delims=" %%c in ('dir /b ..\lib\vauth\*.c') do call :element %1 lib\vauth "%%c" %3 304 ) else if "!var!" == "CURL_LIB_VAUTH_H_FILES" ( 305 for /f "delims=" %%h in ('dir /b ..\lib\vauth\*.h') do call :element %1 lib\vauth "%%h" %3 306 ) else if "!var!" == "CURL_LIB_VQUIC_C_FILES" ( 307 for /f "delims=" %%c in ('dir /b ..\lib\vquic\*.c') do call :element %1 lib\vquic "%%c" %3 308 ) else if "!var!" == "CURL_LIB_VQUIC_H_FILES" ( 309 for /f "delims=" %%h in ('dir /b ..\lib\vquic\*.h') do call :element %1 lib\vquic "%%h" %3 310 ) else if "!var!" == "CURL_LIB_VSSH_C_FILES" ( 311 for /f "delims=" %%c in ('dir /b ..\lib\vssh\*.c') do call :element %1 lib\vssh "%%c" %3 312 ) else if "!var!" == "CURL_LIB_VSSH_H_FILES" ( 313 for /f "delims=" %%h in ('dir /b ..\lib\vssh\*.h') do call :element %1 lib\vssh "%%h" %3 314 ) else if "!var!" == "CURL_LIB_VTLS_C_FILES" ( 315 for /f "delims=" %%c in ('dir /b ..\lib\vtls\*.c') do call :element %1 lib\vtls "%%c" %3 316 ) else if "!var!" == "CURL_LIB_VTLS_H_FILES" ( 317 for /f "delims=" %%h in ('dir /b ..\lib\vtls\*.h') do call :element %1 lib\vtls "%%h" %3 318 ) else ( 319 echo.!var!>> %3 320 ) 321 322 endlocal 323 ) 324 exit /B 325 326rem Generates a single file xml element. 327rem 328rem %1 - Project Type (dsp for VC6, vcproj1 for VC7 and VC7.1, vcproj2 for VC8 and VC9 329rem or vcxproj for VC10, VC11, VC12, VC14 and VC15) 330rem %2 - Directory (src, lib, lib\vauth, lib\vquic, lib\vssh, lib\vtls) 331rem %3 - Source filename 332rem %4 - Output project file 333rem 334:element 335 set "SPACES= " 336 if "%2" == "lib\vauth" ( 337 set "TABS= " 338 ) else if "%2" == "lib\vquic" ( 339 set "TABS= " 340 ) else if "%2" == "lib\vssh" ( 341 set "TABS= " 342 ) else if "%2" == "lib\vtls" ( 343 set "TABS= " 344 ) else ( 345 set "TABS= " 346 ) 347 348 call :extension %3 ext 349 350 if "%1" == "dsp" ( 351 echo # Begin Source File>> %4 352 echo.>> %4 353 echo SOURCE=..\..\..\..\%2\%~3>> %4 354 echo # End Source File>> %4 355 ) else if "%1" == "vcproj1" ( 356 echo %TABS%^<File>> %4 357 echo %TABS% RelativePath="..\..\..\..\%2\%~3"^>>> %4 358 echo %TABS%^</File^>>> %4 359 ) else if "%1" == "vcproj2" ( 360 echo %TABS%^<File>> %4 361 echo %TABS% RelativePath="..\..\..\..\%2\%~3">> %4 362 echo %TABS%^>>> %4 363 echo %TABS%^</File^>>> %4 364 ) else if "%1" == "vcxproj" ( 365 if "%ext%" == "c" ( 366 echo %SPACES%^<ClCompile Include=^"..\..\..\..\%2\%~3^" /^>>> %4 367 ) else if "%ext%" == "h" ( 368 echo %SPACES%^<ClInclude Include=^"..\..\..\..\%2\%~3^" /^>>> %4 369 ) else if "%ext%" == "rc" ( 370 echo %SPACES%^<ResourceCompile Include=^"..\..\..\..\%2\%~3^" /^>>> %4 371 ) 372 ) 373 374 exit /B 375 376rem Returns the extension for a given filename. 377rem 378rem %1 - The filename 379rem %2 - The return value 380rem 381:extension 382 set fname=%~1 383 set ename= 384:loop1 385 if "%fname%"=="" ( 386 set %2= 387 exit /B 388 ) 389 390 if not "%fname:~-1%"=="." ( 391 set ename=%fname:~-1%%ename% 392 set fname=%fname:~0,-1% 393 goto loop1 394 ) 395 396 set %2=%ename% 397 exit /B 398 399rem Removes the given project file. 400rem 401rem %1 - The filename 402rem 403:clean 404 echo * %CD%\%1 405 406 if exist %1 ( 407 del %1 408 ) 409 410 exit /B 411 412:syntax 413 rem Display the help 414 echo. 415 echo Usage: generate [what] [-clean] 416 echo. 417 echo What to generate: 418 echo. 419 echo pre - Prerequisites only 420 echo vc6 - Use Visual Studio 6 421 echo vc7 - Use Visual Studio .NET 422 echo vc7.1 - Use Visual Studio .NET 2003 423 echo vc8 - Use Visual Studio 2005 424 echo vc9 - Use Visual Studio 2008 425 echo vc10 - Use Visual Studio 2010 426 echo vc11 - Use Visual Studio 2012 427 echo vc12 - Use Visual Studio 2013 428 echo vc14 - Use Visual Studio 2015 429 echo vc15 - Use Visual Studio 2017 430 echo. 431 echo -clean - Removes the project files 432 goto error 433 434:unknown 435 echo. 436 echo Error: Unknown argument '%1' 437 goto error 438 439:nodos 440 echo. 441 echo Error: Only a Windows NT based Operating System is supported 442 goto error 443 444:nonetdrv 445 echo. 446 echo Error: This batch file cannot run from a network drive 447 goto error 448 449:norepo 450 echo. 451 echo Error: This batch file should only be used from a curl git repository 452 goto error 453 454:seterr 455 rem Set the caller's errorlevel. 456 rem %1[opt]: Errorlevel as integer. 457 rem If %1 is empty the errorlevel will be set to 0. 458 rem If %1 is not empty and not an integer the errorlevel will be set to 1. 459 setlocal 460 set EXITCODE=%~1 461 if not defined EXITCODE set EXITCODE=0 462 echo %EXITCODE%|findstr /r "[^0-9\-]" 1>NUL 2>&1 463 if %ERRORLEVEL% EQU 0 set EXITCODE=1 464 exit /b %EXITCODE% 465 466:error 467 if "%OS%" == "Windows_NT" endlocal 468 exit /B 1 469 470:success 471 endlocal 472 exit /B 0 473