summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/uikit/xcodebuild.mk
blob: 5cbad6080444184c33b6fcac3ffe3a54a15e5a74 (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

# We don't want xcodebuild to run in parallel
.NOTPARALLEL:

# Functions
targets = $(foreach target, $(EXPORT_SUBTARGETS), $(target)-$(strip $(1)))
toupper = $(shell echo $1 | tr '[:lower:]' '[:upper:]')
tolower = $(shell echo $1 | tr '[:upper:]' '[:lower:]')
basesdk = $(shell echo $1 | sed 's/[0-9.]*$$//')

# Explicit comma variable
, := ,

# Default targets
first: build
all: build_all

.DEFAULT_GOAL = first

# Top level targets
build: build_first
clean: clean_first
install: install_first
check: check_first
distclean: clean_all

$(EXPORT_SUBTARGETS): % : %-build

# Generic targets
%_first: $(firstword $(call targets, %)) ;
%_all: $(call targets, %) ;

# Actions
%-build: ACTION = build
%-build: xcodebuild-% ;

%-clean: ACTION = clean
%-clean: xcodebuild-% ;

%-install: ACTION = install
%-install: xcodebuild-% ;

# Simulator doesn't support archiving
%-simulator-install: ACTION = build
simulator-install: ACTION = build

# Limit check to a single configuration
%-device-check: check-device ;
%-simulator-check: check-simulator ;

# SDK
%-device: SDK = $(DEVICE_SDK)
%-simulator: SDK = $(SIMULATOR_SDK)

# Configuration
release-%: CONFIGURATION = Release
debug-%: CONFIGURATION = Debug

# Test and build (device) destinations
ifneq ($(filter check%,$(MAKECMDGOALS)),)
  ifeq ($(DEVICES),)
    $(info Enumerating test destinations (you may override this by setting DEVICES explicitly), please wait...)
    SPECDIR := $(dir $(lastword $(MAKEFILE_LIST)))
    DESTINATIONS_INCLUDE = /tmp/device_destinations.mk
    $(shell $(SPECDIR)/../features/uikit/device_destinations.sh '$(EXPORT_DEVICE_FILTER)' $(TARGET) > $(DESTINATIONS_INCLUDE))
    include $(DESTINATIONS_INCLUDE)
  endif
endif

%-simulator: DEVICES = $(firstword $(SIMULATOR_DEVICES))
%-device: DEVICES = $(HARDWARE_DEVICES)

GENERIC_DEVICE_DESTINATION := $(EXPORT_GENERIC_DEVICE_DESTINATION)
GENERIC_SIMULATOR_DESTINATION := "id=$(shell xcrun simctl list devices | grep -E '$(EXPORT_DEVICE_FILTER)' | grep -v unavailable | perl -lne 'print $$1 if /\((.*?)\)/' | tail -n 1)"

%-simulator: DESTINATION = $(if $(DESTINATION_ID),"id=$(DESTINATION_ID)",$(GENERIC_SIMULATOR_DESTINATION))
%-device: DESTINATION = $(if $(DESTINATION_ID),"id=$(DESTINATION_ID)",$(GENERIC_DEVICE_DESTINATION))

# Xcodebuild

DESTINATION_MESSAGE = "Running $(call tolower,$(CONFIGURATION)) $(ACTION) \
  on '$(DESTINATION_NAME)' ($(DESTINATION_ID))$(if $(DESTINATION_OS),$(,) $(DESTINATION_PLATFORM) $(DESTINATION_OS),)"

xcodebuild-%:
		@$(if $(DESTINATION_NAME), echo $(DESTINATION_MESSAGE),)
		xcodebuild $(ACTION) -scheme $(TARGET) $(if $(SDK), -sdk $(SDK),) $(if $(CONFIGURATION), -configuration $(CONFIGURATION),) $(if $(DESTINATION), -destination $(DESTINATION) -destination-timeout 1,)

xcodebuild-check-device_%: DESTINATION_ID=$(lastword $(subst _, ,$@))

# Special check target (requires SECONDEXPANSION due to devices)
.SECONDEXPANSION:
check-%: ACTION = test
check-%: $$(foreach device, $$(DEVICES), xcodebuild-check-device_$$(device)) ;
	  @echo $(if $^, Ran $(call tolower,$(CONFIGURATION)) tests on $(words $^) $(SDK) destination\(s\): $(DEVICES), No compatible test devices found for \'$(SDK)\' SDK && false)

# Determined by device
check-%: SDK =

# Default to debug for testing
check-%: CONFIGURATION = Debug