xref: /reactos/configure.cmd (revision 0f846052)
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 Get the source root directory
22set REACTOS_SOURCE_DIR=%~dp0
23
24REM Ensure there's no spaces in the source path
25echo %REACTOS_SOURCE_DIR%| find " " > NUL
26if %ERRORLEVEL% == 0 (
27    echo. && echo   Your source path contains at least one space.
28    echo   This will cause problems with building.
29    echo   Please rename your folders so there are no spaces in the source path,
30    echo   or move your source to a different folder.
31    goto quit
32)
33
34REM Set default generator
35set CMAKE_GENERATOR="Ninja"
36set CMAKE_ARCH=
37
38REM Detect presence of cmake
39cmd /c cmake --version 2>&1 | find "cmake version" > NUL || goto cmake_notfound
40
41REM Detect build environment (MinGW, VS, WDK, ...)
42if defined ROS_ARCH (
43    echo Detected RosBE for %ROS_ARCH%
44    set BUILD_ENVIRONMENT=MinGW
45    set ARCH=%ROS_ARCH%
46    set MINGW_TOOCHAIN_FILE=toolchain-gcc.cmake
47
48) else if defined VCINSTALLDIR (
49    REM VS command prompt does not put this in environment vars
50    cl 2>&1 | find "x86" > NUL && set ARCH=i386
51    cl 2>&1 | find "x64" > NUL && set ARCH=amd64
52    cl 2>&1 | find "ARM" > NUL && set ARCH=arm
53    cl 2>&1 | find "16.00." > NUL && set VS_VERSION=10
54    cl 2>&1 | find "17.00." > NUL && set VS_VERSION=11
55    cl 2>&1 | find "18.00." > NUL && set VS_VERSION=12
56    cl 2>&1 | find "19.00." > NUL && set VS_VERSION=14
57    cl 2>&1 | find "19.10." > NUL && set VS_VERSION=15
58    cl 2>&1 | find "19.11." > NUL && set VS_VERSION=15
59    cl 2>&1 | find "19.12." > NUL && set VS_VERSION=15
60    cl 2>&1 | find "19.13." > NUL && set VS_VERSION=15
61    cl 2>&1 | find "19.14." > NUL && set VS_VERSION=15
62    cl 2>&1 | find "19.15." > NUL && set VS_VERSION=15
63    cl 2>&1 | find "19.16." > NUL && set VS_VERSION=15
64    cl 2>&1 | find "19.20." > NUL && set VS_VERSION=16
65    cl 2>&1 | find "19.21." > NUL && set VS_VERSION=16
66    cl 2>&1 | find "19.22." > NUL && set VS_VERSION=16
67    cl 2>&1 | find "19.23." > NUL && set VS_VERSION=16
68    cl 2>&1 | find "19.24." > NUL && set VS_VERSION=16
69    if not defined VS_VERSION (
70        echo Error: Visual Studio version too old ^(before 10 ^(2010^)^) or version detection failed.
71        goto quit
72    )
73    set BUILD_ENVIRONMENT=VS
74    set VS_SOLUTION=0
75    set VS_RUNTIME_CHECKS=0
76    echo Detected Visual Studio Environment !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
77) else (
78    echo Error: Unable to detect build environment. Configure script failure.
79    goto quit
80)
81
82REM Checkpoint
83if not defined ARCH (
84    echo Unknown build architecture
85    goto quit
86)
87
88set USE_CLANG_CL=0
89
90REM Parse command line parameters
91:repeat
92    if "%BUILD_ENVIRONMENT%" == "MinGW" (
93        if /I "%1" == "Codeblocks" (
94            set CMAKE_GENERATOR="CodeBlocks - MinGW Makefiles"
95        ) else if /I "%1" == "Eclipse" (
96            set CMAKE_GENERATOR="Eclipse CDT4 - MinGW Makefiles"
97        ) else if /I "%1" == "Makefiles" (
98            set CMAKE_GENERATOR="MinGW Makefiles"
99        ) else if /I "%1" == "VSSolution" (
100            echo. && echo Error: Creation of VS Solution files is not supported in a MinGW environment.
101            echo Please run this command in a [Developer] Command Prompt for Visual Studio.
102            goto quit
103        ) else if /I "%1" == "RTC" (
104            echo. && echo 	Warning: RTC switch is ignored outside of a Visual Studio environment. && echo.
105        ) else if /I "%1" NEQ "" (
106            echo %1| find /I "-D" > NUL
107            if %ERRORLEVEL% == 0 (
108                REM User is passing a switch to CMake
109                REM Ignore it, and ignore the next parameter that follows
110                Shift
111            ) else (
112                echo. && echo   Warning: Unrecognized switch "%1" && echo.
113            )
114        ) else (
115            goto continue
116        )
117    ) else (
118        if /I "%1" == "CodeBlocks" (
119            set CMAKE_GENERATOR="CodeBlocks - NMake Makefiles"
120        ) else if /I "%1" == "Eclipse" (
121            set CMAKE_GENERATOR="Eclipse CDT4 - NMake Makefiles"
122        ) else if /I "%1" == "Makefiles" (
123            set CMAKE_GENERATOR="NMake Makefiles"
124        ) else if /I "%1" == "clang" (
125            set USE_CLANG_CL=1
126        ) else if /I "%1" == "VSSolution" (
127            set VS_SOLUTION=1
128            REM explicitly set VS version for project generator
129            if /I "%2" == "-VS_VER" (
130                set VS_VERSION=%3
131                echo Visual Studio Environment set to !BUILD_ENVIRONMENT!!VS_VERSION!-!ARCH!
132            )
133            set CMAKE_GENERATOR="Visual Studio !VS_VERSION!"
134            if "!ARCH!" == "i386" (
135                set CMAKE_ARCH=-A Win32
136            ) else if "!ARCH!" == "amd64" (
137                set CMAKE_ARCH=-A x64
138            ) else if "!ARCH!" == "arm" (
139                set CMAKE_ARCH=-A ARM
140            )
141        ) else if /I "%1" == "RTC" (
142            echo Runtime checks enabled
143            set VS_RUNTIME_CHECKS=1
144        ) else if /I "%1" NEQ "" (
145            echo %1| find /I "-D" > NUL
146            if %ERRORLEVEL% == 0 (
147                REM User is passing a switch to CMake
148                REM Ignore it, and ignore the next parameter that follows
149                Shift
150            ) else (
151                echo. && echo   Warning: Unrecognized switch "%1" && echo.
152            )
153        ) else (
154            goto continue
155        )
156    )
157
158    REM Go to next parameter
159    SHIFT
160    goto repeat
161:continue
162
163REM Inform the user about the default build
164if "!CMAKE_GENERATOR!" == "Ninja" (
165    echo This script defaults to Ninja. Type "configure help" for alternative options.
166)
167
168REM Create directories
169set REACTOS_OUTPUT_PATH=output-%BUILD_ENVIRONMENT%-%ARCH%
170
171if "%VS_SOLUTION%" == "1" (
172    set REACTOS_OUTPUT_PATH=%REACTOS_OUTPUT_PATH%-sln
173)
174
175if "%REACTOS_SOURCE_DIR%" == "%CD%\" (
176    set CD_SAME_AS_SOURCE=1
177    echo Creating directories in %REACTOS_OUTPUT_PATH%
178
179    if not exist %REACTOS_OUTPUT_PATH% (
180        mkdir %REACTOS_OUTPUT_PATH%
181    )
182    cd %REACTOS_OUTPUT_PATH%
183)
184
185if "%VS_SOLUTION%" == "1" (
186
187    if exist build.ninja (
188        echo. && echo Error: This directory has already been configured for ninja.
189        echo An output folder configured for ninja can't be reconfigured for VSSolution.
190        echo Use an empty folder or delete the contents of this folder, then try again.
191        goto quit
192    )
193) else if exist REACTOS.sln (
194    echo. && echo Error: This directory has already been configured for Visual Studio.
195    echo An output folder configured for VSSolution can't be reconfigured for ninja.
196    echo Use an empty folder or delete the contents of this folder, then try again. && echo.
197    goto quit
198)
199
200echo Preparing reactos...
201
202if EXIST CMakeCache.txt (
203    del CMakeCache.txt /q
204)
205
206
207if "%BUILD_ENVIRONMENT%" == "MinGW" (
208    cmake -G %CMAKE_GENERATOR% -DENABLE_CCACHE:BOOL=0 -DCMAKE_TOOLCHAIN_FILE:FILEPATH=%MINGW_TOOCHAIN_FILE% -DARCH:STRING=%ARCH% %BUILD_TOOLS_FLAG% %* "%REACTOS_SOURCE_DIR%"
209) else if %USE_CLANG_CL% == 1 (
210        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%"
211) else (
212    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%"
213)
214
215if %ERRORLEVEL% NEQ 0 (
216    goto quit
217)
218
219if "%CD_SAME_AS_SOURCE%" == "1" (
220    set ENDV= from %REACTOS_OUTPUT_PATH%
221)
222
223if "%VS_SOLUTION%" == "1" (
224    set ENDV= You can now use msbuild or open REACTOS.sln%ENDV%.
225) else (
226    set ENDV= Execute appropriate build commands ^(ex: ninja, make, nmake, etc...^)%ENDV%
227)
228
229echo. && echo Configure script complete^^!%ENDV%
230
231goto quit
232
233:cmake_notfound
234echo Unable to find cmake, if it is installed, check your PATH variable.
235
236:quit
237endlocal
238exit /b
239