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