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

# Ensure that each module has a .qmake.cache when properly qmake'd.
cache()

load(qt_configure)

load(qt_build_config)

TEMPLATE = subdirs

bp = $$eval($$upper($$TARGET)_BUILD_PARTS)
!isEmpty(bp): QT_BUILD_PARTS = $$bp

exists($$_PRO_FILE_PWD_/src/src.pro) {
    sub_src.subdir = src
    sub_src.target = sub-src
    SUBDIRS += sub_src

    exists($$_PRO_FILE_PWD_/tools/tools.pro) {
        sub_tools.subdir = tools
        sub_tools.target = sub-tools
        sub_tools.depends = sub_src
        # conditional treatment happens on a case-by-case basis
        SUBDIRS += sub_tools
    }
}

exists($$_PRO_FILE_PWD_/examples/examples.pro) {
    sub_examples.subdir = examples
    sub_examples.target = sub-examples
    contains(SUBDIRS, sub_src): sub_examples.depends = sub_src
    contains(SUBDIRS, sub_tools): sub_examples.depends += sub_tools
    !contains(QT_BUILD_PARTS, examples): sub_examples.CONFIG = no_default_target no_default_install
    SUBDIRS += sub_examples
}

exists($$_PRO_FILE_PWD_/tests/tests.pro) {
    sub_tests.subdir = tests
    sub_tests.target = sub-tests
    contains(SUBDIRS, sub_src): sub_tests.depends = sub_src   # The tests may have a run-time only dependency on other parts
    contains(SUBDIRS, sub_tools): sub_tests.depends += sub_tools
    sub_tests.CONFIG = no_default_install
    !contains(QT_BUILD_PARTS, tests): sub_tests.CONFIG += no_default_target
    SUBDIRS += sub_tests
}

QT_BUILD_PARTS -= libs tools examples tests
!isEmpty(QT_BUILD_PARTS): warning("Unknown build part(s): $$QT_BUILD_PARTS")

QMAKE_DISTCLEAN += \
    .qmake.cache \
    config.cache \
    config.log \
    mkspecs/modules/*.pri \
    mkspecs/modules-inst/*.pri

tests = $$files($$_PRO_FILE_PWD_/config.tests/*.pro, true)
testdirs =
for (t, tests): \
    testdirs += $$relative_path($$dirname(t), $$_PRO_FILE_PWD_)
testdirs = $$unique(testdirs)
for (td, testdirs) {
    t = $$basename(td)-distclean
    $${t}.commands = -$$QMAKE_CD $$shell_path($$td) && $(MAKE) distclean
    QMAKE_EXTRA_TARGETS += $$t
    DISTCLEAN_DEPS += $$t
}
