xref: /openbsd-src/gnu/llvm/lldb/packages/Python/lldbsuite/test/builders/darwin.py (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1be691f3bSpatrickimport re
2be691f3bSpatrickimport os
3be691f3bSpatrickimport subprocess
4be691f3bSpatrick
5be691f3bSpatrickfrom .builder import Builder
6be691f3bSpatrickfrom lldbsuite.test import configuration
7be691f3bSpatrickimport lldbsuite.test.lldbutil as lldbutil
8be691f3bSpatrick
9be691f3bSpatrickREMOTE_PLATFORM_NAME_RE = re.compile(r"^remote-(.+)$")
10be691f3bSpatrickSIMULATOR_PLATFORM_RE = re.compile(r"^(.+)-simulator$")
11be691f3bSpatrick
12be691f3bSpatrick
13be691f3bSpatrickdef get_os_env_from_platform(platform):
14be691f3bSpatrick    match = REMOTE_PLATFORM_NAME_RE.match(platform)
15be691f3bSpatrick    if match:
16be691f3bSpatrick        return match.group(1), ""
17be691f3bSpatrick    match = SIMULATOR_PLATFORM_RE.match(platform)
18be691f3bSpatrick    if match:
19be691f3bSpatrick        return match.group(1), "simulator"
20be691f3bSpatrick    return None, None
21be691f3bSpatrick
22be691f3bSpatrick
23be691f3bSpatrickdef get_os_from_sdk(sdk):
24be691f3bSpatrick    return sdk[:sdk.find('.')], ""
25be691f3bSpatrick
26be691f3bSpatrick
27be691f3bSpatrickdef get_os_and_env():
28be691f3bSpatrick    if configuration.lldb_platform_name:
29be691f3bSpatrick        return get_os_env_from_platform(configuration.lldb_platform_name)
30be691f3bSpatrick    if configuration.apple_sdk:
31be691f3bSpatrick        return get_os_from_sdk(configuration.apple_sdk)
32be691f3bSpatrick    return None, None
33be691f3bSpatrick
34be691f3bSpatrick
35be691f3bSpatrickdef get_triple():
36be691f3bSpatrick    # Construct the vendor component.
37be691f3bSpatrick    vendor = "apple"
38be691f3bSpatrick
39be691f3bSpatrick    # Construct the os component.
40be691f3bSpatrick    os, env = get_os_and_env()
41be691f3bSpatrick    if os is None or env is None:
42be691f3bSpatrick        return None, None, None, None
43be691f3bSpatrick
44be691f3bSpatrick    # Get the SDK from the os and env.
45be691f3bSpatrick    sdk = lldbutil.get_xcode_sdk(os, env)
46be691f3bSpatrick    if sdk is None:
47be691f3bSpatrick        return None, None, None, None
48be691f3bSpatrick
49be691f3bSpatrick    # Get the version from the SDK.
50be691f3bSpatrick    version = lldbutil.get_xcode_sdk_version(sdk)
51be691f3bSpatrick    if version is None:
52be691f3bSpatrick        return None, None, None, None
53be691f3bSpatrick
54be691f3bSpatrick    return vendor, os, version, env
55be691f3bSpatrick
56be691f3bSpatrick
57*f6aab3d8Srobertdef get_triple_str(arch, vendor, os, version, env):
58*f6aab3d8Srobert    if None in [arch, vendor, os, version, env]:
59*f6aab3d8Srobert        return None
60*f6aab3d8Srobert
61*f6aab3d8Srobert    component = [arch, vendor, os + version]
62*f6aab3d8Srobert    if env:
63*f6aab3d8Srobert        components.append(env)
64*f6aab3d8Srobert    return '-'.join(component)
65*f6aab3d8Srobert
66*f6aab3d8Srobert
67be691f3bSpatrickclass BuilderDarwin(Builder):
68*f6aab3d8Srobert    def getTriple(self, arch):
69*f6aab3d8Srobert        vendor, os, version, env = get_triple()
70*f6aab3d8Srobert        return get_triple_str(arch, vendor, os, version, env)
71*f6aab3d8Srobert
72be691f3bSpatrick    def getExtraMakeArgs(self):
73be691f3bSpatrick        """
74be691f3bSpatrick        Helper function to return extra argumentsfor the make system. This
75be691f3bSpatrick        method is meant to be overridden by platform specific builders.
76be691f3bSpatrick        """
77be691f3bSpatrick        args = dict()
78be691f3bSpatrick
79be691f3bSpatrick        if configuration.dsymutil:
80be691f3bSpatrick            args['DSYMUTIL'] = configuration.dsymutil
81be691f3bSpatrick
82*f6aab3d8Srobert        if configuration.apple_sdk and 'internal' in configuration.apple_sdk:
83*f6aab3d8Srobert            sdk_root = lldbutil.get_xcode_sdk_root(configuration.apple_sdk)
84*f6aab3d8Srobert            if sdk_root:
85*f6aab3d8Srobert                private_frameworks = os.path.join(sdk_root, 'System',
86*f6aab3d8Srobert                                                  'Library',
87*f6aab3d8Srobert                                                  'PrivateFrameworks')
88*f6aab3d8Srobert                args['FRAMEWORK_INCLUDES'] = '-F{}'.format(private_frameworks)
89*f6aab3d8Srobert
90be691f3bSpatrick        operating_system, env = get_os_and_env()
91be691f3bSpatrick        if operating_system and operating_system != "macosx":
92be691f3bSpatrick            builder_dir = os.path.dirname(os.path.abspath(__file__))
93be691f3bSpatrick            test_dir = os.path.dirname(builder_dir)
94be691f3bSpatrick            if env == "simulator":
95be691f3bSpatrick                entitlements_file = 'entitlements-simulator.plist'
96be691f3bSpatrick            else:
97be691f3bSpatrick                entitlements_file = 'entitlements.plist'
98be691f3bSpatrick            entitlements = os.path.join(test_dir, 'make', entitlements_file)
99be691f3bSpatrick            args['CODESIGN'] = 'codesign --entitlements {}'.format(
100be691f3bSpatrick                entitlements)
101*f6aab3d8Srobert        else:
102*f6aab3d8Srobert            args['CODESIGN'] = 'codesign'
103be691f3bSpatrick
104be691f3bSpatrick        # Return extra args as a formatted string.
105*f6aab3d8Srobert        return ['{}={}'.format(key, value) for key, value in args.items()]
106be691f3bSpatrick
107be691f3bSpatrick    def getArchCFlags(self, arch):
108be691f3bSpatrick        """Returns the ARCH_CFLAGS for the make system."""
109be691f3bSpatrick        # Get the triple components.
110be691f3bSpatrick        vendor, os, version, env = get_triple()
111*f6aab3d8Srobert        triple = get_triple_str(arch, vendor, os, version, env)
112*f6aab3d8Srobert        if not triple:
113*f6aab3d8Srobert            return []
114be691f3bSpatrick
115be691f3bSpatrick        # Construct min version argument
116be691f3bSpatrick        version_min = ""
117be691f3bSpatrick        if env == "simulator":
118be691f3bSpatrick            version_min = "-m{}-simulator-version-min={}".format(os, version)
119*f6aab3d8Srobert        else:
120be691f3bSpatrick            version_min = "-m{}-version-min={}".format(os, version)
121be691f3bSpatrick
122*f6aab3d8Srobert        return ["ARCH_CFLAGS=-target {} {}".format(triple, version_min)]
123be691f3bSpatrick
124*f6aab3d8Srobert    def _getDebugInfoArgs(self, debug_info):
125*f6aab3d8Srobert        if debug_info == "dsym":
126*f6aab3d8Srobert            return ["MAKE_DSYM=YES"]
127*f6aab3d8Srobert        return super(BuilderDarwin, self)._getDebugInfoArgs(debug_info)
128