[NTOS:SE] Minor style changes.
[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 if not defined VS_VERSION (
75 echo Error: Visual Studio version too old ^(before 10 ^(2010^)^) or version detection failed.
76 goto quit
77 )
78 set BUILD_ENVIRONMENT=VS
79 set VS_SOLUTION=0
80 set VS_RUNTIME_CHECKS=0
81 echo Detected Visual Studio Environment !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
82 ) else (
83 echo Error: Unable to detect build environment. Configure script failure.
84 goto quit
85 )
86
87 REM Checkpoint
88 if not defined ARCH (
89 echo Unknown build architecture
90 goto quit
91 )
92
93 set NEW_STYLE_BUILD=1
94 set USE_CLANG_CL=0
95
96 REM Parse command line parameters
97 :repeat
98 if /I "%1" == "-DNEW_STYLE_BUILD" (
99 set NEW_STYLE_BUILD=%2
100 ) else if "%BUILD_ENVIRONMENT%" == "MinGW" (
101 if /I "%1" == "Codeblocks" (
102 set CMAKE_GENERATOR="CodeBlocks - MinGW Makefiles"
103 ) else if /I "%1" == "Eclipse" (
104 set CMAKE_GENERATOR="Eclipse CDT4 - MinGW Makefiles"
105 ) else if /I "%1" == "Makefiles" (
106 set CMAKE_GENERATOR="MinGW Makefiles"
107 ) else if /I "%1" == "VSSolution" (
108 echo. && echo Error: Creation of VS Solution files is not supported in a MinGW environment.
109 echo Please run this command in a [Developer] Command Prompt for Visual Studio.
110 goto quit
111 ) else if /I "%1" == "RTC" (
112 echo. && echo Warning: RTC switch is ignored outside of a Visual Studio environment. && echo.
113 ) else if /I "%1" NEQ "" (
114 echo %1| find /I "-D" > NUL
115 if %ERRORLEVEL% == 0 (
116 REM User is passing a switch to CMake
117 REM Ignore it, and ignore the next parameter that follows
118 Shift
119 ) else (
120 echo. && echo Warning: Unrecognized switch "%1" && echo.
121 )
122 ) else (
123 goto continue
124 )
125 ) else (
126 if /I "%1" == "CodeBlocks" (
127 set CMAKE_GENERATOR="CodeBlocks - NMake Makefiles"
128 ) else if /I "%1" == "Eclipse" (
129 set CMAKE_GENERATOR="Eclipse CDT4 - NMake Makefiles"
130 ) else if /I "%1" == "Makefiles" (
131 set CMAKE_GENERATOR="NMake Makefiles"
132 ) else if /I "%1" == "clang" (
133 set USE_CLANG_CL=1
134 ) else if /I "%1" == "VSSolution" (
135 set VS_SOLUTION=1
136 REM explicitly set VS version for project generator
137 if /I "%2" == "-VS_VER" (
138 set VS_VERSION=%3
139 echo Visual Studio Environment set to !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
140 )
141 if "!VS_VERSION!" == "10" (
142 if "!ARCH!" == "amd64" (
143 set CMAKE_GENERATOR="Visual Studio 10 Win64"
144 ) else (
145 set CMAKE_GENERATOR="Visual Studio 10"
146 )
147 ) else if "!VS_VERSION!" == "11" (
148 if "!ARCH!" == "amd64" (
149 set CMAKE_GENERATOR="Visual Studio 11 Win64"
150 ) else if "!ARCH!" == "arm" (
151 set CMAKE_GENERATOR="Visual Studio 11 ARM"
152 set CMAKE_GENERATOR_HOST="Visual Studio 11"
153 ) else (
154 set CMAKE_GENERATOR="Visual Studio 11"
155 )
156 ) else if "!VS_VERSION!" == "12" (
157 if "!ARCH!" == "amd64" (
158 set CMAKE_GENERATOR="Visual Studio 12 Win64"
159 ) else if "!ARCH!" == "arm" (
160 set CMAKE_GENERATOR="Visual Studio 12 ARM"
161 set CMAKE_GENERATOR_HOST="Visual Studio 12"
162 ) else (
163 set CMAKE_GENERATOR="Visual Studio 12"
164 )
165 ) else if "!VS_VERSION!" == "14" (
166 if "!ARCH!" == "amd64" (
167 set CMAKE_GENERATOR="Visual Studio 14 Win64"
168 ) else if "!ARCH!" == "arm" (
169 set CMAKE_GENERATOR="Visual Studio 14 ARM"
170 set CMAKE_GENERATOR_HOST="Visual Studio 14"
171 ) else (
172 set CMAKE_GENERATOR="Visual Studio 14"
173 )
174 ) else if "!VS_VERSION!" == "15" (
175 if "!ARCH!" == "amd64" (
176 set CMAKE_GENERATOR="Visual Studio 15 Win64"
177 ) else if "!ARCH!" == "arm" (
178 set CMAKE_GENERATOR="Visual Studio 15 ARM"
179 set CMAKE_GENERATOR_HOST="Visual Studio 15"
180 ) else (
181 set CMAKE_GENERATOR="Visual Studio 15"
182 )
183 )
184 ) else if /I "%1" == "RTC" (
185 echo Runtime checks enabled
186 set VS_RUNTIME_CHECKS=1
187 ) else if /I "%1" NEQ "" (
188 echo %1| find /I "-D" > NUL
189 if %ERRORLEVEL% == 0 (
190 REM User is passing a switch to CMake
191 REM Ignore it, and ignore the next parameter that follows
192 Shift
193 ) else (
194 echo. && echo Warning: Unrecognized switch "%1" && echo.
195 )
196 ) else (
197 goto continue
198 )
199 )
200
201 REM Go to next parameter
202 SHIFT
203 goto repeat
204 :continue
205
206 REM Inform the user about the default build
207 if "!CMAKE_GENERATOR!" == "Ninja" (
208 echo This script defaults to Ninja. Type "configure help" for alternative options.
209 )
210
211 REM Create directories
212 set REACTOS_OUTPUT_PATH=output-%BUILD_ENVIRONMENT%-%ARCH%
213
214 if "%VS_SOLUTION%" == "1" (
215 set REACTOS_OUTPUT_PATH=%REACTOS_OUTPUT_PATH%-sln
216 )
217
218 if "%REACTOS_SOURCE_DIR%" == "%CD%\" (
219 set CD_SAME_AS_SOURCE=1
220 echo Creating directories in %REACTOS_OUTPUT_PATH%
221
222 if not exist %REACTOS_OUTPUT_PATH% (
223 mkdir %REACTOS_OUTPUT_PATH%
224 )
225 cd %REACTOS_OUTPUT_PATH%
226 )
227
228 if "%VS_SOLUTION%" == "1" (
229
230 if exist build.ninja (
231 echo. && echo Error: This directory has already been configured for ninja.
232 echo An output folder configured for ninja can't be reconfigured for VSSolution.
233 echo Use an empty folder or delete the contents of this folder, then try again.
234 goto quit
235 )
236 ) else if exist REACTOS.sln (
237 echo. && echo Error: This directory has already been configured for Visual Studio.
238 echo An output folder configured for VSSolution can't be reconfigured for ninja.
239 echo Use an empty folder or delete the contents of this folder, then try again. && echo.
240 goto quit
241 )
242
243 if "%NEW_STYLE_BUILD%"=="0" (
244
245 if not exist host-tools (
246 mkdir host-tools
247 )
248
249 if not exist reactos (
250 mkdir reactos
251 )
252
253 echo Preparing host tools...
254 cd host-tools
255 if EXIST CMakeCache.txt (
256 del CMakeCache.txt /q
257 )
258
259 set REACTOS_BUILD_TOOLS_DIR=!CD!
260
261 REM Use x86 for ARM host tools
262 if "%ARCH%" == "arm" (
263 REM Launch new script instance for x86 host tools configuration
264 start "Preparing host tools for ARM cross build..." /I /B /WAIT %~dp0configure.cmd arm_hosttools "%VSINSTALLDIR%VC\vcvarsall.bat" %CMAKE_GENERATOR_HOST%
265 ) else (
266 cmake -G %CMAKE_GENERATOR% -DARCH:STRING=%ARCH% "%REACTOS_SOURCE_DIR%"
267 )
268
269 cd..
270
271 )
272
273 echo Preparing reactos...
274
275 if "%NEW_STYLE_BUILD%"=="0" (
276 cd reactos
277 )
278
279 if EXIST CMakeCache.txt (
280 del CMakeCache.txt /q
281 del host-tools\CMakeCache.txt /q
282 )
283
284 if "%NEW_STYLE_BUILD%"=="0" (
285 set BUILD_TOOLS_FLAG=-DREACTOS_BUILD_TOOLS_DIR:PATH="%REACTOS_BUILD_TOOLS_DIR%"
286 )
287
288 if "%BUILD_ENVIRONMENT%" == "MinGW" (
289 cmake -G %CMAKE_GENERATOR% -DENABLE_CCACHE:BOOL=0 -DCMAKE_TOOLCHAIN_FILE:FILEPATH=%MINGW_TOOCHAIN_FILE% -DARCH:STRING=%ARCH% %BUILD_TOOLS_FLAG% %* "%REACTOS_SOURCE_DIR%"
290 ) else if %USE_CLANG_CL% == 1 (
291 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%"
292 ) else (
293 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%"
294 )
295
296 if "%NEW_STYLE_BUILD%"=="0" (
297 cd..
298 )
299
300 if %ERRORLEVEL% NEQ 0 (
301 goto quit
302 )
303
304 if "%CD_SAME_AS_SOURCE%" == "1" (
305 set ENDV= from %REACTOS_OUTPUT_PATH%
306 )
307
308 if "%VS_SOLUTION%" == "1" (
309 set ENDV= You can now use msbuild or open REACTOS.sln%ENDV%.
310 ) else (
311 set ENDV= Execute appropriate build commands ^(ex: ninja, make, nmake, etc...^)%ENDV%
312 )
313
314 echo. && echo Configure script complete^^!%ENDV%
315
316 goto quit
317
318 :cmake_notfound
319 echo Unable to find cmake, if it is installed, check your PATH variable.
320
321 :quit
322 endlocal
323 exit /b