import re import os import subprocess from .builder import Builder from lldbsuite.test import configuration import lldbsuite.test.lldbutil as lldbutil REMOTE_PLATFORM_NAME_RE = re.compile(r"^remote-(.+)$") SIMULATOR_PLATFORM_RE = re.compile(r"^(.+)-simulator$") def get_os_env_from_platform(platform): match = REMOTE_PLATFORM_NAME_RE.match(platform) if match: return match.group(1), "" match = SIMULATOR_PLATFORM_RE.match(platform) if match: return match.group(1), "simulator" return None, None def get_os_from_sdk(sdk): return sdk[:sdk.find('.')], "" def get_os_and_env(): if configuration.lldb_platform_name: return get_os_env_from_platform(configuration.lldb_platform_name) if configuration.apple_sdk: return get_os_from_sdk(configuration.apple_sdk) return None, None def get_triple(): # Construct the vendor component. vendor = "apple" # Construct the os component. os, env = get_os_and_env() if os is None or env is None: return None, None, None, None # Get the SDK from the os and env. sdk = lldbutil.get_xcode_sdk(os, env) if sdk is None: return None, None, None, None # Get the version from the SDK. version = lldbutil.get_xcode_sdk_version(sdk) if version is None: return None, None, None, None return vendor, os, version, env def get_triple_str(arch, vendor, os, version, env): if None in [arch, vendor, os, version, env]: return None component = [arch, vendor, os + version] if env: components.append(env) return '-'.join(component) class BuilderDarwin(Builder): def getTriple(self, arch): vendor, os, version, env = get_triple() return get_triple_str(arch, vendor, os, version, env) def getExtraMakeArgs(self): """ Helper function to return extra argumentsfor the make system. This method is meant to be overridden by platform specific builders. """ args = dict() if configuration.dsymutil: args['DSYMUTIL'] = configuration.dsymutil if configuration.apple_sdk and 'internal' in configuration.apple_sdk: sdk_root = lldbutil.get_xcode_sdk_root(configuration.apple_sdk) if sdk_root: private_frameworks = os.path.join(sdk_root, 'System', 'Library', 'PrivateFrameworks') args['FRAMEWORK_INCLUDES'] = '-F{}'.format(private_frameworks) operating_system, env = get_os_and_env() if operating_system and operating_system != "macosx": builder_dir = os.path.dirname(os.path.abspath(__file__)) test_dir = os.path.dirname(builder_dir) if env == "simulator": entitlements_file = 'entitlements-simulator.plist' else: entitlements_file = 'entitlements.plist' entitlements = os.path.join(test_dir, 'make', entitlements_file) args['CODESIGN'] = 'codesign --entitlements {}'.format( entitlements) else: args['CODESIGN'] = 'codesign' # Return extra args as a formatted string. return ['{}={}'.format(key, value) for key, value in args.items()] def getArchCFlags(self, arch): """Returns the ARCH_CFLAGS for the make system.""" # Get the triple components. vendor, os, version, env = get_triple() triple = get_triple_str(arch, vendor, os, version, env) if not triple: return [] # Construct min version argument version_min = "" if env == "simulator": version_min = "-m{}-simulator-version-min={}".format(os, version) else: version_min = "-m{}-version-min={}".format(os, version) return ["ARCH_CFLAGS=-target {} {}".format(triple, version_min)] def _getDebugInfoArgs(self, debug_info): if debug_info == "dsym": return ["MAKE_DSYM=YES"] return super(BuilderDarwin, self)._getDebugInfoArgs(debug_info)