104 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| #!/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()
 |