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