dbd3c75965
The configure scripts need to translate configure options to CMake arguments. It is not sensible to implement this translation twice, in sh and Windows batch language, so we're doing this once, in CMake language. The configure scripts write their options into config.opt and call a CMake script that reads config.opt, does the translation to CMake arguments and calls CMake to generate the build system. While we're at it, implement some more translations than the sh configure provided, like -extprefix, -top-level and -skip. Fixes: QTBUG-85349 Fixes: QTBUG-85350 Task-number: QTBUG-85373 Change-Id: Ida5d8b2a3c178b9349d41ec76d190c69a9456e74 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
319 lines
8.2 KiB
Batchfile
319 lines
8.2 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
|
|
|
|
: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
|
|
|
|
: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%" == "" (
|
|
if exist "%TOPQTDIR%\config.opt" del "%TOPQTDIR%\config.opt"
|
|
for %%a in (%ARGS%) do echo %%a >> "%TOPQTDIR%\config.opt"
|
|
)
|
|
|
|
rem Launch CMake-based configure
|
|
cmake -DOPTFILE="%TOPQTDIR%\config.opt" -P "%QTSRC%\cmake\QtProcessConfigureArgs.cmake"
|