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