:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: 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%
