| # Copyright 2013 The Flutter Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import sys |
| |
| import argparse |
| import errno |
| import os |
| import subprocess |
| |
| |
| def make_directories(path): |
| try: |
| os.makedirs(path) |
| except OSError as exc: |
| if exc.errno == errno.EEXIST and os.path.isdir(path): |
| pass |
| else: |
| raise |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| '--output', |
| type=str, |
| required=True, |
| help='The location to generate the Metal library to.' |
| ) |
| parser.add_argument( |
| '--depfile', type=str, required=True, help='The location of the depfile.' |
| ) |
| parser.add_argument( |
| '--source', |
| type=str, |
| action='append', |
| required=True, |
| help='The source file to compile. Can be specified multiple times.' |
| ) |
| parser.add_argument( |
| '--platform', |
| required=True, |
| choices=['mac', 'ios', 'ios-simulator'], |
| help='Select the platform.' |
| ) |
| parser.add_argument( |
| '--metal-version', |
| required=True, |
| help='The language standard version to compile for.' |
| ) |
| |
| args = parser.parse_args() |
| |
| make_directories(os.path.dirname(args.depfile)) |
| |
| command = [ |
| 'xcrun', |
| ] |
| |
| # Select the SDK. |
| command += ['-sdk'] |
| if args.platform == 'mac': |
| command += [ |
| 'macosx', |
| ] |
| elif args.platform == 'ios': |
| command += [ |
| 'iphoneos', |
| ] |
| elif args.platform == 'ios-simulator': |
| command += [ |
| 'iphonesimulator', |
| ] |
| else: |
| raise 'Unknown target platform' |
| |
| command += [ |
| 'metal', |
| # These warnings are from generated code and would make no sense to the |
| # GLSL author. |
| '-Wno-unused-variable', |
| # Both user and system header will be tracked. |
| '-MMD', |
| # Like -Os (and thus -O2), but reduces code size further. |
| '-Oz', |
| # Allow aggressive, lossy floating-point optimizations. |
| '-ffast-math', |
| # Record symbols in a separate *.metallibsym file. |
| '-frecord-sources=flat', |
| '-MF', |
| args.depfile, |
| '-o', |
| args.output, |
| ] |
| |
| # Select the Metal standard and the minimum supported OS versions. |
| # The Metal standard must match the specification in impellerc. |
| if args.platform == 'mac': |
| command += [ |
| '--std=macos-metal%s' % args.metal_version, |
| '-mmacos-version-min=10.14', |
| ] |
| elif args.platform == 'ios': |
| command += [ |
| '--std=ios-metal%s' % args.metal_version, |
| '-mios-version-min=11.0', |
| ] |
| elif args.platform == 'ios-simulator': |
| command += [ |
| '--std=ios-metal%s' % args.metal_version, |
| '-miphonesimulator-version-min=11.0', |
| ] |
| else: |
| raise 'Unknown target platform' |
| |
| command += args.source |
| |
| try: |
| subprocess.check_output(command, stderr=subprocess.STDOUT, text=True) |
| except subprocess.CalledProcessError as cpe: |
| print(cpe.output) |
| return cpe.returncode |
| |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| if sys.platform != 'darwin': |
| raise Exception('This script only runs on Mac') |
| sys.exit(main()) |