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
10 REM Does the user need help?
11 if /I "%1" == "help" goto 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
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
25 REM This launches %VSINSTALLDIR%VS\vcvarsall.bat
28 REM Configure host tools for x86.
29 cmake -G %3 -A Win32 -DARCH:STRING=i386 %~dp0
33 REM Get the source root directory
34 set REACTOS_SOURCE_DIR=%~dp0
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.
46 REM Set default generator
47 set CMAKE_GENERATOR="Ninja"
50 REM Detect presence of cmake
51 cmd /c cmake --version 2>&1 | find "cmake version" > NUL || goto cmake_notfound
53 REM Detect build environment (MinGW, VS, WDK, ...)
55 echo Detected RosBE for %ROS_ARCH%
56 set BUILD_ENVIRONMENT=MinGW
58 set MINGW_TOOCHAIN_FILE=toolchain-gcc.cmake
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.
80 set BUILD_ENVIRONMENT=VS
82 set VS_RUNTIME_CHECKS=0
83 echo Detected Visual Studio Environment !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
85 echo Error: Unable to detect build environment. Configure script failure.
91 echo Unknown build architecture
98 REM Parse command line parameters
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.
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
122 echo. && echo Warning: Unrecognized switch "%1" && echo.
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" (
136 ) else if /I "%1" == "VSSolution" (
138 REM explicitly set VS version for project generator
139 if /I "%2" == "-VS_VER" (
141 echo Visual Studio Environment set to !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
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
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
161 echo. && echo Warning: Unrecognized switch "%1" && echo.
168 REM Go to next parameter
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.
178 REM Create directories
179 set REACTOS_OUTPUT_PATH=output-%BUILD_ENVIRONMENT%-%ARCH%
181 if "%VS_SOLUTION%" == "1" (
182 set REACTOS_OUTPUT_PATH=%REACTOS_OUTPUT_PATH%-sln
185 if "%REACTOS_SOURCE_DIR%" == "%CD%\" (
186 set CD_SAME_AS_SOURCE=1
187 echo Creating directories in %REACTOS_OUTPUT_PATH%
189 if not exist %REACTOS_OUTPUT_PATH% (
190 mkdir %REACTOS_OUTPUT_PATH%
192 cd %REACTOS_OUTPUT_PATH%
195 if "%VS_SOLUTION%" == "1" (
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.
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.
210 if "%NEW_STYLE_BUILD%"=="0" (
212 if not exist host-tools (
216 if not exist reactos (
220 echo Preparing host tools...
222 if EXIST CMakeCache.txt (
223 del CMakeCache.txt /q
226 set REACTOS_BUILD_TOOLS_DIR=!CD!
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%
233 cmake -G %CMAKE_GENERATOR% %CMAKE_ARCH% -DARCH:STRING=%ARCH% "%REACTOS_SOURCE_DIR%"
240 echo Preparing reactos...
242 if "%NEW_STYLE_BUILD%"=="0" (
246 if EXIST CMakeCache.txt (
247 del CMakeCache.txt /q
248 del host-tools\CMakeCache.txt /q
251 if "%NEW_STYLE_BUILD%"=="0" (
252 set BUILD_TOOLS_FLAG=-DREACTOS_BUILD_TOOLS_DIR:PATH="%REACTOS_BUILD_TOOLS_DIR%"
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%"
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%"
263 if "%NEW_STYLE_BUILD%"=="0" (
267 if %ERRORLEVEL% NEQ 0 (
271 if "%CD_SAME_AS_SOURCE%" == "1" (
272 set ENDV= from %REACTOS_OUTPUT_PATH%
275 if "%VS_SOLUTION%" == "1" (
276 set ENDV= You can now use msbuild or open REACTOS.sln%ENDV%.
278 set ENDV= Execute appropriate build commands ^(ex: ninja, make, nmake, etc...^)%ENDV%
281 echo. && echo Configure script complete^^!%ENDV%
286 echo Unable to find cmake, if it is installed, check your PATH variable.