| #!/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() |