[NTDLL] Use the embedded manifest from the process to check compatibility.
[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 if not defined VS_VERSION (
68 echo Error: Visual Studio version too old ^(before 10 ^(2010^)^) or version detection failed.
69 goto quit
70 )
71 set BUILD_ENVIRONMENT=VS
72 set VS_SOLUTION=0
73 set VS_RUNTIME_CHECKS=0
74 echo Detected Visual Studio Environment !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
75 ) else (
76 echo Error: Unable to detect build environment. Configure script failure.
77 goto quit
78 )
79
80 REM Checkpoint
81 if not defined ARCH (
82 echo Unknown build architecture
83 goto quit
84 )
85
86 set USE_CLANG_CL=0
87
88 REM Parse command line parameters
89 :repeat
90 if "%BUILD_ENVIRONMENT%" == "MinGW" (
91 if /I "%1" == "Codeblocks" (
92 set CMAKE_GENERATOR="CodeBlocks - MinGW Makefiles"
93 ) else if /I "%1" == "Eclipse" (
94 set CMAKE_GENERATOR="Eclipse CDT4 - MinGW Makefiles"
95 ) else if /I "%1" == "Makefiles" (
96 set CMAKE_GENERATOR="MinGW Makefiles"
97 ) else if /I "%1" == "VSSolution" (
98 echo. && echo Error: Creation of VS Solution files is not supported in a MinGW environment.
99 echo Please run this command in a [Developer] Command Prompt for Visual Studio.
100 goto quit
101 ) else if /I "%1" == "RTC" (
102 echo. && echo Warning: RTC switch is ignored outside of a Visual Studio environment. && echo.
103 ) else if /I "%1" NEQ "" (
104 echo %1| find /I "-D" > NUL
105 if %ERRORLEVEL% == 0 (
106 REM User is passing a switch to CMake
107 REM Ignore it, and ignore the next parameter that follows
108 Shift
109 ) else (
110 echo. && echo Warning: Unrecognized switch "%1" && echo.
111 )
112 ) else (
113 goto continue
114 )
115 ) else (
116 if /I "%1" == "CodeBlocks" (
117 set CMAKE_GENERATOR="CodeBlocks - NMake Makefiles"
118 ) else if /I "%1" == "Eclipse" (
119 set CMAKE_GENERATOR="Eclipse CDT4 - NMake Makefiles"
120 ) else if /I "%1" == "Makefiles" (
121 set CMAKE_GENERATOR="NMake Makefiles"
122 ) else if /I "%1" == "clang" (
123 set USE_CLANG_CL=1
124 ) else if /I "%1" == "VSSolution" (
125 set VS_SOLUTION=1
126 REM explicitly set VS version for project generator
127 if /I "%2" == "-VS_VER" (
128 set VS_VERSION=%3
129 echo Visual Studio Environment set to !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
130 )
131 set CMAKE_GENERATOR="Visual Studio !VS_VERSION!"
132 if "!ARCH!" == "i386" (
133 set CMAKE_ARCH=-A Win32
134 ) else if "!ARCH!" == "amd64" (
135 set CMAKE_ARCH=-A x64
136 ) else if "!ARCH!" == "arm" (
137 set CMAKE_ARCH=-A ARM
138 )
139 ) else if /I "%1" == "RTC" (
140 echo Runtime checks enabled
141 set VS_RUNTIME_CHECKS=1
142 ) else if /I "%1" NEQ "" (
143 echo %1| find /I "-D" > NUL
144 if %ERRORLEVEL% == 0 (
145 REM User is passing a switch to CMake
146 REM Ignore it, and ignore the next parameter that follows
147 Shift
148 ) else (
149 echo. && echo Warning: Unrecognized switch "%1" && echo.
150 )
151 ) else (
152 goto continue
153 )
154 )
155
156 REM Go to next parameter
157 SHIFT
158 goto repeat
159 :continue
160
161 REM Inform the user about the default build
162 if "!CMAKE_GENERATOR!" == "Ninja" (
163 echo This script defaults to Ninja. Type "configure help" for alternative options.
164 )
165
166 REM Create directories
167 set REACTOS_OUTPUT_PATH=output-%BUILD_ENVIRONMENT%-%ARCH%
168
169 if "%VS_SOLUTION%" == "1" (
170 set REACTOS_OUTPUT_PATH=%REACTOS_OUTPUT_PATH%-sln
171 )
172
173 if "%REACTOS_SOURCE_DIR%" == "%CD%\" (
174 set CD_SAME_AS_SOURCE=1
175 echo Creating directories in %REACTOS_OUTPUT_PATH%
176
177 if not exist %REACTOS_OUTPUT_PATH% (
178 mkdir %REACTOS_OUTPUT_PATH%
179 )
180 cd %REACTOS_OUTPUT_PATH%
181 )
182
183 if "%VS_SOLUTION%" == "1" (
184
185 if exist build.ninja (
186 echo. && echo Error: This directory has already been configured for ninja.
187 echo An output folder configured for ninja can't be reconfigured for VSSolution.
188 echo Use an empty folder or delete the contents of this folder, then try again.
189 goto quit
190 )
191 ) else if exist REACTOS.sln (
192 echo. && echo Error: This directory has already been configured for Visual Studio.
193 echo An output folder configured for VSSolution can't be reconfigured for ninja.
194 echo Use an empty folder or delete the contents of this folder, then try again. && echo.
195 goto quit
196 )
197
198 echo Preparing reactos...
199
200 if EXIST CMakeCache.txt (
201 del CMakeCache.txt /q
202 )
203
204
205 if "%BUILD_ENVIRONMENT%" == "MinGW" (
206 cmake -G %CMAKE_GENERATOR% -DENABLE_CCACHE:BOOL=0 -DCMAKE_TOOLCHAIN_FILE:FILEPATH=%MINGW_TOOCHAIN_FILE% -DARCH:STRING=%ARCH% %BUILD_TOOLS_FLAG% %* "%REACTOS_SOURCE_DIR%"
207 ) else if %USE_CLANG_CL% == 1 (
208 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%"
209 ) else (
210 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%"
211 )
212
213 if %ERRORLEVEL% NEQ 0 (
214 goto quit
215 )
216
217 if "%CD_SAME_AS_SOURCE%" == "1" (
218 set ENDV= from %REACTOS_OUTPUT_PATH%
219 )
220
221 if "%VS_SOLUTION%" == "1" (
222 set ENDV= You can now use msbuild or open REACTOS.sln%ENDV%.
223 ) else (
224 set ENDV= Execute appropriate build commands ^(ex: ninja, make, nmake, etc...^)%ENDV%
225 )
226
227 echo. && echo Configure script complete^^!%ENDV%
228
229 goto quit
230
231 :cmake_notfound
232 echo Unable to find cmake, if it is installed, check your PATH variable.
233
234 :quit
235 endlocal
236 exit /b