summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/mac/sdk.prf
blob: 087212f45b0394703450c965fc7bb2bce097a159 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

isEmpty(QMAKE_MAC_SDK): \
    error("QMAKE_MAC_SDK must be set when using CONFIG += sdk.")

contains(QMAKE_MAC_SDK, .*/.*): \
    error("QMAKE_MAC_SDK can only contain short-form SDK names (eg. macosx, iphoneos)")

defineReplace(xcodeSDKInfo) {
    info = $$1
    sdk = $$2
    isEmpty(sdk): \
        sdk = $$QMAKE_MAC_SDK

    isEmpty(QMAKE_MAC_SDK.$${sdk}.$${info}) {
        QMAKE_MAC_SDK.$${sdk}.$${info} = $$system("/usr/bin/xcodebuild -sdk $$sdk -version $$info 2>/dev/null")
        isEmpty(QMAKE_MAC_SDK.$${sdk}.$${info}): error("Could not resolve SDK $$info for \'$$sdk\'")
        cache(QMAKE_MAC_SDK.$${sdk}.$${info}, set stash, QMAKE_MAC_SDK.$${sdk}.$${info})
    }

    return($$eval(QMAKE_MAC_SDK.$${sdk}.$${info}))
}

QMAKE_MAC_SDK_PATH = $$xcodeSDKInfo(Path)
QMAKE_MAC_SDK_PLATFORM_PATH = $$xcodeSDKInfo(PlatformPath)
QMAKE_MAC_SDK_VERSION = $$xcodeSDKInfo(SDKVersion)

sysrootified =
for(val, QMAKE_INCDIR_OPENGL): sysrootified += $${QMAKE_MAC_SDK_PATH}$$val
QMAKE_INCDIR_OPENGL = $$sysrootified

QMAKESPEC_NAME = $$basename(QMAKESPEC)

# Resolve SDK version of various tools
for(tool, $$list(QMAKE_CC QMAKE_CXX QMAKE_FIX_RPATH QMAKE_AR QMAKE_RANLIB QMAKE_LINK QMAKE_LINK_SHLIB)) {
    tool_variable = QMAKE_MAC_SDK.$${QMAKESPEC_NAME}.$${QMAKE_MAC_SDK}.$${tool}
    !isEmpty($$tool_variable) {
        $$tool = $$eval($$tool_variable)
        next()
    }

    value = $$eval($$tool)
    isEmpty(value): next()

    sysrooted = $$system("/usr/bin/xcrun -sdk $$QMAKE_MAC_SDK -find $$first(value) 2>/dev/null")
    isEmpty(sysrooted): next()

    $$tool = $$sysrooted $$member(value, 1, -1)
    cache($$tool_variable, set stash, $$tool)
}

!equals(MAKEFILE_GENERATOR, XCODE) {
    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

    !simulator|simulator_and_device: device_archs = $$QMAKE_APPLE_DEVICE_ARCHS
    simulator: simulator_archs = $$QMAKE_APPLE_SIMULATOR_ARCHS
    archs = $$device_archs $$simulator_archs

    single_arch {
        device_archs = $$first(device_archs)
        simulator_archs = $$first(simulator_archs)
        archs = $$first(archs)
    }

    # 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_and_device {
        QMAKE_XARCH_CFLAGS =
        QMAKE_XARCH_LFLAGS =
        QMAKE_EXTRA_VARIABLES += QMAKE_XARCH_CFLAGS QMAKE_XARCH_LFLAGS

        for(arch, archs) {
            contains(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} \
                -Wl,-syslibroot,$$xcodeSDKInfo(Path, $$sdk)

            QMAKE_XARCH_CFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS_$${arch})
            QMAKE_XARCH_LFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS_$${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
        else: \
            version_identifier = $$device.deployment_identifier
        version_min_flag = -m$${version_identifier}-version-min=$$deployment_target
        QMAKE_CFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag
        QMAKE_CXXFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag
        QMAKE_LFLAGS += -Wl,-syslibroot,$$QMAKE_MAC_SDK_PATH $$version_min_flag
    }

    # Enable precompiled headers for multiple architectures
    QMAKE_CFLAGS_USE_PRECOMPILE =
    for(arch, archs) {
        QMAKE_CFLAGS_USE_PRECOMPILE += \
            -Xarch_$${arch} \
            -include${QMAKE_PCH_OUTPUT_$${arch}}
    }
    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}
}