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