#
#  W A R N I N G
#  -------------
#
# This file is not part of the Qt API.  It exists purely as an
# implementation detail.  It may change from version to version
# without notice, or even be removed.
#
# We mean it.
#

load(qt_build_paths)

!build_pass:git_build {
    qtPrepareTool(QMAKE_SYNCQT, syncqt, , system)
    minimal_syncqt {
        QMAKE_SYNCQT += -minimal $$QMAKE_SYNCQT_OPTIONS
    } else {
        qtConfig(private_tests): \   # -developer-build
            QMAKE_SYNCQT += -check-includes
    }
    for(mod, MODULE_INCNAME): \
        QMAKE_SYNCQT += -module $$mod
    QMAKE_SYNCQT += \
        -version $$VERSION -outdir $$system_quote($$MODULE_BASE_OUTDIR) \
        -builddir $$system_quote($$REAL_MODULE_BASE_OUTDIR) $$MODULE_SYNCQT_DIR
    !silent: message($$QMAKE_SYNCQT)
    system($$QMAKE_SYNCQT)|error("Failed to run: $$QMAKE_SYNCQT")

    !minimal_syncqt {
        include-distclean.commands = \
            $$QMAKE_DEL_TREE $$shell_quote($$shell_path($$MODULE_BASE_OUTDIR/include/$$MODULE_INCNAME))
        QMAKE_EXTRA_TARGETS += include-distclean
        DISTCLEAN_DEPS += include-distclean
    }
}

# Pre-generated headers in the source tree (tar-ball) and
# - shadow build or
# - non-shadow non-prefix build of a module which is not qtbase
#   (because the build-time generated headers all end up in qtbase).
!git_build: \
        if(!equals(_PRO_FILE_PWD_, $$OUT_PWD) \
           |if(!prefix_build:!equals(MODULE_BASE_INDIR, $$[QT_HOST_PREFIX]))): \
    CONFIG += split_incpath

# To avoid stuffing the code with repetetive conditionals,
# we parametrize the names of the variables we assign to.

# Internal modules have no private part - they *are* private.
!internal_module: \
    prv = _PRIVATE

# When doing a framework build with a prefix, the module needs to point
# into the frameworks' Headers dirs directly, as no shared include/ dir
# is installed.
# However, during the build, it needs to point into the shared include/
# dir, as the framework doesn't even exist yet. For bootstrapped modules
# which borrow headers from "proper" modules, this situation persists
# even beyond the module's own build. The implication of this is that
# qmake might never use a framework's headers in a non-prefix build,
# as there is no separate set of .pri files for users outside Qt.
# Borrowing is assumed to happen from modules which, in a framework build,
# actually are frameworks.
prefix_build:module_frameworks: \
    fwd = _FWD
# When using a split include path during the build, the installed module's
# include path is also structurally different from that in the build dir.
prefix_build:split_incpath: \
    sfwd = _FWD

ibase = \$\$QT_MODULE_INCLUDE_BASE
MODULE$${fwd}_INCLUDES = $$ibase
split_incpath {
    bibase = $$val_escape(MODULE_BASE_OUTDIR)/include
    MODULE$${sfwd}_INCLUDES += $$bibase
}
for(mod, MODULE_INCNAME) {
    mibase = $$ibase/$$mod
    MODULE$${fwd}_INCLUDES += $$mibase
    MODULE$${fwd}$${prv}_INCLUDES += $$mibase/$$VERSION $$mibase/$$VERSION/$$mod
    split_incpath {
        mbibase = $$bibase/$$mod
        MODULE$${sfwd}_INCLUDES += $$mbibase
        generated_privates: \
            MODULE$${sfwd}$${prv}_INCLUDES += $$mbibase/$$VERSION $$mbibase/$$VERSION/$$mod
    }
    prefix_build:module_frameworks {
        mfbase = \$\$QT_MODULE_LIB_BASE/$${mod}$${QT_LIBINFIX}.framework/Headers
        MODULE_INCLUDES += $$mfbase
        MODULE$${prv}_INCLUDES += $$mfbase/$$VERSION $$mfbase/$$VERSION/$$mod
    }
}
MODULE_INCLUDES += $$MODULE_AUX_INCLUDES
MODULE_PRIVATE_INCLUDES += $$MODULE_PRIVATE_AUX_INCLUDES

minimal_syncqt: return()

defineTest(syncQtResolve) {
    out =
    for (f, SYNCQT.$$1): \
        out += $$absolute_path($$f, $$2)
    SYNCQT.$$1 = $$out
    export(SYNCQT.$$1)
}

#load up the headers info
git_build: \
    INC_PATH = $$MODULE_BASE_OUTDIR
else: \
    INC_PATH = $$MODULE_BASE_INDIR
include($$INC_PATH/include/$$MODULE_INCNAME/headers.pri, "", true)
syncQtResolve(HEADER_FILES, $$_PRO_FILE_PWD_)
syncQtResolve(PRIVATE_HEADER_FILES, $$_PRO_FILE_PWD_)
syncQtResolve(QPA_HEADER_FILES, $$_PRO_FILE_PWD_)
syncQtResolve(GENERATED_HEADER_FILES, $$INC_PATH/include/$$MODULE_INCNAME)
!lib_bundle: \  # Headers are embedded into the bundle, so don't install them separately.
    CONFIG += qt_install_headers

alien_syncqt: return()

MODULE_INC_OUTDIR = $$MODULE_BASE_OUTDIR/include/$$MODULE_INCNAME

isEmpty(MODULE_CFG_FILE): MODULE_CFG_FILE = qt$${MODULE}-config
exists($$OUT_PWD/$${MODULE_CFG_FILE}.h) {
    fwd_rel = $$relative_path($$OUT_PWD, $$REAL_MODULE_BASE_OUTDIR)
    SYNCQT.INJECTIONS += \
        $$fwd_rel/$${MODULE_CFG_FILE}.h:$${MODULE_CFG_FILE}.h \
        $$fwd_rel/$${MODULE_CFG_FILE}_p.h:$$MODULE_VERSION/$$MODULE_INCNAME/private/$${MODULE_CFG_FILE}_p.h
}

for (injection, SYNCQT.INJECTIONS) {
    injects = $$split(injection, :)
    dst_hdr = $$absolute_path($$member(injects, 0), $$REAL_MODULE_BASE_OUTDIR)
    ofwd_hdr = $$member(injects, 1)
    fwd_hdr = $$replace(ofwd_hdr, ^\\^, )
    MAIN_FWD = $$MODULE_INC_OUTDIR/$$fwd_hdr
    MAIN_FWD_CONT = '$${LITERAL_HASH}include "$$relative_path($$dst_hdr, $$dirname(MAIN_FWD))"'
    write_file($$MAIN_FWD, MAIN_FWD_CONT)|error()
    equals(fwd_hdr, ofwd_hdr): touch($$MAIN_FWD, $$dst_hdr)
    !git_build: QMAKE_DISTCLEAN += $$MAIN_FWD
    !contains(ofwd_hdr, .*/private/.*): \
        SYNCQT.INJECTED_HEADER_FILES += $$dst_hdr
    else: \
        SYNCQT.INJECTED_PRIVATE_HEADER_FILES += $$dst_hdr
    injects = $$member(injects, 2, -1)
    for (inject, injects) {
        CLASS_FWD = $$MODULE_INC_OUTDIR/$$inject
        CLASS_FWD_CONT = '$${LITERAL_HASH}include "$$fwd_hdr"'
        write_file($$CLASS_FWD, CLASS_FWD_CONT)|error()
        touch($$CLASS_FWD, $$MAIN_FWD)
        !git_build: QMAKE_DISTCLEAN += $$CLASS_FWD
        SYNCQT.INJECTED_HEADER_FILES += $$CLASS_FWD
    }
}

autogen_warning = \
    "/* This file was generated by qmake with the info from <root>/$$relative_path($$_PRO_FILE_, $$MODULE_BASE_INDIR). */"

# Create a module master depends header
MODULE_MASTER_DEPS_HEADER = $$MODULE_BASE_OUTDIR/include/$$MODULE_INCNAME/$${MODULE_INCNAME}Depends
!build_pass {
    MODULE_MASTER_DEPS_HEADER_CONT = $$autogen_warning
    MODULE_MASTER_DEPS_HEADER_CONT += "$${LITERAL_HASH}ifdef __cplusplus /* create empty PCH in C mode */"
    for(dep, MODULE_DEPENDS) {
        depname = $$eval(QT.$${dep}.master_header)
        isEmpty(depname): \
            depname = $$eval(QT.$${dep}.name)
        MODULE_MASTER_DEPS_HEADER_CONT += "$${LITERAL_HASH}include <$$depname/$$depname>"
    }
    MODULE_MASTER_DEPS_HEADER_CONT += "$${LITERAL_HASH}endif"
    write_file($$MODULE_MASTER_DEPS_HEADER, MODULE_MASTER_DEPS_HEADER_CONT)|error()
    !git_build: QMAKE_DISTCLEAN += $$MODULE_MASTER_DEPS_HEADER
}
SYNCQT.HEADER_FILES += $$MODULE_MASTER_DEPS_HEADER

# Automatically enable precompiled headers for Qt modules with more than 2 sources
combined_SOURCES = $$SOURCES $$OBJECTIVE_SOURCES
count(combined_SOURCES, 2, >) {
    # except for Gcc/Windows: Larger precompiled headers crash cc1plus.exe
    # (e.g. with i686-4.8.2-release-posix-dwarf-rt_v3-rev3)
    !if(gcc:equals(QMAKE_HOST.os, Windows)):!equals(TEMPLATE, aux) {
        !defined(PRECOMPILED_HEADER, "var"): PRECOMPILED_HEADER = $$MODULE_MASTER_DEPS_HEADER
    }
} else {
    CONFIG -= precompile_header
}
unset(combined_SOURCES)

headersclean:!internal_module {
    # Make sure that the header compiles with our strict options
    hcleanDEFS = -DQT_NO_CAST_TO_ASCII=1 \
                 -DQT_NO_CAST_FROM_ASCII=1 \
                 -UQT_RESTRICTED_CAST_FROM_ASCII \
                 -DQT_STRICT_ITERATORS \
                 -DQT_NO_URL_CAST_FROM_STRING=1 \
                 -DQT_NO_CAST_FROM_BYTEARRAY=1 \
                 -DQT_NO_KEYWORDS=1 \
                 -DQT_USE_QSTRINGBUILDER \
                 -DQT_USE_FAST_OPERATOR_PLUS \
                 -Dsignals=int \
                 -Dslots=int \
                 -Demit=public: \
                 -Dforeach=public: \
                 -Dforever=public:

    gcc:!rim_qcc {
        # Turn on some extra warnings not found in -Wall -Wextra.
        # Common to GCC, Clang and ICC (and other compilers that masquerade as GCC):
        hcleanFLAGS = -Wall -Wextra -Werror \
                      -Woverloaded-virtual -Wshadow -Wundef -Wfloat-equal \
                      -Wnon-virtual-dtor -Wpointer-arith -Wformat-security \
                      -Wno-long-long -Wno-variadic-macros -pedantic-errors

        intel_icc {
            # these warnings are disabled because explicit constructors with zero or
            # multiple arguments are permitted in C++11:
            # 2304: non-explicit constructor with single argument may cause implicit type conversion
            # 2305: declaration of 'explicit' constructor without a single argument is redundant
            hcleanFLAGS += -wd2304,2305
            greaterThan(QT_ICC_MAJOR_VERSION, 13) {
                # ICC 14+ has a bug with -Wshadow, emitting it for cases where there's no shadowing
                # (issue ID 0000698329, task DPD200245740)
                hcleanFLAGS -= -Wshadow
            }
        } else {
            # options accepted by GCC and Clang
            hcleanFLAGS += -Wchar-subscripts -Wold-style-cast

            !contains(QT_ARCH, arm):!contains(QT_ARCH, mips): \
                hcleanFLAGS += -Wcast-align

            clang_ver = $${QT_CLANG_MAJOR_VERSION}.$${QT_CLANG_MINOR_VERSION}
            versionAtLeast(clang_ver, 3.8): hcleanFLAGS += -Wdouble-promotion

            !clang {
                # options accepted only by GCC

                gcc_ver = $${QT_GCC_MAJOR_VERSION}.$${QT_GCC_MINOR_VERSION}
                versionAtLeast(gcc_ver, 4.5): hcleanFLAGS += -Wdouble-promotion
                versionAtLeast(gcc_ver, 4.9): hcleanFLAGS += -Wfloat-conversion
                # GCC 9 has a lot of false positives relating to this, so disable completely
                greaterThan(QT_GCC_MAJOR_VERSION, 8): hcleanFLAGS += -Wno-deprecated-copy
                # GCC 9 introduced this
                greaterThan(QT_GCC_MAJOR_VERSION, 8): hcleanFLAGS += -Wno-redundant-move
                # GCC 9 introduced this
                greaterThan(QT_GCC_MAJOR_VERSION, 8): hcleanFLAGS += -Wno-format-overflow
                # GCC 9 introduced this
                greaterThan(QT_GCC_MAJOR_VERSION, 8): hcleanFLAGS += -Wno-init-list-lifetime

                c++11 {
                    # only enabled for actual c++11 builds due to
                    # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52806
                    hcleanFLAGS += -Wzero-as-null-pointer-constant
                }
            }
        }

        # Use strict mode C++11 or C++98, with no GNU extensions (see -pedantic-errors above).
        # The module might set CONFIG += c++11, but it might also change QMAKE_CXXFLAGS_CXX11
        # or the module (or the mkspec) can set the C++11 flag on QMAKE_CXXFLAGS
        # (or QMAKE_CXXFLAGS_{RELEASE,DEBUG} but that's unlikely).
        c++11:contains(QMAKE_CXXFLAGS_CXX11, -std=gnu++11) {
            hcleanFLAGS += -std=c++11
        } else: contains(QMAKE_CXXFLAGS, -std=gnu++11) {
            hcleanFLAGS += -std=c++11
        } else: c++11:contains(QMAKE_CXXFLAGS_CXX11, -std=gnu++0x) {
            hcleanFLAGS += -std=c++0x
        } else: contains(QMAKE_CXXFLAGS, -std=gnu++0x) {
            hcleanFLAGS += -std=c++0x
        } else: !c++11:!contains(QMAKE_CXXFLAGS, -std=c++0x):!contains(QMAKE_CXXFLAGS, -std=c++11) {
            hcleanFLAGS += -std=c++98
        }

        hcleanCOMMAND = $(CXX) -c $(CXXFLAGS) $$hcleanFLAGS $(INCPATH) $$hcleanDEFS -xc++ ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
    } else: msvc:!intel_icl {
        # 4180: qualifier applied to function type has no meaning; ignored
        # 4458: declaration of 'identifier' hides class member
        # -Za enables strict standards behavior, but we can't add it because
        # <windows.h> and <GL.h> violate the standards.
        hcleanFLAGS = -WX -W3 -wd4180 -wd4458

        # MSVC 2015 (compiler version 19.0):
        # 4577: 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc
        greaterThan(QMAKE_MSC_VER, 18): hcleanFLAGS += -wd4577

        hcleanCOMMAND = $(CXX) -c $(CXXFLAGS) $$hcleanFLAGS $(INCPATH) $$hcleanDEFS -FI${QMAKE_FILE_IN} -Fo${QMAKE_FILE_OUT} \
                        $$[QT_INSTALL_DATA/src]/mkspecs/features/data/dummy.cpp
    }

    !isEmpty(hcleanCOMMAND):if(!qtConfig(debug_and_release)|CONFIG(release, debug|release)) {
        CLEAN_HEADERS =
        for (h, SYNCQT.CLEAN_HEADER_FILES) {
            hh = $$split(h, :)
            hr = $$member(hh, 1)
            isEmpty(hr)|qtConfig($$hr): \
                CLEAN_HEADERS += $$member(hh, 0)
        }
        CLEAN_HEADERS -= $$HEADERSCLEAN_EXCLUDE
        header_check.dependency_type = TYPE_C
        header_check.CONFIG += no_link
        header_check.output = ${QMAKE_VAR_OBJECTS_DIR}header_${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
        header_check.input = CLEAN_HEADERS
        header_check.variable_out = PRE_TARGETDEPS
        header_check.name = headercheck ${QMAKE_FILE_IN}
        header_check.commands = $$hcleanCOMMAND
        QMAKE_EXTRA_COMPILERS += header_check
    }
    unset(hcleanCOMMAND)
    unset(hcleanFLAGS)
    unset(hcleanDEFS)
}
