2015-06-16 15:14:53 +00:00
# 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 -% ;
2015-11-26 13:19:55 +00:00
# iOS Simulator doesn't support archiving
%-iphonesimulator-install : ACTION = build
iphonesimulator-install : ACTION = build
2015-06-16 15:14:53 +00:00
# Limit check to a single configuration
%-iphoneos-check : check -iphoneos ;
%-iphonesimulator-check : check -iphonesimulator ;
# SDK
%-iphoneos : SDK = iphoneos
%-iphonesimulator : SDK = iphonesimulator
# Configuration
release-% : CONFIGURATION = Release
debug-% : CONFIGURATION = Debug
# Test and build (device) destinations
i f n e q ( $( 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/ios_destinations.mk
$( shell $( SPECDIR) /ios_destinations.sh $( TARGET) > $( DESTINATIONS_INCLUDE) )
include $( DESTINATIONS_INCLUDE)
endif
e n d i f
%-iphonesimulator : DEVICES = $( firstword $ ( IPHONESIMULATOR_DEVICES ) )
%-iphoneos : DEVICES = $( IPHONEOS_DEVICES )
IPHONEOS_GENERIC_DESTINATION := "generic/platform=iOS"
2015-09-07 13:36:41 +00:00
IPHONESIMULATOR_GENERIC_DESTINATION := " id= $( shell xcrun simctl list devices | grep -E 'iPhone|iPad' | grep -v unavailable | perl -lne 'print $$1 if /\((.*?)\)/' | tail -n 1) "
2015-06-16 15:14:53 +00:00
DESTINATION = $( if $( DESTINATION_ID) ," id= $( DESTINATION_ID) " ,$( value $( call toupper,$( call basesdk,$( SDK) ) ) _GENERIC_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