1@echo off
2rem ***************************************************************************
3rem *                                  _   _ ____  _
4rem *  Project                     ___| | | |  _ \| |
5rem *                             / __| | | | |_) | |
6rem *                            | (__| |_| |  _ <| |___
7rem *                             \___|\___/|_| \_\_____|
8rem *
9rem * Copyright (C) 2012 - 2018, Steve Holme, <steve_holme@hotmail.com>.
10rem * Copyright (C) 2015, Jay Satiro, <raysatiro@yahoo.com>.
11rem *
12rem * This software is licensed as described in the file COPYING, which
13rem * you should have received as part of this distribution. The terms
14rem * are also available at https://curl.haxx.se/docs/copyright.html.
15rem *
16rem * You may opt to use, copy, modify, merge, publish, distribute and/or sell
17rem * copies of the Software, and permit persons to whom the Software is
18rem * furnished to do so, under the terms of the COPYING file.
19rem *
20rem * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21rem * KIND, either express or implied.
22rem *
23rem ***************************************************************************
24
25:begin
26  rem Check we are running on a Windows NT derived OS
27  if not "%OS%" == "Windows_NT" goto nodos
28
29  rem Set our variables
30  setlocal
31  set SUCCESSFUL_BUILDS=
32  set VC_VER=
33  set BUILD_PLATFORM=
34
35  rem Ensure we have the required arguments
36  if /i "%~1" == "" goto syntax
37
38  rem Calculate the program files directory
39  if defined PROGRAMFILES (
40    set "PF=%PROGRAMFILES%"
41    set OS_PLATFORM=x86
42  )
43  if defined PROGRAMFILES(x86) (
44    set "PF=%PROGRAMFILES(x86)%"
45    set OS_PLATFORM=x64
46  )
47
48:parseArgs
49  if "%~1" == "" goto prerequisites
50
51  if /i "%~1" == "vc10" (
52    set VC_VER=10.0
53    set VC_DESC=VC10
54    set VC_TOOLSET=v100
55    set "VC_PATH=Microsoft Visual Studio 10.0\VC"
56  ) else if /i "%~1" == "vc11" (
57    set VC_VER=11.0
58    set VC_DESC=VC11
59    set VC_TOOLSET=v110
60    set "VC_PATH=Microsoft Visual Studio 11.0\VC"
61  ) else if /i "%~1" == "vc12" (
62    set VC_VER=12.0
63    set VC_DESC=VC12
64    set VC_TOOLSET=v120
65    set "VC_PATH=Microsoft Visual Studio 12.0\VC"
66  ) else if /i "%~1" == "vc14" (
67    set VC_VER=14.0
68    set VC_DESC=VC14
69    set VC_TOOLSET=v140
70    set "VC_PATH=Microsoft Visual Studio 14.0\VC"
71  ) else if /i "%~1" == "vc14.1" (
72    set VC_VER=14.1
73    set VC_DESC=VC14.1
74    set VC_TOOLSET=v141
75
76    rem Determine the VC14.1 path based on the installed edition in descending
77    rem order (Enterprise, then Professional and finally Community)
78    if exist "%PF%\Microsoft Visual Studio\2017\Enterprise\VC" (
79      set "VC_PATH=Microsoft Visual Studio\2017\Enterprise\VC"
80    ) else if exist "%PF%\Microsoft Visual Studio\2017\Professional\VC" (
81      set "VC_PATH=Microsoft Visual Studio\2017\Professional\VC"
82    ) else (
83      set "VC_PATH=Microsoft Visual Studio\2017\Community\VC"
84    )
85  ) else if /i "%~1" == "x86" (
86    set BUILD_PLATFORM=x86
87  ) else if /i "%~1" == "x64" (
88    set BUILD_PLATFORM=x64
89  ) else if /i "%~1" == "debug" (
90    set BUILD_CONFIG=debug
91  ) else if /i "%~1" == "release" (
92    set BUILD_CONFIG=release
93  ) else if /i "%~1" == "-?" (
94    goto syntax
95  ) else if /i "%~1" == "-h" (
96    goto syntax
97  ) else if /i "%~1" == "-help" (
98    goto syntax
99  ) else (
100    if not defined START_DIR (
101      set START_DIR=%~1
102    ) else (
103      goto unknown
104    )
105  )
106
107  shift & goto parseArgs
108
109:prerequisites
110  rem Compiler is a required parameter
111  if not defined VC_VER goto syntax
112
113  rem Default the start directory if one isn't specified
114  if not defined START_DIR set START_DIR=..\..\wolfssl
115
116  rem Check we have a program files directory
117  if not defined PF goto nopf
118
119  rem Check we have Visual Studio installed
120  if not exist "%PF%\%VC_PATH%" goto novc
121
122  rem Check the start directory exists
123  if not exist "%START_DIR%" goto nowolfssl
124
125:configure
126  if "%BUILD_PLATFORM%" == "" set BUILD_PLATFORM=%OS_PLATFORM%
127
128  if "%BUILD_PLATFORM%" == "x86" (
129    set VCVARS_PLATFORM=x86
130  ) else if "%BUILD_PLATFORM%" == "x64" (
131    if "%VC_VER%" == "10.0" set VCVARS_PLATFORM=%BUILD_PLATFORM%
132    if "%VC_VER%" == "11.0" set VCVARS_PLATFORM=amd64
133    if "%VC_VER%" == "12.0" set VCVARS_PLATFORM=amd64
134    if "%VC_VER%" == "14.0" set VCVARS_PLATFORM=amd64
135    if "%VC_VER%" == "14.1" set VCVARS_PLATFORM=amd64
136  )
137
138:start
139  echo.
140  set SAVED_PATH=%CD%
141
142  if "%VC_VER%" == "14.1" (
143    call "%PF%\%VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
144  ) else (
145    call "%PF%\%VC_PATH%\vcvarsall" %VCVARS_PLATFORM%
146  )
147
148  echo.
149  cd /d %SAVED_PATH%
150  if defined START_DIR cd /d %START_DIR%
151  goto %BUILD_PLATFORM%
152
153:x64
154  rem Calculate our output directory
155  set OUTDIR=build\Win64\%VC_DESC%
156  if not exist %OUTDIR% md %OUTDIR%
157
158  if "%BUILD_CONFIG%" == "release" goto x64release
159
160:x64debug
161  rem Perform 64-bit Debug Build
162
163  call :build Debug x64
164  if errorlevel 1 goto error
165
166  call :build "DLL Debug" x64
167  if errorlevel 1 goto error
168
169  if "%BUILD_CONFIG%" == "debug" goto success
170
171:x64release
172  rem Perform 64-bit Release Build
173
174  call :build Release x64
175  if errorlevel 1 goto error
176
177  call :build "DLL Release" x64
178  if errorlevel 1 goto error
179
180  goto success
181
182:x86
183  rem Calculate our output directory
184  set OUTDIR=build\Win32\%VC_DESC%
185  if not exist %OUTDIR% md %OUTDIR%
186
187  if "%BUILD_CONFIG%" == "release" goto x86release
188
189:x86debug
190  rem Perform 32-bit Debug Build
191
192  call :build Debug Win32
193  if errorlevel 1 goto error
194
195  call :build "DLL Debug" Win32
196  if errorlevel 1 goto error
197
198  if "%BUILD_CONFIG%" == "debug" goto success
199
200:x86release
201  rem Perform 32-bit Release Build
202
203  call :build Release Win32
204  if errorlevel 1 goto error
205
206  call :build "DLL Release" Win32
207  if errorlevel 1 goto error
208
209  goto success
210
211:build
212  rem This function builds wolfSSL.
213  rem Usage: CALL :build <configuration> <platform>
214  rem The current directory must be the wolfSSL directory.
215  rem VS Configuration: Debug, Release, DLL Debug or DLL Release.
216  rem VS Platform: Win32 or x64.
217  rem Returns: 1 on fail, 0 on success.
218  rem An informational message should be shown before any return.
219  setlocal
220  set MSBUILD_CONFIG=%~1
221  set MSBUILD_PLATFORM=%~2
222
223  if not exist wolfssl64.sln (
224    echo.
225    echo Error: build: wolfssl64.sln not found in "%CD%"
226    exit /b 1
227  )
228
229  rem OUTDIR isn't a full path, only relative. MSBUILD_OUTDIR must be full and
230  rem not have trailing backslashes, which are handled later.
231  if "%MSBUILD_CONFIG%" == "Debug" (
232    set "MSBUILD_OUTDIR=%CD%\%OUTDIR%\LIB Debug"
233  ) else if "%MSBUILD_CONFIG%" == "Release" (
234    set "MSBUILD_OUTDIR=%CD%\%OUTDIR%\LIB Release"
235  ) else if "%MSBUILD_CONFIG%" == "DLL Debug" (
236    set "MSBUILD_OUTDIR=%CD%\%OUTDIR%\DLL Debug"
237  ) else if "%MSBUILD_CONFIG%" == "DLL Release" (
238    set "MSBUILD_OUTDIR=%CD%\%OUTDIR%\DLL Release"
239  ) else (
240    echo.
241    echo Error: build: Configuration not recognized.
242    exit /b 1
243  )
244
245  if not "%MSBUILD_PLATFORM%" == "Win32" if not "%MSBUILD_PLATFORM%" == "x64" (
246    echo.
247    echo Error: build: Platform not recognized.
248    exit /b 1
249  )
250
251  copy /v /y "%~dp0\wolfssl_options.h" .\cyassl\options.h
252  if %ERRORLEVEL% neq 0 (
253    echo.
254    echo Error: build: Couldn't replace .\cyassl\options.h
255    exit /b 1
256  )
257
258  copy /v /y "%~dp0\wolfssl_options.h" .\wolfssl\options.h
259  if %ERRORLEVEL% neq 0 (
260    echo.
261    echo Error: build: Couldn't replace .\wolfssl\options.h
262    exit /b 1
263  )
264
265  rem Extra trailing \ in Dirs because otherwise it thinks a quote is escaped
266  msbuild wolfssl64.sln ^
267    -p:CustomAfterMicrosoftCommonTargets="%~dp0\wolfssl_override.props" ^
268    -p:Configuration="%MSBUILD_CONFIG%" ^
269    -p:Platform="%MSBUILD_PLATFORM%" ^
270    -p:PlatformToolset="%VC_TOOLSET%" ^
271    -p:OutDir="%MSBUILD_OUTDIR%\\" ^
272    -p:IntDir="%MSBUILD_OUTDIR%\obj\\"
273
274  if %ERRORLEVEL% neq 0 (
275    echo.
276    echo Error: Failed building wolfSSL %MSBUILD_CONFIG%^|%MSBUILD_PLATFORM%.
277    exit /b 1
278  )
279
280  rem For tests to run properly the wolfSSL directory must remain the current.
281  set "PATH=%MSBUILD_OUTDIR%;%PATH%"
282  "%MSBUILD_OUTDIR%\testsuite.exe"
283
284  if %ERRORLEVEL% neq 0 (
285    echo.
286    echo Error: Failed testing wolfSSL %MSBUILD_CONFIG%^|%MSBUILD_PLATFORM%.
287    exit /b 1
288  )
289
290  echo.
291  echo Success: Built and tested wolfSSL %MSBUILD_CONFIG%^|%MSBUILD_PLATFORM%.
292  echo.
293  echo.
294  rem This is necessary to export our local variables back to the caller.
295  endlocal & set SUCCESSFUL_BUILDS="%MSBUILD_CONFIG%|%MSBUILD_PLATFORM%" ^
296    %SUCCESSFUL_BUILDS%
297  exit /b 0
298
299:syntax
300  rem Display the help
301  echo.
302  echo Usage: build-wolfssl ^<compiler^> [platform] [configuration] [directory]
303  echo.
304  echo Compiler:
305  echo.
306  echo vc10      - Use Visual Studio 2010
307  echo vc11      - Use Visual Studio 2012
308  echo vc12      - Use Visual Studio 2013
309  echo vc14      - Use Visual Studio 2015
310  echo vc14.1    - Use Visual Studio 2017
311  echo.
312  echo Platform:
313  echo.
314  echo x86       - Perform a 32-bit build
315  echo x64       - Perform a 64-bit build
316  echo.
317  echo Configuration:
318  echo.
319  echo debug     - Perform a debug build
320  echo release   - Perform a release build
321  echo.
322  echo Other:
323  echo.
324  echo directory - Specifies the wolfSSL source directory
325  goto error
326
327:unknown
328  echo.
329  echo Error: Unknown argument '%1'
330  goto error
331
332:nodos
333  echo.
334  echo Error: Only a Windows NT based Operating System is supported
335  goto error
336
337:nopf
338  echo.
339  echo Error: Cannot obtain the directory for Program Files
340  goto error
341
342:novc
343  echo.
344  echo Error: %VC_DESC% is not installed
345  goto error
346
347:nox64
348  echo.
349  echo Error: %VC_DESC% does not support 64-bit builds
350  goto error
351
352:nowolfssl
353  echo.
354  echo Error: Cannot locate wolfSSL source directory, expected "%START_DIR%"
355  goto error
356
357:error
358  if "%OS%" == "Windows_NT" endlocal
359  exit /B 1
360
361:success
362  if defined SUCCESSFUL_BUILDS (
363    echo.
364    echo.
365    echo Build complete.
366    echo.
367    echo The following configurations were built and tested successfully:
368    echo.
369    echo %SUCCESSFUL_BUILDS%
370    echo.
371  )
372  cd /d %SAVED_PATH%
373  endlocal
374  exit /B 0
375