| |
| # 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: $(EXPORT_PRE_TARGETDEPS) $(firstword $(call targets, %)) ; |
| %_all: $(EXPORT_PRE_TARGETDEPS) $(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 |
| |
| MAKEFILE_DIR := $(dir $(lastword $(MAKEFILE_LIST))) |
| |
| # 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...) |
| DESTINATIONS_INCLUDE = /tmp/device_destinations.mk |
| $(shell $(MAKEFILE_DIR)device_destinations.sh $(TARGET) $(EXPORT_DEVICE_FILTER) > $(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 $(MAKEFILE_DIR)devices.py $(EXPORT_DEVICE_FILTER) | 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)) |
| |
| XCODE_VERSION_MAJOR := $(shell xcodebuild -version | grep Xcode | sed -e 's/Xcode //' | sed -e 's/\..*//') |
| |
| ifeq ($(shell test $(XCODE_VERSION_MAJOR) -gt 7; echo $$?),0) |
| XCODEBUILD_FLAGS += $(shell echo "$(MAKEFLAGS)" | sed -e 's/\([^ ]*\).*/\1/' | grep -qv 's' || echo -quiet) |
| endif |
| |
| # 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) $(XCODEBUILD_FLAGS) -project $(TARGET).xcodeproj -scheme $(TARGET) $(if $(SDK), -sdk $(SDK),) $(if $(CONFIGURATION), -configuration $(CONFIGURATION),) $(if $(DESTINATION), -destination $(DESTINATION) -destination-timeout 1,) $(if $(DESTINATION_ID),, ENABLE_ONLY_ACTIVE_RESOURCES=NO) $(if $(INSTALL_ROOT), DSTROOT=$(INSTALL_ROOT),) |
| |
| 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 |
| |