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>bb10
parent
a95936f376
commit
2614108696
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
from __future__ import print_function
|
||||
|
||||
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";
|
||||
}
|
||||
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"])
|
||||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue