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