:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: 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=true
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=false
    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
cd "%TOPQTDIR%"

rem Write config.opt if we're not currently -redo'ing
if "%rargs%" == "" (
    cmake -DOUT_FILE=config.opt -DIGNORE_ARGS=-top-level -P "%QTSRC%\cmake\QtWriteArgsFile.cmake" %*
)

rem Launch CMake-based configure
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"
