summaryrefslogtreecommitdiff
path: root/configure.bat
blob: b34e146f5fdac3dd9c6944ada7f97673ae66ce82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: Copyright (C) 2016 The Qt Company Ltd.
:: Copyright (C) 2016 Intel Corporation.
:: Contact: https://www.qt.io/licensing/
::
:: This file is part of the tools applications of the Qt Toolkit.
::
:: $QT_BEGIN_LICENSE:GPL-EXCEPT$
:: Commercial License Usage
:: Licensees holding valid commercial Qt licenses may use this file in
:: accordance with the commercial license agreement provided with the
:: Software or, alternatively, in accordance with the terms contained in
:: a written agreement between you and The Qt Company. For licensing terms
:: and conditions see https://www.qt.io/terms-conditions. For further
:: information use the contact form at https://www.qt.io/contact-us.
::
:: GNU General Public License Usage
:: Alternatively, this file may be used under the terms of the GNU
:: General Public License version 3 as published by the Free Software
:: Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
:: included in the packaging of this file. Please review the following
:: information to ensure the GNU General Public License requirements will
:: be met: https://www.gnu.org/licenses/gpl-3.0.html.
::
:: $QT_END_LICENSE$
::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@echo off
setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
set ARGS=%*
set QTSRC=%~dp0
set QTSRC=%QTSRC:~0,-1%
set QTDIR=%CD%

rem Make sure qmake is not confused by these. Recursion via Makefiles would
rem be still affected, so just unsetting them here is not an option.
if not "%QMAKESPEC%" == "" goto envfail
if not "%XQMAKESPEC%" == "" goto envfail
if not "%QMAKEPATH%" == "" goto envfail
if not "%QMAKEFEATURES%" == "" goto envfail
goto envok
:envfail
echo >&2 Please make sure to unset the QMAKESPEC, XQMAKESPEC, QMAKEPATH,
echo >&2 and QMAKEFEATURES environment variables prior to building Qt.
exit /b 1
:envok

rem Parse command line

set TOPLEVEL=false
set TOPQTSRC=%QTSRC%
set TOPQTDIR=%QTDIR%
if /i not "%~1" == "-top-level" goto notoplevel
set ARGS=%ARGS:~10%
set TOPLEVEL=true
for %%P in ("%TOPQTSRC%") do set TOPQTSRC=%%~dpP
set TOPQTSRC=%TOPQTSRC:~0,-1%
for %%P in ("%QTDIR%") do set TOPQTDIR=%%~dpP
set TOPQTDIR=%TOPQTDIR:~0,-1%
goto wastoplevel
:notoplevel
if not exist ..\.qmake.super goto wastoplevel
echo ERROR: You cannot configure qtbase separately within a top-level build. >&2
exit /b 1
:wastoplevel

set SYNCQT=
set PLATFORM=
set MAKE=
call :doargs %ARGS%
if errorlevel 1 exit /b
goto doneargs

:doargs
    if "%~1" == "" exit /b

    if "%~1" == "/?" goto help
    if "%~1" == "-?" goto help
    if /i "%~1" == "/h" goto help
    if /i "%~1" == "-h" goto help
    if /i "%~1" == "/help" goto help
    if /i "%~1" == "-help" goto help
    if /i "%~1" == "--help" goto help

    if /i "%~1" == "-redo" goto redo
    if /i "%~1" == "--redo" goto redo

    if /i "%~1" == "-platform" goto platform
    if /i "%~1" == "--platform" goto platform

    if /i "%~1" == "-no-syncqt" goto nosyncqt
    if /i "%~1" == "--no-syncqt" goto nosyncqt

    if /i "%~1" == "-make-tool" goto maketool
    if /i "%~1" == "--make-tool" goto maketool

:nextarg
    shift
    goto doargs

:help
    type %QTSRC%\config_help.txt
    if %TOPLEVEL% == false exit /b 1
    for /d %%p in ("%TOPQTSRC%"\qt*) do (
        if not "%%p" == "%QTSRC%" (
            if exist "%%p\config_help.txt" (
                echo.
                type "%%p\config_help.txt"
            )
        )
    )
    exit /b 1

:redo
    if not exist "%TOPQTDIR%\config.opt" goto redoerr
    set rargs=
    for /f "usebackq delims=" %%i in ("%TOPQTDIR%\config.opt") do set rargs=!rargs! "%%i"
    call :doargs %rargs%
    goto nextarg
:redoerr
    echo No config.opt present - cannot redo configuration. >&2
    exit /b 1

:platform
    shift
    set PLATFORM=%~1
    if "%PLATFORM:~0,10%" == "win32-msvc" goto msvc
    goto nextarg
:msvc
    echo. >&2
    echo Notice: re-mapping requested qmake spec to unified 'win32-msvc'. >&2
    echo. >&2
    set PLATFORM=win32-msvc
    goto nextarg

:nosyncqt
    set SYNCQT=false
    goto nextarg

:maketool
    shift
    set MAKE=%~1
    goto nextarg

:doneargs

rem Find various executables
for %%C in (clang-cl.exe clang.exe cl.exe icl.exe g++.exe perl.exe jom.exe) do set %%C=%%~$PATH:C

rem Determine host spec

if "%PLATFORM%" == "" (
    if not "%icl.exe%" == "" (
        set PLATFORM=win32-icc
    ) else if not "%cl.exe%" == "" (
        set PLATFORM=win32-msvc
    ) else if not "%clang-cl.exe%" == "" (
        set PLATFORM=win32-clang-msvc
    ) else if not "%clang.exe%" == "" (
        set PLATFORM=win32-clang-g++
    ) else if not "%g++.exe%" == "" (
        set PLATFORM=win32-g++
    ) else (
        echo Cannot detect host toolchain. Please use -platform. Aborting. >&2
        exit /b 1
    )
)
if not exist "%QTSRC%\mkspecs\%PLATFORM%\qmake.conf" (
    echo Host platform '%PLATFORM%' is invalid. Aborting. >&2
    exit /b 1
)
if "%PLATFORM:g++=%" == "%PLATFORM%" (
    if "%MAKE%" == "" (
        if not "%jom.exe%" == "" (
            set MAKE=jom
        ) else (
            set MAKE=nmake
        )
    )
    set tmpl=win32
) else (
    if "%MAKE%" == "" (
        set MAKE=mingw32-make
    )
    set tmpl=unix
)

rem Prepare build dir

if not exist mkspecs (
    md mkspecs
    if errorlevel 1 exit /b
)
if not exist bin (
    md bin
    if errorlevel 1 exit /b
)
if not exist qmake (
    md qmake
    if errorlevel 1 exit /b
)

rem Extract Qt's version from .qmake.conf
for /f "eol=# tokens=1,2,3,4 delims=.= " %%i in (%QTSRC%\.qmake.conf) do (
    if %%i == MODULE_VERSION (
        set QTVERMAJ=%%j
        set QTVERMIN=%%k
        set QTVERPAT=%%l
    )
)
set QTVERSION=%QTVERMAJ%.%QTVERMIN%.%QTVERPAT%

rem Create forwarding headers

if "%SYNCQT%" == "" (
    if exist "%QTSRC%\.git" (
        set SYNCQT=true
    ) else (
        set SYNCQT=false
    )
)
if "%SYNCQT%" == "true" (
    if not "%perl.exe%" == "" (
        echo Running syncqt ...
        "%perl.exe%" -w "%QTSRC%\bin\syncqt.pl" -minimal -version %QTVERSION% -module QtCore -outdir "%QTDIR%" %QTSRC%
        if errorlevel 1 exit /b
    ) else (
        echo Perl not found in PATH. Aborting. >&2
        exit /b 1
    )
)

rem Build qmake

echo Bootstrapping qmake ...

cd qmake
if errorlevel 1 exit /b

echo #### Generated by configure.bat - DO NOT EDIT! ####> Makefile
echo/>> Makefile
echo BUILD_PATH = ..>> Makefile
if "%tmpl%" == "win32" (
    echo SOURCE_PATH = %QTSRC%>> Makefile
) else (
    echo SOURCE_PATH = %QTSRC:\=/%>> Makefile
)
if exist "%QTSRC%\.git" (
    echo INC_PATH = ../include>> Makefile
) else (
    echo INC_PATH = $^(SOURCE_PATH^)/include>> Makefile
)
echo QT_VERSION = %QTVERSION%>> Makefile
rem These must have trailing spaces to avoid misinterpretation as 5>>, etc.
echo QT_MAJOR_VERSION = %QTVERMAJ% >> Makefile
echo QT_MINOR_VERSION = %QTVERMIN% >> Makefile
echo QT_PATCH_VERSION = %QTVERPAT% >> Makefile
if "%tmpl%" == "win32" (
    echo QMAKESPEC = %PLATFORM%>> Makefile
) else (
    echo QMAKESPEC = $^(SOURCE_PATH^)/mkspecs/%PLATFORM%>> Makefile
    echo CONFIG_CXXFLAGS = -std=c++11 -ffunction-sections>> Makefile
    echo CONFIG_LFLAGS = -Wl,--gc-sections>> Makefile
    type "%QTSRC%\qmake\Makefile.unix.win32" >> Makefile
    type "%QTSRC%\qmake\Makefile.unix.mingw" >> Makefile
)
echo/>> Makefile
type "%QTSRC%\qmake\Makefile.%tmpl%" >> Makefile

%MAKE%
if errorlevel 1 (cd .. & exit /b 1)

cd ..

rem Generate qt.conf

> "%QTDIR%\bin\qt.conf" (
    @echo [EffectivePaths]
    @echo Prefix=..
    @echo [Paths]
    @echo TargetSpec=dummy
    @echo HostSpec=%PLATFORM%
)
if not "%QTDIR%" == "%QTSRC%" (
    >> "%QTDIR%\bin\qt.conf" (
        @echo [EffectiveSourcePaths]
        @echo Prefix=%QTSRC:\=/%
    )
)

rem Launch qmake-based configure

cd "%TOPQTDIR%"
"%QTDIR%\bin\qmake.exe" "%TOPQTSRC%" -- %ARGS%