2a29426e39
Passing arguments with equal signs was broken for configure.bat and qt-configure-module.bat. An argument FOO=BAR was split at = and written as FOO BAR to config.opt, breaking every attempt of assigning CMake variables. We must not iterate over %* in batch files to avoid splitting arguments at equal signs. Instead, pass %* unmodified to a CMake script that writes config.opt. Fixes: QTBUG-88019 Change-Id: I7c743a206961d1ed168f2313f864905f6b345b49 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
328 lines
8.4 KiB
Batchfile
328 lines
8.4 KiB
Batchfile
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
::
|
|
:: 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=
|
|
set CMAKE=
|
|
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
|
|
|
|
if /i "%~1" == "-cmake" goto cmake
|
|
if /i "%~1" == "--cmake" goto cmake
|
|
|
|
if /i "%~1" == "-qmake" goto qmake
|
|
if /i "%~1" == "--qmake" goto qmake
|
|
|
|
: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
|
|
|
|
:cmake
|
|
set CMAKE=true
|
|
goto nextarg
|
|
|
|
:qmake
|
|
set CMAKE=
|
|
goto nextarg
|
|
|
|
:doneargs
|
|
|
|
if "%CMAKE%" == "true" goto cmake
|
|
|
|
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++17 -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%
|
|
goto :eof
|
|
|
|
:cmake
|
|
|
|
rem Write config.opt if we're not currently -redo'ing
|
|
if "%rargs%" == "" (
|
|
cmake -DOUT_FILE=config.opt -P "%QTSRC%\cmake\QtWriteArgsFile.cmake" %*
|
|
)
|
|
|
|
rem Launch CMake-based configure
|
|
cd "%TOPQTDIR%"
|
|
set TOP_LEVEL_ARG=
|
|
if %TOPLEVEL% == true set TOP_LEVEL_ARG=-DTOP_LEVEL=TRUE
|
|
cmake -DOPTFILE=config.opt %TOP_LEVEL_ARG% -P "%QTSRC%\cmake\QtProcessConfigureArgs.cmake"
|