#
#  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.
#

!contains(QMAKE_INTERNAL_INCLUDED_FILES, .*qmodule\\.pri) {
    QMAKE_QT_MODULE = $$[QT_HOST_DATA/get]/mkspecs/qmodule.pri
    !exists($$QMAKE_QT_MODULE)|!include($$QMAKE_QT_MODULE, "", true) {
        debug(1, "Cannot load qmodule.pri!")
    } else {
        debug(1, "Loaded qmodule.pri from ($$QMAKE_QT_MODULE)")
    }
} else {
    debug(1, "Not loading qmodule.pri twice")
}

PRECOMPILED_DIR = .pch
OBJECTS_DIR = .obj
MOC_DIR = .moc
RCC_DIR = .rcc
UI_DIR = .uic
TRACEGEN_DIR = .tracegen
QMLCACHE_DIR = .qmlcache
LRELEASE_DIR = .qm
intel_icl {
    # ICL 14.0 has a bug that makes it not find #includes in dirs starting with .
    MOC_DIR = tmp/moc
    RCC_DIR = tmp/rcc
    UI_DIR = tmp/uic
}

QMAKE_DIR_REPLACE_SANE = PRECOMPILED_DIR OBJECTS_DIR MOC_DIR RCC_DIR UI_DIR

load(qt_prefix_build_check)

# force_independent can be set externally. prefix_build not.
qtIsPrefixBuild($$[QT_HOST_DATA]): \
    CONFIG += prefix_build force_independent

!build_pass:!isEmpty(_QMAKE_SUPER_CACHE_):force_independent {
    # When doing a -prefix build of top-level qt5/qt.pro, we need to announce
    # this repo's output dir to the other repos.
    MODULE_BASE_OUTDIR = $$shadowed($$dirname(_QMAKE_CONF_))
    !contains(QTREPOS, $$MODULE_BASE_OUTDIR): \
        cache(QTREPOS, add super, MODULE_BASE_OUTDIR)
    # This repo's module pris' location needs to be made known to qmake.
    isEmpty(MODULE_QMAKE_OUTDIR): MODULE_QMAKE_OUTDIR = $$MODULE_BASE_OUTDIR
    modpath = $$MODULE_QMAKE_OUTDIR/mkspecs/modules
    !contains(QMAKEMODULES, $$modpath): \
        cache(QMAKEMODULES, add super, modpath)
    unset(modpath)
}

defineTest(qtSetQmlPath) {
    !qtConfig(static)|host_build|no_import_scan: \
        return()
    deps = $$replace(QT, -private$, _private)
    deps = $$resolve_depends(deps, "QT.")
    !contains(deps, qml): \
        return()

    isEmpty(QTREPOS): \
        QTREPOS = $$shadowed($$dirname(_QMAKE_CONF_))
    for (qrep, QTREPOS): \
        exists($$qrep/qml): \
            QMLPATHS += $$qrep/qml
    export(QMLPATHS)
}

# Apply extra compiler flags passed via configure last.
CONFIG = qt_build_extra $$CONFIG

# Don't actually try to install anything in non-prefix builds.
# This is much easier and safer than making every single INSTALLS
# assignment conditional.
!prefix_build: \
    CONFIG += qt_clear_installs

cross_compile: \
    CONFIG += force_bootstrap

android|uikit|winrt: \
    CONFIG += builtin_testdata

# Prevent warnings about object files without any symbols
macos: CONFIG += no_warn_empty_obj_files

CONFIG += \
    utf8_source \
    create_prl link_prl \
    prepare_docs qt_docs_targets \
    no_private_qt_headers_warning QTDIR_build \
    qt_example_installs \
    # Qt modules get compiled without exceptions enabled by default.
    # However, testcases should be still built with exceptions.
    exceptions_off testcase_exceptions

# Under Windows, this is neither necessary (transitive deps are automatically
# resolved), nor functional (.res files end up in .prl files and break things).
unix: CONFIG += explicitlib

# By default we want tests on macOS to be built as standalone executables
macos: CONFIG += testcase_no_bundle

# Override MinGW's definition in _mingw.h
mingw: DEFINES += WINVER=0x0601 _WIN32_WINNT=0x0601

# By default, the following features should not be used in Qt's own
# implementation, so declare them invisible to Qt modules.
DEFINES += QT_NO_LINKED_LIST # QLinkedList

defineTest(qtBuildPart) {
    bp = $$eval($$upper($$section(_QMAKE_CONF_, /, -2, -2))_BUILD_PARTS)
    isEmpty(bp): bp = $$QT_BUILD_PARTS
    contains(bp, $$1): return(true)
    return(false)
}

defineTest(qtNomakeTools) {
    qtBuildPart(tools): return()
    for (d, 1) {
        $${d}.CONFIG += no_default_target no_default_install
        export($${d}.CONFIG)
    }
}

# This overloads the same function from qt_functions.prf.
# This is not in qt_module.prf, as that gets loaded too late.
defineTest(qtConfig) {
    modules = $$QT $$QT_PRIVATE $$QT_FOR_PRIVATE $$QT_FOR_CONFIG
    modules ~= s,-private$,_private,g
    modules = $$resolve_depends(modules, "QT.", ".depends")
    isEmpty(MODULE): \
        MODULE = $$section($$list($$basename(_PRO_FILE_)), ., 0, 0)
    exists($$OUT_PWD/qt$${MODULE}-config.pri) {
        include($$OUT_PWD/qt$${MODULE}-config.pri)
        modules += $${MODULE} $${MODULE}_private
    }
    modules += global global_private
    modules = $$reverse(modules)
    for (module, modules) {
        contains(QT.$${module}.enabled_features, $$1): \
            return(true)
        contains(QT.$${module}.disabled_features, $$1): \
            return(false)
    }
    error("Could not find feature $${1}.")
}
