# This file is loaded by qmake right after loading the actual project file.

contains(TEMPLATE, ".*(lib|app)"):CONFIG += have_target

!have_target:!force_qt: CONFIG -= qt

load(resolve_config)

exclusive_builds: load(exclusive_builds_post)

# If the TARGET looks like a path, split it into DESTDIR and the resulting TARGET
target_dir_part = $$dirname(TARGET)
!isEmpty(target_dir_part) {
    isEmpty(DESTDIR): \
        DESTDIR = $$target_dir_part
    else: \
        DESTDIR = $$DESTDIR/$$target_dir_part

    TARGET = $$basename(TARGET)
    DESTDIR = $$clean_path($$DESTDIR)
}

QT_BREAKPAD_ROOT_PATH = $$(QT_BREAKPAD_ROOT_PATH)
!isEmpty(QT_BREAKPAD_ROOT_PATH): \   # quick test first whether requested ...
        !static:release:have_target: \   # is it applicable?
        !contains(TARGET, .*phony_target.*): \   # monster hack, you don't really see this here, right? ;)
        system($$QT_BREAKPAD_ROOT_PATH/qtbreakpadsymbols --breakpad-exists) {    # do we really have it?
    CONFIG += breakpad force_debug_info
    CONFIG -= no_debug_info separate_debug_info
}

force_debug_info|debug: \
    CONFIG += debug_info

force_debug_info {
    QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
    QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO
    QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
}

optimize_size {
    !isEmpty(QMAKE_CFLAGS_OPTIMIZE):!isEmpty(QMAKE_CFLAGS_OPTIMIZE_SIZE)  {
        QMAKE_CFLAGS_RELEASE -= $$QMAKE_CFLAGS_OPTIMIZE
        QMAKE_CXXFLAGS_RELEASE -= $$QMAKE_CFLAGS_OPTIMIZE
        QMAKE_CFLAGS_RELEASE += $$QMAKE_CFLAGS_OPTIMIZE_SIZE
        QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_OPTIMIZE_SIZE
    }
} else: optimize_full {
    !isEmpty(QMAKE_CFLAGS_OPTIMIZE):!isEmpty(QMAKE_CFLAGS_OPTIMIZE_FULL)  {
        QMAKE_CFLAGS_RELEASE -= $$QMAKE_CFLAGS_OPTIMIZE
        QMAKE_CXXFLAGS_RELEASE -= $$QMAKE_CFLAGS_OPTIMIZE
        QMAKE_CFLAGS_RELEASE += $$QMAKE_CFLAGS_OPTIMIZE_FULL
        QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_OPTIMIZE_FULL
    }
}

optimize_debug {
    QMAKE_CFLAGS_DEBUG += $$QMAKE_CFLAGS_OPTIMIZE_DEBUG
    QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_OPTIMIZE_DEBUG
}

debug {
    QMAKE_CFLAGS += $$QMAKE_CFLAGS_DEBUG
    QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_DEBUG
    QMAKE_LFLAGS += $$QMAKE_LFLAGS_DEBUG
    QMAKE_LIBFLAGS += $$QMAKE_LIBFLAGS_DEBUG
    DEFINES += $$DEFINES_DEBUG
} else {
    QMAKE_CFLAGS += $$QMAKE_CFLAGS_RELEASE
    QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_RELEASE
    QMAKE_LFLAGS += $$QMAKE_LFLAGS_RELEASE
    QMAKE_LIBFLAGS += $$QMAKE_LIBFLAGS_RELEASE
    DEFINES += $$DEFINES_RELEASE
}

stack_protector_strong {
    QMAKE_CFLAGS += $$QMAKE_CFLAGS_STACK_PROTECTOR_STRONG
    QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_STACK_PROTECTOR_STRONG
}

# disable special linker flags for host builds (no proper test for host support yet)
!host_build|!cross_compile {
    use_bfd_linker: QMAKE_LFLAGS += $$QMAKE_LFLAGS_USE_BFD
    use_gold_linker: QMAKE_LFLAGS += $$QMAKE_LFLAGS_USE_GOLD
    use_lld_linker: QMAKE_LFLAGS += $$QMAKE_LFLAGS_USE_LLD
    enable_new_dtags: QMAKE_LFLAGS += $$QMAKE_LFLAGS_NEW_DTAGS
    enable_gdb_index: QMAKE_LFLAGS += $$QMAKE_LFLAGS_GDB_INDEX
}

dll:win32: QMAKE_LFLAGS += $$QMAKE_LFLAGS_DLL
static:mac: QMAKE_LFLAGS += $$QMAKE_LFLAGS_STATIC_LIB
staticlib:unix {
    QMAKE_CFLAGS += $$QMAKE_CFLAGS_STATIC_LIB
    QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_STATIC_LIB
}

defined(WINDOWS_TARGET_PLATFORM_VERSION, var):isEmpty(WINDOWS_TARGET_PLATFORM_MIN_VERSION) {
    WINDOWS_TARGET_PLATFORM_MIN_VERSION = $$WINDOWS_TARGET_PLATFORM_VERSION
}

incredibuild_xge {
    CONFIG -= incredibuild_xge
    CONFIG = incredibuild_xge $$CONFIG
}

silent {
    # Ensure that we process silent.prf last, as it will mangle QMAKE_CXX
    # and friends in a way that some of the other features (sdk.prf and
    # simd.prf eg) do not handle.
    CONFIG -= silent
    CONFIG = silent $$CONFIG
}

breakpad {
    load(resolve_target)
    DEBUGFILENAME = $$shell_quote($$system_path($$QMAKE_RESOLVED_TARGET))
    PROJECTPATH = $$shell_quote($$system_path($$OUT_PWD))

    !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)
    QMAKE_POST_LINK = $$QMAKE_POST_LINK$$quote($${QT_BREAKPAD_ROOT_PATH}$${QMAKE_DIR_SEP}qtbreakpadsymbols $$DEBUGFILENAME $$PROJECTPATH)
    !isEmpty(QMAKE_STRIP):QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote($$QMAKE_STRIP $$DEBUGFILENAME)
}

c++17: CONFIG += c++1z
c++latest: CONFIG *= c++2a c++1z c++14 c++11

!c++11:!c++14:!c++1z:!c++2a {
    # Qt requires C++11 since 5.7, check if we need to force a compiler option
    QT_COMPILER_STDCXX_no_L = $$replace(QT_COMPILER_STDCXX, "L$", "")
    !greaterThan(QT_COMPILER_STDCXX_no_L, 199711): CONFIG += c++11
}
c++11|c++14|c++1z|c++2a {
    # Disable special compiler flags for host builds
    !host_build|!cross_compile {
        c++2a:       cxxstd = CXX2A
        else: c++1z: cxxstd = CXX1Z
        else: c++14: cxxstd = CXX14
        else:        cxxstd = CXX11
    } else {
        # Fall back to c++11, because since 5.7 c++11 is required everywhere,
        # including host builds
        cxxstd = CXX11
    }

    # Check if we should disable compiler extensions or not
    isEmpty(QMAKE_CXXFLAGS_GNU$$cxxstd) {
        strict_c++: QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_STRICTCXX
    } else {
        !strict_c++|isEmpty(QMAKE_CXXFLAGS_$$cxxstd): cxxstd = GNU$$cxxstd
    }

    QMAKE_CXXFLAGS += $$eval(QMAKE_CXXFLAGS_$$cxxstd)
    QMAKE_LFLAGS += $$eval(QMAKE_LFLAGS_$$cxxstd)

    unset(cxxstd)
}

c99|c11 {
    c11:       cstd = C11
    else:      cstd = C99

    !isEmpty(QMAKE_CFLAGS_GNU$$cstd) {
        !strict_c|isEmpty(QMAKE_CFLAGS_$$cstd): cstd = GNU$$cstd
    }

    QMAKE_CFLAGS += $$eval(QMAKE_CFLAGS_$$cstd)

    unset(cstd)
}

utf8_source {
    QMAKE_CFLAGS += $$QMAKE_CFLAGS_UTF8_SOURCE
    QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_UTF8_SOURCE
}

!precompile_header: SOURCES += $$NO_PCH_SOURCES
