[OSK] Refactor the registry configuration code (#2096)
[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 Get the source root directory
22 set REACTOS_SOURCE_DIR=%~dp0
23
24 REM Ensure there's no spaces in the source path
25 echo %REACTOS_SOURCE_DIR%| find " " > NUL
26 if %ERRORLEVEL% == 0 (
27 echo. && echo Your source path contains at least one space.
28 echo This will cause problems with building.
29 echo Please rename your folders so there are no spaces in the source path,
30 echo or move your source to a different folder.
31 goto quit
32 )
33
34 REM Set default generator
35 set CMAKE_GENERATOR="Ninja"
36 set CMAKE_ARCH=
37
38 REM Detect presence of cmake
39 cmd /c cmake --version 2>&1 | find "cmake version" > NUL || goto cmake_notfound
40
41 REM Detect build environment (MinGW, VS, WDK, ...)
42 if defined ROS_ARCH (
43 echo Detected RosBE for %ROS_ARCH%
44 set BUILD_ENVIRONMENT=MinGW
45 set ARCH=%ROS_ARCH%
46 set MINGW_TOOCHAIN_FILE=toolchain-gcc.cmake
47
48 ) else if defined VCINSTALLDIR (
49 REM VS command prompt does not put this in environment vars
50 cl 2>&1 | find "x86" > NUL && set ARCH=i386
51 cl 2>&1 | find "x64" > NUL && set ARCH=amd64
52 cl 2>&1 | find "ARM" > NUL && set ARCH=arm
53 cl 2>&1 | find "16.00." > NUL && set VS_VERSION=10
54 cl 2>&1 | find "17.00." > NUL && set VS_VERSION=11
55 cl 2>&1 | find "18.00." > NUL && set VS_VERSION=12
56 cl 2>&1 | find "19.00." > NUL && set VS_VERSION=14
57 cl 2>&1 | find "19.10." > NUL && set VS_VERSION=15
58 cl 2>&1 | find "19.11." > NUL && set VS_VERSION=15
59 cl 2>&1 | find "19.12." > NUL && set VS_VERSION=15
60 cl 2>&1 | find "19.13." > NUL && set VS_VERSION=15
61 cl 2>&1 | find "19.14." > NUL && set VS_VERSION=15
62 cl 2>&1 | find "19.15." > NUL && set VS_VERSION=15
63 cl 2>&1 | find "19.16." > NUL && set VS_VERSION=15
64 cl 2>&1 | find "19.20." > NUL && set VS_VERSION=16
65 cl 2>&1 | find "19.21." > NUL && set VS_VERSION=16
66 cl 2>&1 | find "19.22." > NUL && set VS_VERSION=16
67 cl 2>&1 | find "19.23." > NUL && set VS_VERSION=16
68 cl 2>&1 | find "19.24." > NUL && set VS_VERSION=16
69 if not defined VS_VERSION (
70 echo Error: Visual Studio version too old ^(before 10 ^(2010^)^) or version detection failed.
71 goto quit
72 )
73 set BUILD_ENVIRONMENT=VS
74 set VS_SOLUTION=0
75 set VS_RUNTIME_CHECKS=0
76 echo Detected Visual Studio Environment !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
77 ) else (
78 echo Error: Unable to detect build environment. Configure script failure.
79 goto quit
80 )
81
82 REM Checkpoint
83 if not defined ARCH (
84 echo Unknown build architecture
85 goto quit
86 )
87
88 set USE_CLANG_CL=0
89
90 REM Parse command line parameters
91 :repeat
92 if "%BUILD_ENVIRONMENT%" == "MinGW" (
93 if /I "%1" == "Codeblocks" (
94 set CMAKE_GENERATOR="CodeBlocks - MinGW Makefiles"
95 ) else if /I "%1" == "Eclipse" (
96 set CMAKE_GENERATOR="Eclipse CDT4 - MinGW Makefiles"
97 ) else if /I "%1" == "Makefiles" (
98 set CMAKE_GENERATOR="MinGW Makefiles"
99 ) else if /I "%1" == "VSSolution" (
100 echo. && echo Error: Creation of VS Solution files is not supported in a MinGW environment.
101 echo Please run this command in a [Developer] Command Prompt for Visual Studio.
102 goto quit
103 ) else if /I "%1" == "RTC" (
104 echo. && echo Warning: RTC switch is ignored outside of a Visual Studio environment. && echo.
105 ) else if /I "%1" NEQ "" (
106 echo %1| find /I "-D" > NUL
107 if %ERRORLEVEL% == 0 (
108 REM User is passing a switch to CMake
109 REM Ignore it, and ignore the next parameter that follows
110 Shift
111 ) else (
112 echo. && echo Warning: Unrecognized switch "%1" && echo.
113 )
114 ) else (
115 goto continue
116 )
117 ) else (
118 if /I "%1" == "CodeBlocks" (
119 set CMAKE_GENERATOR="CodeBlocks - NMake Makefiles"
120 ) else if /I "%1" == "Eclipse" (
121 set CMAKE_GENERATOR="Eclipse CDT4 - NMake Makefiles"
122 ) else if /I "%1" == "Makefiles" (
123 set CMAKE_GENERATOR="NMake Makefiles"
124 ) else if /I "%1" == "clang" (
125 set USE_CLANG_CL=1
126 ) else if /I "%1" == "VSSolution" (
127 set VS_SOLUTION=1
128 REM explicitly set VS version for project generator
129 if /I "%2" == "-VS_VER" (
130 set VS_VERSION=%3
131 echo Visual Studio Environment set to !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
132 )
133 set CMAKE_GENERATOR="Visual Studio !VS_VERSION!"
134 if "!ARCH!" == "i386" (
135 set CMAKE_ARCH=-A Win32
136 ) else if "!ARCH!" == "amd64" (
137 set CMAKE_ARCH=-A x64
138 ) else if "!ARCH!" == "arm" (
139 set CMAKE_ARCH=-A ARM
140 )
141 ) else if /I "%1" == "RTC" (
142 echo Runtime checks enabled
143 set VS_RUNTIME_CHECKS=1
144 ) else if /I "%1" NEQ "" (
145 echo %1| find /I "-D" > NUL
146 if %ERRORLEVEL% == 0 (
147 REM User is passing a switch to CMake
148 REM Ignore it, and ignore the next parameter that follows
149 Shift
150 ) else (
151 echo. && echo Warning: Unrecognized switch "%1" && echo.
152 )
153 ) else (
154 goto continue
155 )
156 )
157
158 REM Go to next parameter
159 SHIFT
160 goto repeat
161 :continue
162
163 REM Inform the user about the default build
164 if "!CMAKE_GENERATOR!" == "Ninja" (
165 echo This script defaults to Ninja. Type "configure help" for alternative options.
166 )
167
168 REM Create directories
169 set REACTOS_OUTPUT_PATH=output-%BUILD_ENVIRONMENT%-%ARCH%
170
171 if "%VS_SOLUTION%" == "1" (
172 set REACTOS_OUTPUT_PATH=%REACTOS_OUTPUT_PATH%-sln
173 )
174
175 if "%REACTOS_SOURCE_DIR%" == "%CD%\" (
176 set CD_SAME_AS_SOURCE=1
177 echo Creating directories in %REACTOS_OUTPUT_PATH%
178
179 if not exist %REACTOS_OUTPUT_PATH% (
180 mkdir %REACTOS_OUTPUT_PATH%
181 )
182 cd %REACTOS_OUTPUT_PATH%
183 )
184
185 if "%VS_SOLUTION%" == "1" (
186
187 if exist build.ninja (
188 echo. && echo Error: This directory has already been configured for ninja.
189 echo An output folder configured for ninja can't be reconfigured for VSSolution.
190 echo Use an empty folder or delete the contents of this folder, then try again.
191 goto quit
192 )
193 ) else if exist REACTOS.sln (
194 echo. && echo Error: This directory has already been configured for Visual Studio.
195 echo An output folder configured for VSSolution can't be reconfigured for ninja.
196 echo Use an empty folder or delete the contents of this folder, then try again. && echo.
197 goto quit
198 )
199
200 echo Preparing reactos...
201
202 if EXIST CMakeCache.txt (
203 del CMakeCache.txt /q
204 )
205
206
207 if "%BUILD_ENVIRONMENT%" == "MinGW" (
208 cmake -G %CMAKE_GENERATOR% -DENABLE_CCACHE:BOOL=0 -DCMAKE_TOOLCHAIN_FILE:FILEPATH=%MINGW_TOOCHAIN_FILE% -DARCH:STRING=%ARCH% %BUILD_TOOLS_FLAG% %* "%REACTOS_SOURCE_DIR%"
209 ) else if %USE_CLANG_CL% == 1 (
210 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%"
211 ) else (
212 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%"
213 )
214
215 if %ERRORLEVEL% NEQ 0 (
216 goto quit
217 )
218
219 if "%CD_SAME_AS_SOURCE%" == "1" (
220 set ENDV= from %REACTOS_OUTPUT_PATH%
221 )
222
223 if "%VS_SOLUTION%" == "1" (
224 set ENDV= You can now use msbuild or open REACTOS.sln%ENDV%.
225 ) else (
226 set ENDV= Execute appropriate build commands ^(ex: ninja, make, nmake, etc...^)%ENDV%
227 )
228
229 echo. && echo Configure script complete^^!%ENDV%
230
231 goto quit
232
233 :cmake_notfound
234 echo Unable to find cmake, if it is installed, check your PATH variable.
235
236 :quit
237 endlocal
238 exit /b