File: sysroot.py

package info (click to toggle)
llvm-toolchain-13 1%3A13.0.1-11
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,418,840 kB
  • sloc: cpp: 5,290,826; ansic: 996,570; asm: 544,593; python: 188,212; objc: 72,027; lisp: 30,291; f90: 25,395; sh: 24,898; javascript: 9,780; pascal: 9,398; perl: 7,484; ml: 5,432; awk: 3,523; makefile: 2,913; xml: 953; cs: 573; fortran: 539
file content (98 lines) | stat: -rwxr-xr-x 3,807 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/env python3

"""Helps manage sysroots."""

import argparse
import os
import subprocess
import sys


def make_fake_sysroot(out_dir):
    def cmdout(cmd):
        return subprocess.check_output(cmd).decode(sys.stdout.encoding).strip()

    if sys.platform == 'win32':
        p = os.getenv('ProgramFiles(x86)', 'C:\\Program Files (x86)')

        winsdk = os.getenv('WindowsSdkDir')
        if not winsdk:
            winsdk = os.path.join(p, 'Windows Kits', '10')
            print('%WindowsSdkDir% not set. You might want to run this from')
            print('a Visual Studio cmd prompt. Defaulting to', winsdk)

        vswhere = os.path.join(
                p, 'Microsoft Visual Studio', 'Installer', 'vswhere')
        vcid = 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64'
        vsinstalldir = cmdout(
                [vswhere, '-latest', '-products', '*', '-requires', vcid,
                    '-property', 'installationPath'])

        def mkjunction(dst, src):
            subprocess.check_call(['mklink', '/j', dst, src], shell=True)
        os.mkdir(out_dir)
        mkjunction(os.path.join(out_dir, 'VC'),
                   os.path.join(vsinstalldir, 'VC'))
        os.mkdir(os.path.join(out_dir, 'Windows Kits'))
        mkjunction(os.path.join(out_dir, 'Windows Kits', '10'), winsdk)
    elif sys.platform == 'darwin':
        # The SDKs used by default in compiler-rt/cmake/base-config-ix.cmake.
        # COMPILER_RT_ENABLE_IOS defaults to on.
        # COMPILER_RT_ENABLE_WATCHOS and COMPILER_RT_ENABLE_TV default to off.
        # compiler-rt/cmake/config-ix.cmake sets DARWIN_EMBEDDED_PLATFORMS
        # depending on these.
        sdks = ['macosx', 'iphoneos', 'iphonesimulator']
        os.mkdir(out_dir)
        for sdk in sdks:
          sdkpath = cmdout(['xcrun', '-sdk', sdk, '-show-sdk-path'])
          # sdkpath is something like /.../SDKs/MacOSX11.1.sdk, which is a
          # symlink to MacOSX.sdk in the same directory. Resolve the symlink,
          # to make the symlink in out_dir less likely to break when the SDK
          # is updated (which will bump the number on xcrun's output, but not
          # on the symlink destination).
          sdkpath = os.path.realpath(sdkpath)
          os.symlink(sdkpath, os.path.join(out_dir, os.path.basename(sdkpath)))
    else:
        os.symlink('/', out_dir)

    print('Done. Pass these flags to cmake:')
    abs_out_dir = os.path.abspath(out_dir)
    if sys.platform == 'win32':
        # CMake doesn't like backslashes in commandline args.
        abs_out_dir = abs_out_dir.replace(os.path.sep, '/')
        print('  -DLLVM_WINSYSROOT=' + abs_out_dir)
    elif sys.platform == 'darwin':
        flags = [
          '-DCMAKE_OSX_SYSROOT=' + os.path.join(abs_out_dir, 'MacOSX.sdk'),

          # For find_darwin_sdk_dir() in
          # compiler-rt/cmake/Modules/CompilerRTDarwinUtils.cmake
          '-DDARWIN_macosx_CACHED_SYSROOT=' +
              os.path.join(abs_out_dir, 'MacOSX.sdk'),
          '-DDARWIN_iphoneos_CACHED_SYSROOT=' +
              os.path.join(abs_out_dir, 'iPhoneOS.sdk'),
          '-DDARWIN_iphonesimulator_CACHED_SYSROOT=' +
              os.path.join(abs_out_dir, 'iPhoneSimulator.sdk'),
        ]
        print('  ' + ' '.join(flags))
    else:
        print('  -DCMAKE_SYSROOT=' + abs_out_dir + ' to cmake.')


def main():
    parser = argparse.ArgumentParser(description=__doc__)

    subparsers = parser.add_subparsers(dest='command', required=True)

    makefake = subparsers.add_parser('make-fake',
            help='Create a sysroot that symlinks to local directories.')
    makefake.add_argument('--out-dir', required=True)

    args = parser.parse_args()

    assert args.command == 'make-fake'
    make_fake_sysroot(args.out_dir)


if __name__ == '__main__':
    main()