summaryrefslogtreecommitdiffstats
path: root/mkspecs/macx-ios-clang/features/xcodebuild.prf
blob: 627e1e2930c027639da4ecae4eeaf84b8ed4ce13 (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

# For Qt applications we want Xcode project files as the generated output,
# but since qmake doesn't handle the transition between makefiles and Xcode
# project files (which happens when using subdirs), we can't just override
# MAKEFILE_GENERATOR. Instead, we generate the Xcode project by spawing a
# child qmake process with -spec macx-xcode and let the top level qmake
# process generate a wrapper makefile that forwards everything to xcodebuild.

TEMPLATE = aux

SOURCES =
OBJECTIVE_SOURCES =
RESOURCES =
INSTALLS =
QMAKE_EXTRA_COMPILERS =

!build_pass {
    # Top level makefile that aggregates all exclusive builds

    !mkpath($$OUT_PWD): \
        error("Failed to create $$OUT_PWD")

    args =
    for(arg, QMAKE_ARGS): \
        args += $$system_quote($$arg)

    cmd = "$$QMAKE_QMAKE $$args $$system_quote($$_PRO_FILE_) -spec macx-xcode"
    debug(1, "Generating Xcode project in $$OUT_PWD using '$$cmd'")
    system("cd $$system_quote($$OUT_PWD) && $$cmd")

    distclean_files += $${TARGET}.xcodeproj

    # Pretend we have a target, even though our template is aux
    CONFIG += have_target

} else {
    # Leaf makefile for a single exclusive build

    iphonesimulator: \
        sdk = iphonesimulator
    else: \
        sdk = iphoneos

    debug: \
        cfg = debug
    else: \
        cfg = release

    for(action, $$list(build install clean test)) {
        equals(action, build) {
            action_target_suffix =
            action_target = all
        } else: equals(action, test) {
            action_target_suffix = -check
            action_target = check
        } else {
            action_target_suffix = -$$action
            action_target = $$action
        }

        target = $${sdk}-$${cfg}$${action_target_suffix}

        xcodebuild = "xcodebuild $$action -scheme $(TARGET) -sdk $$sdk -configuration $$title($$cfg)"

        equals(action, test):equals(sdk, iphoneos) {
            AVAILABLE_DEVICE_IDS = "$(shell system_profiler SPUSBDataType | sed -n -E -e '/(iPhone|iPad|iPod)/,/Serial/s/ *Serial Number: *(.+)/\1/p')"
            CUSTOM_DEVICE_IDS = "$(filter $(EXPORT_AVAILABLE_DEVICE_IDS), $(IOS_TEST_DEVICE_IDS))"
            TEST_DEVICE_IDS = "$(strip $(if $(EXPORT_CUSTOM_DEVICE_IDS), $(EXPORT_CUSTOM_DEVICE_IDS), $(EXPORT_AVAILABLE_DEVICE_IDS)))"

            QMAKE_EXTRA_VARIABLES += AVAILABLE_DEVICE_IDS CUSTOM_DEVICE_IDS TEST_DEVICE_IDS

            xcodebuild = "@$(if $(EXPORT_TEST_DEVICE_IDS),"\
                "echo Running tests on $(words $(EXPORT_TEST_DEVICE_IDS)) device\\(s\\): && ("\
                    "$(foreach deviceid, $(EXPORT_TEST_DEVICE_IDS),"\
                        "(echo Testing on device ID '$(deviceid)' ... && $${xcodebuild} -destination 'platform=iOS,id=$(deviceid)' && echo) &&"\
                    ") echo Tests completed successfully on all devices"\
                "), $(error No iOS devices connected, please connect at least one device that can be used for testing.))"
        }

        $${target}.commands = $$xcodebuild
        QMAKE_EXTRA_TARGETS += $$target

        $${action_target}.depends += $$target
        QMAKE_EXTRA_TARGETS *= $${action_target}
    }

    # Remove build dir
    distclean_files += $$title($$cfg)-$${sdk}
}

distclean_xcodebuild.commands = -$(DEL_FILE) -R $$distclean_files
distclean.depends += distclean_xcodebuild
QMAKE_EXTRA_TARGETS += distclean distclean_xcodebuild