load(default_post)

# Recompute SDK version in case the user set it explicitly
sdk_version = $$QMAKE_MAC_SDK_VERSION
QMAKE_MAC_SDK_VERSION = $$xcodeSDKInfo(SDKVersion)

contains(TEMPLATE, .*app) {
    !macx-xcode:if(isEmpty(BUILDS)|build_pass) {
        # Detect changes to the platform SDK
        QMAKE_EXTRA_VARIABLES += QMAKE_MAC_SDK QMAKE_MAC_SDK_VERSION QMAKE_XCODE_DEVELOPER_PATH
        QMAKE_EXTRA_INCLUDES += $$shell_quote($$PWD/sdk.mk)
    }

    # Detect incompatible SDK versions

    isEmpty(QT_MAC_SDK_VERSION_MIN): \
        QT_MAC_SDK_VERSION_MIN = $$QT_MAC_SDK_VERSION

    !versionAtLeast(QMAKE_MAC_SDK_VERSION, $$QT_MAC_SDK_VERSION_MIN): \
        warning("Qt requires at least version $$QT_MAC_SDK_VERSION_MIN of the platform SDK," \
              "you're building against version $${QMAKE_MAC_SDK_VERSION}. Please upgrade.")

    !isEmpty(QT_MAC_SDK_VERSION_MAX) {
        # For Qt developers only
        !isEmpty($$list($$(QT_MAC_SDK_NO_VERSION_CHECK))): \
            CONFIG += sdk_no_version_check

        QMAKE_MAC_SDK_MAJOR_MINOR_VERSION = $$replace(QMAKE_MAC_SDK_VERSION, "(\\d+)(\\.\\d+)(\\.\\d+)?", \\1\\2)

        !sdk_no_version_check:!versionAtMost(QMAKE_MAC_SDK_MAJOR_MINOR_VERSION, $$QT_MAC_SDK_VERSION_MAX) {
            warning("Qt has only been tested with version $$QT_MAC_SDK_VERSION_MAX"\
                    "of the platform SDK, you're using $${QMAKE_MAC_SDK_MAJOR_MINOR_VERSION}.")
            warning("This is an unsupported configuration. You may experience build issues," \
                    "and by using")
            warning("the $$QMAKE_MAC_SDK_VERSION SDK you are opting in to new features" \
                    "that Qt has not been prepared for.")

            warning("Please downgrade the SDK you use to build your app to version" \
                    "$$QT_MAC_SDK_VERSION_MAX, or configure")
            warning("with CONFIG+=sdk_no_version_check when running qmake" \
                    "to silence this warning.")
        }
    }
}

!no_objective_c:CONFIG += objective_c

qt {
    qtConfig(static) {
        # C++11 support means using libc++ instead of libstd++. As the
        # two libraries are incompatible we need to ensure the end user
        # project is built using the same C++11 support/no support as Qt.
        qtConfig(c++11) {
            CONFIG += c++11
        } else: c++11 {
            warning("Qt was not built with C++11 enabled, disabling feature")
            CONFIG -= c++11
        }

        !c++11 {
            # Explicitly use libstdc++ if C++11 support is not enabled,
            # as otherwise the compiler will choose the standard library
            # based on the deployment target, which for iOS 7 and OS X 10.9
            # is libc++, and we can't mix and match the two.
            QMAKE_CXXFLAGS += -stdlib=libstdc++
            QMAKE_LFLAGS   += -stdlib=libstdc++
        }
    }
}

# Add the same default rpaths as Xcode does for new projects.
# This is especially important for iOS/tvOS/watchOS where no other option is possible.
!no_default_rpath {
    uikit: QMAKE_RPATHDIR += @executable_path/Frameworks
    else: QMAKE_RPATHDIR += @executable_path/../Frameworks
    equals(TEMPLATE, lib):!plugin:lib_bundle: QMAKE_RPATHDIR += @loader_path/Frameworks
}

# Don't pass -headerpad_max_install_names when using Bitcode.
# In that case the linker emits a warning stating that the flag is ignored when
# used with bitcode, for reasons that cannot be determined (rdar://problem/20748962).
# Using this flag is also unnecessary in practice on UIKit platforms since they
# are sandboxed, and only UIKit platforms support bitcode to begin with.
!bitcode: QMAKE_LFLAGS += $$QMAKE_LFLAGS_HEADERPAD

app_extension_api_only {
    QMAKE_CFLAGS              += $$QMAKE_CFLAGS_APPLICATION_EXTENSION
    QMAKE_CXXFLAGS            += $$QMAKE_CFLAGS_APPLICATION_EXTENSION
    QMAKE_CXXFLAGS_PRECOMPILE += $$QMAKE_CFLAGS_APPLICATION_EXTENSION
    QMAKE_LFLAGS              += $$QMAKE_CFLAGS_APPLICATION_EXTENSION
}

macx-xcode {
    qmake_pkginfo_typeinfo.name = QMAKE_PKGINFO_TYPEINFO
    !isEmpty(QMAKE_PKGINFO_TYPEINFO): \
        qmake_pkginfo_typeinfo.value = $$QMAKE_PKGINFO_TYPEINFO
    else: \
        qmake_pkginfo_typeinfo.value = "????"
    QMAKE_MAC_XCODE_SETTINGS += qmake_pkginfo_typeinfo

    bundle_version = $$VERSION
    isEmpty(bundle_version): bundle_version = 1.0.0

    l = $$split(bundle_version, '.') 0 0  # make sure there are at least three
    VER_MAJ = $$member(l, 0, 0)
    VER_MIN = $$member(l, 1, 1)
    VER_PAT = $$member(l, 2, 2)
    unset(l)

    qmake_full_version.name = QMAKE_FULL_VERSION
    qmake_full_version.value = $${VER_MAJ}.$${VER_MIN}.$${VER_PAT}
    QMAKE_MAC_XCODE_SETTINGS += qmake_full_version

    qmake_short_version.name = QMAKE_SHORT_VERSION
    qmake_short_version.value = $${VER_MAJ}.$${VER_MIN}
    QMAKE_MAC_XCODE_SETTINGS += qmake_short_version

    !isEmpty(QMAKE_XCODE_DEBUG_INFORMATION_FORMAT) {
        debug_information_format.name = DEBUG_INFORMATION_FORMAT
        debug_information_format.value = $$QMAKE_XCODE_DEBUG_INFORMATION_FORMAT
        debug_information_format.build = debug
        QMAKE_MAC_XCODE_SETTINGS += debug_information_format
    }

    QMAKE_XCODE_ARCHS =

    arch_device.name = "ARCHS[sdk=$${device.sdk}*]"
    arch_device.value = $$QMAKE_APPLE_DEVICE_ARCHS
    QMAKE_XCODE_ARCHS += $$QMAKE_APPLE_DEVICE_ARCHS
    QMAKE_MAC_XCODE_SETTINGS += arch_device

    simulator {
        arch_simulator.name = "ARCHS[sdk=$${simulator.sdk}*]"
        arch_simulator.value = $$QMAKE_APPLE_SIMULATOR_ARCHS
        QMAKE_XCODE_ARCHS += $$QMAKE_APPLE_SIMULATOR_ARCHS
        QMAKE_MAC_XCODE_SETTINGS += arch_simulator
    }

    only_active_arch.name = ONLY_ACTIVE_ARCH
    only_active_arch.value = YES
    only_active_arch.build = debug
    QMAKE_MAC_XCODE_SETTINGS += only_active_arch
} else {
    device|!simulator: VALID_DEVICE_ARCHS = $$QMAKE_APPLE_DEVICE_ARCHS
    simulator: VALID_SIMULATOR_ARCHS = $$QMAKE_APPLE_SIMULATOR_ARCHS
    VALID_ARCHS = $$VALID_DEVICE_ARCHS $$VALID_SIMULATOR_ARCHS

    isEmpty(VALID_ARCHS): \
        error("QMAKE_APPLE_DEVICE_ARCHS or QMAKE_APPLE_SIMULATOR_ARCHS must contain at least one architecture")

    single_arch: VALID_ARCHS = $$first(VALID_ARCHS)

    ACTIVE_ARCHS = $(filter $(EXPORT_VALID_ARCHS), $(ARCHS))
    ARCH_ARGS = $(foreach arch, $(if $(EXPORT_ACTIVE_ARCHS), $(EXPORT_ACTIVE_ARCHS), $(EXPORT_VALID_ARCHS)), -arch $(arch))

    QMAKE_EXTRA_VARIABLES += VALID_ARCHS ACTIVE_ARCHS ARCH_ARGS

    arch_flags = $(EXPORT_ARCH_ARGS)

    QMAKE_CFLAGS += $$arch_flags
    QMAKE_CXXFLAGS += $$arch_flags
    QMAKE_LFLAGS += $$arch_flags

    QMAKE_PCH_ARCHS = $$VALID_ARCHS

    macos: deployment_target = $$QMAKE_MACOSX_DEPLOYMENT_TARGET
    ios: deployment_target = $$QMAKE_IOS_DEPLOYMENT_TARGET
    tvos: deployment_target = $$QMAKE_TVOS_DEPLOYMENT_TARGET
    watchos: deployment_target = $$QMAKE_WATCHOS_DEPLOYMENT_TARGET

    # If we're doing a simulator and device build, device and simulator
    # architectures use different paths and flags for the sysroot and
    # deployment target switch, so we must multiplex them across multiple
    # architectures using -Xarch. Otherwise we fall back to the simple path.
    # This is not strictly necessary, but results in cleaner command lines
    # and makes it easier for people to override EXPORT_VALID_ARCHS to limit
    # individual rules to a different set of architecture(s) from the overall
    # build (such as machtest in QtCore).
    simulator:device {
        QMAKE_XARCH_CFLAGS =
        QMAKE_XARCH_LFLAGS =
        QMAKE_EXTRA_VARIABLES += QMAKE_XARCH_CFLAGS QMAKE_XARCH_LFLAGS

        for (arch, VALID_ARCHS) {
            contains(VALID_SIMULATOR_ARCHS, $$arch) {
                sdk = $$simulator.sdk
                version_identifier = $$simulator.deployment_identifier
            } else {
                sdk = $$device.sdk
                version_identifier = $$device.deployment_identifier
            }

            version_min_flags = \
                -Xarch_$${arch} \
                -m$${version_identifier}-version-min=$$deployment_target
            QMAKE_XARCH_CFLAGS_$${arch} = $$version_min_flags \
                -Xarch_$${arch} \
                -isysroot$$xcodeSDKInfo(Path, $$sdk)
            QMAKE_XARCH_LFLAGS_$${arch} = $$version_min_flags \
                -Xarch_$${arch} \
                -isysroot$$xcodeSDKInfo(Path, $$sdk)

            QMAKE_XARCH_CFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS_$${arch})
            QMAKE_XARCH_LFLAGS += $(EXPORT_QMAKE_XARCH_LFLAGS_$${arch})

            QMAKE_EXTRA_VARIABLES += \
                QMAKE_XARCH_CFLAGS_$${arch} \
                QMAKE_XARCH_LFLAGS_$${arch}
        }

        QMAKE_CFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS)
        QMAKE_CXXFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS)
        QMAKE_LFLAGS += $(EXPORT_QMAKE_XARCH_LFLAGS)
    } else {
        simulator {
            version_identifier = $$simulator.deployment_identifier
            sysroot_path  = $$xcodeSDKInfo(Path, $$simulator.sdk)
        } else {
            version_identifier = $$device.deployment_identifier
            sysroot_path  = $$xcodeSDKInfo(Path, $$device.sdk)
        }
        version_min_flag = -m$${version_identifier}-version-min=$$deployment_target
        QMAKE_CFLAGS += -isysroot $$sysroot_path $$version_min_flag
        QMAKE_CXXFLAGS += -isysroot $$sysroot_path $$version_min_flag
        QMAKE_LFLAGS += -isysroot $$sysroot_path $$version_min_flag
    }

    # Enable precompiled headers for multiple architectures
    QMAKE_CFLAGS_USE_PRECOMPILE =
    for (arch, VALID_ARCHS) {
        icc_pch_style: \
            use_flag = "-pch-use "
        else: \
            use_flag = -include

        # Only use Xarch with multi-arch, as the option confuses ccache
        count(VALID_ARCHS, 1, greaterThan): \
            QMAKE_CFLAGS_USE_PRECOMPILE += \
                -Xarch_$${arch}

        QMAKE_CFLAGS_USE_PRECOMPILE += \
            $${use_flag}${QMAKE_PCH_OUTPUT_$${arch}}
    }
    icc_pch_style {
        QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE -include ${QMAKE_PCH_INPUT}
        QMAKE_CFLAGS_USE_PRECOMPILE =
    } else {
        QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
        QMAKE_OBJCFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
        QMAKE_OBJCXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
    }

    QMAKE_PCH_OUTPUT_EXT = _${QMAKE_PCH_ARCH}$${QMAKE_PCH_OUTPUT_EXT}
}

!equals(sdk_version, $$QMAKE_MAC_SDK_VERSION) {
    # Explicit SDK version has been set, respect that
    QMAKE_LFLAGS += -Wl,-sdk_version -Wl,$$sdk_version
}

cache(QMAKE_XCODE_DEVELOPER_PATH, stash)
!isEmpty(QMAKE_XCODE_VERSION): \
    cache(QMAKE_XCODE_VERSION, stash)

QMAKE_XCODE_LIBRARY_SUFFIX = $$qtPlatformTargetSuffix()

xcode_product_bundle_identifier_setting.name = PRODUCT_BUNDLE_IDENTIFIER
xcode_product_bundle_identifier_setting.value = $$QMAKE_TARGET_BUNDLE_PREFIX
isEmpty(xcode_product_bundle_identifier_setting.value): \
    xcode_product_bundle_identifier_setting.value = "com.yourcompany"
xcode_product_bundle_target = $$QMAKE_BUNDLE
isEmpty(xcode_product_bundle_target): \
    xcode_product_bundle_target = ${PRODUCT_NAME:rfc1034identifier}
xcode_product_bundle_identifier_setting.value = "$${xcode_product_bundle_identifier_setting.value}.$${xcode_product_bundle_target}"
QMAKE_MAC_XCODE_SETTINGS += xcode_product_bundle_identifier_setting

!macx-xcode {
    generate_xcode_project.commands = @$(QMAKE) -spec macx-xcode \"$(EXPORT__PRO_FILE_)\" $$QMAKE_ARGS
    generate_xcode_project.target = xcodeproj
    QMAKE_EXTRA_VARIABLES += _PRO_FILE_
    QMAKE_EXTRA_TARGETS += generate_xcode_project
}
