[CONFIGURE] Simplify Visual Studio generator selection.
[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 -A Win32 -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_ARCH=
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 set CMAKE_GENERATOR="Visual Studio !VS_VERSION!"
144 if "!ARCH!" == "i386" (
145 set CMAKE_ARCH=-A Win32
146 ) else if "!ARCH!" == "amd64" (
147 set CMAKE_ARCH=-A x64
148 ) else if "!ARCH!" == "arm" (
149 set CMAKE_ARCH=-A ARM
150 )
151 ) else if /I "%1" == "RTC" (
152 echo Runtime checks enabled
153 set VS_RUNTIME_CHECKS=1
154 ) else if /I "%1" NEQ "" (
155 echo %1| find /I "-D" > NUL
156 if %ERRORLEVEL% == 0 (
157 REM User is passing a switch to CMake
158 REM Ignore it, and ignore the next parameter that follows
159 Shift
160 ) else (
161 echo. && echo Warning: Unrecognized switch "%1" && echo.
162 )
163 ) else (
164 goto continue
165 )
166 )
167
168 REM Go to next parameter
169 SHIFT
170 goto repeat
171 :continue
172
173 REM Inform the user about the default build
174 if "!CMAKE_GENERATOR!" == "Ninja" (
175 echo This script defaults to Ninja. Type "configure help" for alternative options.
176 )
177
178 REM Create directories
179 set REACTOS_OUTPUT_PATH=output-%BUILD_ENVIRONMENT%-%ARCH%
180
181 if "%VS_SOLUTION%" == "1" (
182 set REACTOS_OUTPUT_PATH=%REACTOS_OUTPUT_PATH%-sln
183 )
184
185 if "%REACTOS_SOURCE_DIR%" == "%CD%\" (
186 set CD_SAME_AS_SOURCE=1
187 echo Creating directories in %REACTOS_OUTPUT_PATH%
188
189 if not exist %REACTOS_OUTPUT_PATH% (
190 mkdir %REACTOS_OUTPUT_PATH%
191 )
192 cd %REACTOS_OUTPUT_PATH%
193 )
194
195 if "%VS_SOLUTION%" == "1" (
196
197 if exist build.ninja (
198 echo. && echo Error: This directory has already been configured for ninja.
199 echo An output folder configured for ninja can't be reconfigured for VSSolution.
200 echo Use an empty folder or delete the contents of this folder, then try again.
201 goto quit
202 )
203 ) else if exist REACTOS.sln (
204 echo. && echo Error: This directory has already been configured for Visual Studio.
205 echo An output folder configured for VSSolution can't be reconfigured for ninja.
206 echo Use an empty folder or delete the contents of this folder, then try again. && echo.
207 goto quit
208 )
209
210 if "%NEW_STYLE_BUILD%"=="0" (
211
212 if not exist host-tools (
213 mkdir host-tools
214 )
215
216 if not exist reactos (
217 mkdir reactos
218 )
219
220 echo Preparing host tools...
221 cd host-tools
222 if EXIST CMakeCache.txt (
223 del CMakeCache.txt /q
224 )
225
226 set REACTOS_BUILD_TOOLS_DIR=!CD!
227
228 REM Use x86 for ARM host tools
229 if "%ARCH%" == "arm" (
230 REM Launch new script instance for x86 host tools configuration
231 start "Preparing host tools for ARM cross build..." /I /B /WAIT %~dp0configure.cmd arm_hosttools "%VSINSTALLDIR%VC\vcvarsall.bat" %CMAKE_GENERATOR%
232 ) else (
233 cmake -G %CMAKE_GENERATOR% %CMAKE_ARCH% -DARCH:STRING=%ARCH% "%REACTOS_SOURCE_DIR%"
234 )
235
236 cd..
237
238 )
239
240 echo Preparing reactos...
241
242 if "%NEW_STYLE_BUILD%"=="0" (
243 cd reactos
244 )
245
246 if EXIST CMakeCache.txt (
247 del CMakeCache.txt /q
248 del host-tools\CMakeCache.txt /q
249 )
250
251 if "%NEW_STYLE_BUILD%"=="0" (
252 set BUILD_TOOLS_FLAG=-DREACTOS_BUILD_TOOLS_DIR:PATH="%REACTOS_BUILD_TOOLS_DIR%"
253 )
254
255 if "%BUILD_ENVIRONMENT%" == "MinGW" (
256 cmake -G %CMAKE_GENERATOR% -DENABLE_CCACHE:BOOL=0 -DCMAKE_TOOLCHAIN_FILE:FILEPATH=%MINGW_TOOCHAIN_FILE% -DARCH:STRING=%ARCH% %BUILD_TOOLS_FLAG% %* "%REACTOS_SOURCE_DIR%"
257 ) else if %USE_CLANG_CL% == 1 (
258 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%"
259 ) else (
260 cmake -G %CMAKE_GENERATOR% %CMAKE_ARCH% -DCMAKE_TOOLCHAIN_FILE:FILEPATH=toolchain-msvc.cmake -DARCH:STRING=%ARCH% %BUILD_TOOLS_FLAG% -DRUNTIME_CHECKS:BOOL=%VS_RUNTIME_CHECKS% %* "%REACTOS_SOURCE_DIR%"
261 )
262
263 if "%NEW_STYLE_BUILD%"=="0" (
264 cd..
265 )
266
267 if %ERRORLEVEL% NEQ 0 (
268 goto quit
269 )
270
271 if "%CD_SAME_AS_SOURCE%" == "1" (
272 set ENDV= from %REACTOS_OUTPUT_PATH%
273 )
274
275 if "%VS_SOLUTION%" == "1" (
276 set ENDV= You can now use msbuild or open REACTOS.sln%ENDV%.
277 ) else (
278 set ENDV= Execute appropriate build commands ^(ex: ninja, make, nmake, etc...^)%ENDV%
279 )
280
281 echo. && echo Configure script complete^^!%ENDV%
282
283 goto quit
284
285 :cmake_notfound
286 echo Unable to find cmake, if it is installed, check your PATH variable.
287
288 :quit
289 endlocal
290 exit /b