diff options
author | Jake Petroules <jake.petroules@qt.io> | 2017-11-13 23:55:44 -0800 |
---|---|---|
committer | Jake Petroules <jake.petroules@qt.io> | 2017-11-15 02:08:54 +0000 |
commit | 26141086963d1c6ea9451e17c831d748690cf44d (patch) | |
tree | d803925b2929301b3b3a15e4e9b0efb22e1d2421 /mkspecs | |
parent | a95936f37695706144ba6ca050c3493af88d7d34 (diff) | |
download | qtbase-26141086963d1c6ea9451e17c831d748690cf44d.tar.gz |
qmake: properly filter simulator devices by minimum deployment target
This fixes an issue where a build error may be introduced by a simulator
being selected whose OS version is lower than the application's
minimum deployment target.
Task-number: QTBUG-64456
Change-Id: Ic7c834a1473c183ebb910bc01a416fe1e23a5a14
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'mkspecs')
-rwxr-xr-x | mkspecs/features/uikit/device_destinations.sh | 6 | ||||
-rwxr-xr-x | mkspecs/features/uikit/devices.py (renamed from mkspecs/features/uikit/devices.pl) | 58 | ||||
-rw-r--r-- | mkspecs/features/uikit/xcodebuild.mk | 4 | ||||
-rw-r--r-- | mkspecs/features/uikit/xcodebuild.prf | 6 |
4 files changed, 51 insertions, 23 deletions
diff --git a/mkspecs/features/uikit/device_destinations.sh b/mkspecs/features/uikit/device_destinations.sh index 162ad01aaf..649dd399a7 100755 --- a/mkspecs/features/uikit/device_destinations.sh +++ b/mkspecs/features/uikit/device_destinations.sh @@ -40,10 +40,12 @@ ############################################################################# DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -booted_simulator=$($DIR/devices.pl "$1" "Booted" "NOT unavailable" | tail -n 1) +scheme=$1 +shift +booted_simulator=$($DIR/devices.py --state booted $@ | tail -n 1) echo "SIMULATOR_DEVICES = $booted_simulator" -xcodebuild test -scheme $2 -destination 'id=0' -destination-timeout 1 2>&1| sed -n 's/{ \(platform:.*\) }/\1/p' | while read destination; do +xcodebuild test -scheme $scheme -destination 'id=0' -destination-timeout 1 2>&1| sed -n 's/{ \(platform:.*\) }/\1/p' | while read destination; do id=$(echo $destination | sed -n -E 's/.*id:([^ ,]+).*/\1/p') [[ $id == *"placeholder"* ]] && continue diff --git a/mkspecs/features/uikit/devices.pl b/mkspecs/features/uikit/devices.py index 8d69a97273..0443e838f2 100755 --- a/mkspecs/features/uikit/devices.pl +++ b/mkspecs/features/uikit/devices.py @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/python ############################################################################# ## @@ -39,18 +39,44 @@ ## ############################################################################# -$output = `xcrun simctl list devices --json 2>&1`; -$output =~ s/\n//g; - -BLOCK: -foreach $block ($output =~ /{.*?}/g) { - foreach $filter (@ARGV) { - if ($filter =~ /^NOT\s(.*)/) { - $block =~ /$1/ && next BLOCK; - } else { - $block =~ /$filter/ || next BLOCK; - } - } - $block =~ /udid[:|\s|\"]+(.*)\"/; - print "$1\n"; -} +from __future__ import print_function + +import argparse +import json +import subprocess +from distutils.version import StrictVersion + +def is_suitable_runtime(runtimes, runtime_name, platform, min_version): + for runtime in runtimes: + identifier = runtime["identifier"] + if (runtime["name"] == runtime_name or identifier == runtime_name) \ + and "unavailable" not in runtime["availability"] \ + and identifier.startswith("com.apple.CoreSimulator.SimRuntime.{}".format(platform)) \ + and StrictVersion(runtime["version"]) >= min_version: + return True + return False + +def simctl_runtimes(): + return json.loads(subprocess.check_output( + ["/usr/bin/xcrun", "simctl", "list", "runtimes", "--json"]))["runtimes"] + +def simctl_devices(): + return json.loads(subprocess.check_output( + ["/usr/bin/xcrun", "simctl", "list", "devices", "--json"]))["devices"] + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--platform', choices=['iOS', 'tvOS', 'watchOS'], required=True) + parser.add_argument('--minimum-deployment-target', type=StrictVersion, default='0.0') + parser.add_argument('--state', + choices=['booted', 'shutdown', 'creating', 'booting', 'shutting-down'], action='append') + args = parser.parse_args() + + runtimes = simctl_runtimes() + device_dict = simctl_devices() + for runtime_name in device_dict: + if is_suitable_runtime(runtimes, runtime_name, args.platform, args.minimum_deployment_target): + for device in device_dict[runtime_name]: + if "unavailable" not in device["availability"] \ + and (args.state is None or device["state"].lower() in args.state): + print(device["udid"]) diff --git a/mkspecs/features/uikit/xcodebuild.mk b/mkspecs/features/uikit/xcodebuild.mk index 0b3ad632b6..435b9dbdf2 100644 --- a/mkspecs/features/uikit/xcodebuild.mk +++ b/mkspecs/features/uikit/xcodebuild.mk @@ -63,7 +63,7 @@ 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 '$(EXPORT_DEVICE_FILTER)' $(TARGET) > $(DESTINATIONS_INCLUDE)) + $(shell $(MAKEFILE_DIR)device_destinations.sh $(TARGET) $(EXPORT_DEVICE_FILTER) > $(DESTINATIONS_INCLUDE)) include $(DESTINATIONS_INCLUDE) endif endif @@ -72,7 +72,7 @@ endif %-device: DEVICES = $(HARDWARE_DEVICES) GENERIC_DEVICE_DESTINATION := $(EXPORT_GENERIC_DEVICE_DESTINATION) -GENERIC_SIMULATOR_DESTINATION := "id=$(shell $(MAKEFILE_DIR)devices.pl '$(EXPORT_DEVICE_FILTER)' "NOT unavailable" | tail -n 1)" +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)) diff --git a/mkspecs/features/uikit/xcodebuild.prf b/mkspecs/features/uikit/xcodebuild.prf index a766b9ea5c..7a6b2acfc2 100644 --- a/mkspecs/features/uikit/xcodebuild.prf +++ b/mkspecs/features/uikit/xcodebuild.prf @@ -40,15 +40,15 @@ CONFIG += no_default_goal_deps DEVICE_SDK = $${device.sdk} SIMULATOR_SDK = $${simulator.sdk} ios { - DEVICE_FILTER = "iPhone|iPad" + DEVICE_FILTER = --platform iOS --minimum-deployment-target $$QMAKE_IOS_DEPLOYMENT_TARGET GENERIC_DEVICE_DESTINATION = "generic/platform=iOS" } tvos { - DEVICE_FILTER = "Apple TV" + DEVICE_FILTER = --platform tvOS --minimum-deployment-target $$QMAKE_TVOS_DEPLOYMENT_TARGET GENERIC_DEVICE_DESTINATION = "generic/platform=tvOS" } watchos { - DEVICE_FILTER = "Apple Watch" + DEVICE_FILTER = --platform watchOS --minimum-deployment-target $$QMAKE_WATCHOS_DEPLOYMENT_TARGET GENERIC_DEVICE_DESTINATION = "generic/platform=watchOS" } QMAKE_EXTRA_VARIABLES += DEVICE_SDK SIMULATOR_SDK DEVICE_FILTER GENERIC_DEVICE_DESTINATION |