| #!/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": |
| |
| def mkjunction(dst, src): |
| subprocess.check_call(["mklink", "/j", dst, src], shell=True) |
| |
| os.mkdir(out_dir) |
| 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) |
| os.mkdir(os.path.join(out_dir, "Windows Kits")) |
| mkjunction(os.path.join(out_dir, "Windows Kits", "10"), 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", |
| ] |
| ) |
| |
| mkjunction(os.path.join(out_dir, "VC"), os.path.join(vsinstalldir, "VC")) |
| # Not all MSVC versions ship the DIA SDK, so the junction destination |
| # might not exist. That's fine. |
| mkjunction( |
| os.path.join(out_dir, "DIA SDK"), os.path.join(vsinstalldir, "DIA SDK") |
| ) |
| 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() |