129 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
| 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
 | |
| 
 | |
| 
 | |
| class BuilderDarwin(Builder):
 | |
|     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
 | |
| 
 | |
|         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)
 | |
| 
 | |
|         # Return extra args as a formatted string.
 | |
|         return ' '.join(
 | |
|             {'{}="{}"'.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()
 | |
|         if vendor is None or os is None or version is None or env is None:
 | |
|             return ""
 | |
| 
 | |
|         # Construct the triple from its components.
 | |
|         triple = '-'.join([arch, vendor, os, version, env])
 | |
| 
 | |
|         # Construct min version argument
 | |
|         version_min = ""
 | |
|         if env == "simulator":
 | |
|             version_min = "-m{}-simulator-version-min={}".format(os, version)
 | |
|         elif os == "macosx":
 | |
|             version_min = "-m{}-version-min={}".format(os, version)
 | |
| 
 | |
|         return "ARCH_CFLAGS=\"-target {} {}\"".format(triple, version_min)
 | |
| 
 | |
|     def buildDsym(self,
 | |
|                   sender=None,
 | |
|                   architecture=None,
 | |
|                   compiler=None,
 | |
|                   dictionary=None,
 | |
|                   testdir=None,
 | |
|                   testname=None):
 | |
|         """Build the binaries with dsym debug info."""
 | |
|         commands = []
 | |
|         commands.append(
 | |
|             self.getMake(testdir, testname) + [
 | |
|                 "MAKE_DSYM=YES",
 | |
|                 self.getArchCFlags(architecture),
 | |
|                 self.getArchSpec(architecture),
 | |
|                 self.getCCSpec(compiler),
 | |
|                 self.getExtraMakeArgs(),
 | |
|                 self.getSDKRootSpec(),
 | |
|                 self.getModuleCacheSpec(), "all",
 | |
|                 self.getCmdLine(dictionary)
 | |
|             ])
 | |
| 
 | |
|         self.runBuildCommands(commands, sender=sender)
 | |
| 
 | |
|         # True signifies that we can handle building dsym.
 | |
|         return True
 |