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