123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- import itertools
- import os
- import os.path
- import sys
- import json
- import subprocess
- import optparse
- import textwrap
- # Explicitly enable local imports
- # Don't forget to add imported scripts to inputs of the calling command!
- sys.path.append(os.path.dirname(os.path.abspath(__file__)))
- import process_command_files as pcf
- import thinlto_cache
- from process_whole_archive_option import ProcessWholeArchiveOption
- def remove_excessive_flags(cmd):
- flags = []
- for flag in cmd:
- if not flag.endswith('.ios.interface') and not flag.endswith('.pkg.fake'):
- flags.append(flag)
- return flags
- def remove_libs(cmd, libs):
- excluded_flags = ['-l{}'.format(lib) for lib in libs]
- flags = []
- for flag in cmd:
- if flag in excluded_flags:
- continue
- flags.append(flag)
- return flags
- def parse_args(args):
- parser = optparse.OptionParser()
- parser.disable_interspersed_args()
- parser.add_option('--custom-step')
- parser.add_option('--python')
- parser.add_option('--source-root')
- parser.add_option('--build-root')
- parser.add_option('--clang-ver')
- parser.add_option('--dynamic-cuda', action='store_true')
- parser.add_option('--cuda-architectures',
- help='List of supported CUDA architectures, separated by ":" (e.g. "sm_52:compute_70:lto_90a"')
- parser.add_option('--nvprune-exe')
- parser.add_option('--objcopy-exe')
- parser.add_option('--arch')
- parser.add_option('--linker-output')
- parser.add_option('--whole-archive-peers', action='append')
- parser.add_option('--whole-archive-libs', action='append')
- parser.add_option('--exclude-libs', action='append')
- thinlto_cache.add_options(parser)
- return parser.parse_args(args)
- if __name__ == '__main__':
- args = sys.argv[1:]
- plugins = []
- if '--start-plugins' in args:
- ib = args.index('--start-plugins')
- ie = args.index('--end-plugins')
- plugins = args[ib + 1:ie]
- args = args[:ib] + args[ie + 1:]
- for p in plugins:
- res = subprocess.check_output([sys.executable, p, sys.argv[0]] + args).decode().strip()
- if res:
- args = json.loads(res)[1:]
- opts, args = parse_args(args)
- args = pcf.skip_markers(args)
- cmd = args
- cmd = remove_excessive_flags(cmd)
- if opts.exclude_libs:
- cmd = remove_libs(cmd, opts.exclude_libs)
- cmd = ProcessWholeArchiveOption(opts.arch, opts.whole_archive_peers, opts.whole_archive_libs).construct_cmd(cmd)
- if opts.custom_step:
- assert opts.python
- subprocess.check_call([opts.python] + [opts.custom_step] + args)
- if opts.linker_output:
- stdout = open(opts.linker_output, 'w')
- else:
- stdout = sys.stdout
- thinlto_cache.preprocess(opts, cmd)
- rc = subprocess.call(cmd, shell=False, stderr=sys.stderr, stdout=stdout)
- thinlto_cache.postprocess(opts)
- sys.exit(rc)
|