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