Add support for latest VS2017 (15.0) compiler (#1050)
[reactos.git] / configure.cmd
1 @echo off
2
3 REM This is needed so as to avoid static expansion of environment variables
4 REM inside if (...) conditionals.
5 REM See http://stackoverflow.com/questions/305605/weird-scope-issue-in-bat-file
6 REM for more explanation.
7 REM Precisely needed for configuring Visual Studio Environment.
8 setlocal enabledelayedexpansion
9
10 REM Does the user need help?
11 if /I "%1" == "help" goto help
12 if /I "%1" == "/?" (
13 :help
14 echo Help for configure script
15 echo Syntax: path\to\source\configure.cmd [script-options] [Cmake-options]
16 echo Available script-options: Codeblocks, Eclipse, Makefiles, clang, VSSolution, RTC
17 echo Cmake-options: -DVARIABLE:TYPE=VALUE
18 goto quit
19 )
20
21 REM Special case %1 = arm_hosttools %2 = vcvarsall.bat %3 = %CMAKE_GENERATOR%
22 if /I "%1" == "arm_hosttools" (
23 echo Configuring x86 host tools for ARM cross build
24
25 REM This launches %VSINSTALLDIR%VS\vcvarsall.bat
26 call %2 x86
27
28 REM Configure host tools for x86.
29 cmake -G %3 -DARCH:STRING=i386 %~dp0
30 exit
31 )
32
33 REM Get the source root directory
34 set REACTOS_SOURCE_DIR=%~dp0
35
36 REM Ensure there's no spaces in the source path
37 echo %REACTOS_SOURCE_DIR%| find " " > NUL
38 if %ERRORLEVEL% == 0 (
39 echo. && echo Your source path contains at least one space.
40 echo This will cause problems with building.
41 echo Please rename your folders so there are no spaces in the source path,
42 echo or move your source to a different folder.
43 goto quit
44 )
45
46 REM Set default generator
47 set CMAKE_GENERATOR="Ninja"
48 set CMAKE_GENERATOR_HOST=!CMAKE_GENERATOR!
49
50 REM Detect presence of cmake
51 cmd /c cmake --version 2>&1 | find "cmake version" > NUL || goto cmake_notfound
52
53 REM Detect build environment (MinGW, VS, WDK, ...)
54 if defined ROS_ARCH (
55 echo Detected RosBE for %ROS_ARCH%
56 set BUILD_ENVIRONMENT=MinGW
57 set ARCH=%ROS_ARCH%
58 set MINGW_TOOCHAIN_FILE=toolchain-gcc.cmake
59
60 ) else if defined VCINSTALLDIR (
61 REM VS command prompt does not put this in environment vars
62 cl 2>&1 | find "x86" > NUL && set ARCH=i386
63 cl 2>&1 | find "x64" > NUL && set ARCH=amd64
64 cl 2>&1 | find "ARM" > NUL && set ARCH=arm
65 cl 2>&1 | find "16.00." > NUL && set VS_VERSION=10
66 cl 2>&1 | find "17.00." > NUL && set VS_VERSION=11
67 cl 2>&1 | find "18.00." > NUL && set VS_VERSION=12
68 cl 2>&1 | find "19.00." > NUL && set VS_VERSION=14
69 cl 2>&1 | find "19.10." > NUL && set VS_VERSION=15
70 cl 2>&1 | find "19.11." > NUL && set VS_VERSION=15
71 cl 2>&1 | find "19.12." > NUL && set VS_VERSION=15
72 cl 2>&1 | find "19.13." > NUL && set VS_VERSION=15
73 cl 2>&1 | find "19.14." > NUL && set VS_VERSION=15
74 cl 2>&1 | find "19.15." > NUL && set VS_VERSION=15
75 cl 2>&1 | find "19.16." > NUL && set VS_VERSION=15
76 if not defined VS_VERSION (
77 echo Error: Visual Studio version too old ^(before 10 ^(2010^)^) or version detection failed.
78 goto quit
79 )
80 set BUILD_ENVIRONMENT=VS
81 set VS_SOLUTION=0
82 set VS_RUNTIME_CHECKS=0
83 echo Detected Visual Studio Environment !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
84 ) else (
85 echo Error: Unable to detect build environment. Configure script failure.
86 goto quit
87 )
88
89 REM Checkpoint
90 if not defined ARCH (
91 echo Unknown build architecture
92 goto quit
93 )
94
95 set NEW_STYLE_BUILD=1
96 set USE_CLANG_CL=0
97
98 REM Parse command line parameters
99 :repeat
100 if /I "%1" == "-DNEW_STYLE_BUILD" (
101 set NEW_STYLE_BUILD=%2
102 ) else if "%BUILD_ENVIRONMENT%" == "MinGW" (
103 if /I "%1" == "Codeblocks" (
104 set CMAKE_GENERATOR="CodeBlocks - MinGW Makefiles"
105 ) else if /I "%1" == "Eclipse" (
106 set CMAKE_GENERATOR="Eclipse CDT4 - MinGW Makefiles"
107 ) else if /I "%1" == "Makefiles" (
108 set CMAKE_GENERATOR="MinGW Makefiles"
109 ) else if /I "%1" == "VSSolution" (
110 echo. && echo Error: Creation of VS Solution files is not supported in a MinGW environment.
111 echo Please run this command in a [Developer] Command Prompt for Visual Studio.
112 goto quit
113 ) else if /I "%1" == "RTC" (
114 echo. && echo Warning: RTC switch is ignored outside of a Visual Studio environment. && echo.
115 ) else if /I "%1" NEQ "" (
116 echo %1| find /I "-D" > NUL
117 if %ERRORLEVEL% == 0 (
118 REM User is passing a switch to CMake
119 REM Ignore it, and ignore the next parameter that follows
120 Shift
121 ) else (
122 echo. && echo Warning: Unrecognized switch "%1" && echo.
123 )
124 ) else (
125 goto continue
126 )
127 ) else (
128 if /I "%1" == "CodeBlocks" (
129 set CMAKE_GENERATOR="CodeBlocks - NMake Makefiles"
130 ) else if /I "%1" == "Eclipse" (
131 set CMAKE_GENERATOR="Eclipse CDT4 - NMake Makefiles"
132 ) else if /I "%1" == "Makefiles" (
133 set CMAKE_GENERATOR="NMake Makefiles"
134 ) else if /I "%1" == "clang" (
135 set USE_CLANG_CL=1
136 ) else if /I "%1" == "VSSolution" (
137 set VS_SOLUTION=1
138 REM explicitly set VS version for project generator
139 if /I "%2" == "-VS_VER" (
140 set VS_VERSION=%3
141 echo Visual Studio Environment set to !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
142 )
143 if "!VS_VERSION!" == "10" (
144 if "!ARCH!" == "amd64" (
145 set CMAKE_GENERATOR="Visual Studio 10 Win64"
146 ) else (
147 set CMAKE_GENERATOR="Visual Studio 10"
148 )
149 ) else if "!VS_VERSION!" == "11" (
150 if "!ARCH!" == "amd64" (
151 set CMAKE_GENERATOR="Visual Studio 11 Win64"
152 ) else if "!ARCH!" == "arm" (
153 set CMAKE_GENERATOR="Visual Studio 11 ARM"
154 set CMAKE_GENERATOR_HOST="Visual Studio 11"
155 ) else (
156 set CMAKE_GENERATOR="Visual Studio 11"
157 )
158 ) else if "!VS_VERSION!" == "12" (
159 if "!ARCH!" == "amd64" (
160 set CMAKE_GENERATOR="Visual Studio 12 Win64"
161 ) else if "!ARCH!" == "arm" (
162 set CMAKE_GENERATOR="Visual Studio 12 ARM"
163 set CMAKE_GENERATOR_HOST="Visual Studio 12"
164 ) else (
165 set CMAKE_GENERATOR="Visual Studio 12"
166 )
167 ) else if "!VS_VERSION!" == "14" (
168 if "!ARCH!" == "amd64" (
169 set CMAKE_GENERATOR="Visual Studio 14 Win64"
170 ) else if "!ARCH!" == "arm" (
171 set CMAKE_GENERATOR="Visual Studio 14 ARM"
172 set CMAKE_GENERATOR_HOST="Visual Studio 14"
173 ) else (
174 set CMAKE_GENERATOR="Visual Studio 14"
175 )
176 ) else if "!VS_VERSION!" == "15" (
177 if "!ARCH!" == "amd64" (
178 set CMAKE_GENERATOR="Visual Studio 15 Win64"
179 ) else if "!ARCH!" == "arm" (
180 set CMAKE_GENERATOR="Visual Studio 15 ARM"
181 set CMAKE_GENERATOR_HOST="Visual Studio 15"
182 ) else (
183 set CMAKE_GENERATOR="Visual Studio 15"
184 )
185 )
186 ) else if /I "%1" == "RTC" (
187 echo Runtime checks enabled
188 set VS_RUNTIME_CHECKS=1
189 ) else if /I "%1" NEQ "" (
190 echo %1| find /I "-D" > NUL
191 if %ERRORLEVEL% == 0 (
192 REM User is passing a switch to CMake
193 REM Ignore it, and ignore the next parameter that follows
194 Shift
195 ) else (
196 echo. && echo Warning: Unrecognized switch "%1" && echo.
197 )
198 ) else (
199 goto continue
200 )
201 )
202
203 REM Go to next parameter
204 SHIFT
205 goto repeat
206 :continue
207
208 REM Inform the user about the default build
209 if "!CMAKE_GENERATOR!" == "Ninja" (
210 echo This script defaults to Ninja. Type "configure help" for alternative options.
211 )
212
213 REM Create directories
214 set REACTOS_OUTPUT_PATH=output-%BUILD_ENVIRONMENT%-%ARCH%
215
216 if "%VS_SOLUTION%" == "1" (
217 set REACTOS_OUTPUT_PATH=%REACTOS_OUTPUT_PATH%-sln
218 )
219
220 if "%REACTOS_SOURCE_DIR%" == "%CD%\" (
221 set CD_SAME_AS_SOURCE=1
222 echo Creating directories in %REACTOS_OUTPUT_PATH%
223
224 if not exist %REACTOS_OUTPUT_PATH% (
225 mkdir %REACTOS_OUTPUT_PATH%
226 )
227 cd %REACTOS_OUTPUT_PATH%
228 )
229
230 if "%VS_SOLUTION%" == "1" (
231
232 if exist build.ninja (
233 echo. && echo Error: This directory has already been configured for ninja.
234 echo An output folder configured for ninja can't be reconfigured for VSSolution.
235 echo Use an empty folder or delete the contents of this folder, then try again.
236 goto quit
237 )
238 ) else if exist REACTOS.sln (
239 echo. && echo Error: This directory has already been configured for Visual Studio.
240 echo An output folder configured for VSSolution can't be reconfigured for ninja.
241 echo Use an empty folder or delete the contents of this folder, then try again. && echo.
242 goto quit
243 )
244
245 if "%NEW_STYLE_BUILD%"=="0" (
246
247 if not exist host-tools (
248 mkdir host-tools
249 )
250
251 if not exist reactos (
252 mkdir reactos
253 )
254
255 echo Preparing host tools...
256 cd host-tools
257 if EXIST CMakeCache.txt (
258 del CMakeCache.txt /q
259 )
260
261 set REACTOS_BUILD_TOOLS_DIR=!CD!
262
263 REM Use x86 for ARM host tools
264 if "%ARCH%" == "arm" (
265 REM Launch new script instance for x86 host tools configuration
266 start "Preparing host tools for ARM cross build..." /I /B /WAIT %~dp0configure.cmd arm_hosttools "%VSINSTALLDIR%VC\vcvarsall.bat" %CMAKE_GENERATOR_HOST%
267 ) else (
268 cmake -G %CMAKE_GENERATOR% -DARCH:STRING=%ARCH% "%REACTOS_SOURCE_DIR%"
269 )
270
271 cd..
272
273 )
274
275 echo Preparing reactos...
276
277 if "%NEW_STYLE_BUILD%"=="0" (
278 cd reactos
279 )
280
281 if EXIST CMakeCache.txt (
282 del CMakeCache.txt /q
283 del host-tools\CMakeCache.txt /q
284 )
285
286 if "%NEW_STYLE_BUILD%"=="0" (
287 set BUILD_TOOLS_FLAG=-DREACTOS_BUILD_TOOLS_DIR:PATH="%REACTOS_BUILD_TOOLS_DIR%"
288 )
289
290 if "%BUILD_ENVIRONMENT%" == "MinGW" (
291 cmake -G %CMAKE_GENERATOR% -DENABLE_CCACHE:BOOL=0 -DCMAKE_TOOLCHAIN_FILE:FILEPATH=%MINGW_TOOCHAIN_FILE% -DARCH:STRING=%ARCH% %BUILD_TOOLS_FLAG% %* "%REACTOS_SOURCE_DIR%"
292 ) else if %USE_CLANG_CL% == 1 (
293 cmake -G %CMAKE_GENERATOR% -DCMAKE_TOOLCHAIN_FILE:FILEPATH=toolchain-msvc.cmake -DARCH:STRING=%ARCH% %BUILD_TOOLS_FLAG% -DUSE_CLANG_CL:BOOL=1 -DRUNTIME_CHECKS:BOOL=%VS_RUNTIME_CHECKS% %* "%REACTOS_SOURCE_DIR%"
294 ) else (
295 cmake -G %CMAKE_GENERATOR% -DCMAKE_TOOLCHAIN_FILE:FILEPATH=toolchain-msvc.cmake -DARCH:STRING=%ARCH% %BUILD_TOOLS_FLAG% -DRUNTIME_CHECKS:BOOL=%VS_RUNTIME_CHECKS% %* "%REACTOS_SOURCE_DIR%"
296 )
297
298 if "%NEW_STYLE_BUILD%"=="0" (
299 cd..
300 )
301
302 if %ERRORLEVEL% NEQ 0 (
303 goto quit
304 )
305
306 if "%CD_SAME_AS_SOURCE%" == "1" (
307 set ENDV= from %REACTOS_OUTPUT_PATH%
308 )
309
310 if "%VS_SOLUTION%" == "1" (
311 set ENDV= You can now use msbuild or open REACTOS.sln%ENDV%.
312 ) else (
313 set ENDV= Execute appropriate build commands ^(ex: ninja, make, nmake, etc...^)%ENDV%
314 )
315
316 echo. && echo Configure script complete^^!%ENDV%
317
318 goto quit
319
320 :cmake_notfound
321 echo Unable to find cmake, if it is installed, check your PATH variable.
322
323 :quit
324 endlocal
325 exit /b