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