1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- import subprocess
- import os
- import sys
- import json
- # 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 process_whole_archive_option as pwa
- def out2err(cmd):
- return subprocess.Popen(cmd, stdout=sys.stderr).wait()
- def decoding_needed(strval):
- if sys.version_info >= (3, 0, 0):
- return isinstance(strval, bytes)
- else:
- return False
- def out2err_cut_first_line(cmd):
- p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
- first_line = True
- while True:
- line = p.stdout.readline()
- line = line.decode('utf-8') if decoding_needed(line) else line
- if not line:
- break
- if first_line:
- sys.stdout.write(line)
- first_line = False
- else:
- sys.stderr.write(line)
- return p.wait()
- if __name__ == '__main__':
- args = sys.argv[1:]
- mode = args[0]
- plugins = []
- if mode == 'link' and '--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] + args).decode().strip()
- if res:
- args = json.loads(res)
- args, wa_peers, wa_libs = pwa.get_whole_archive_peers_and_libs(pcf.skip_markers(args[1:]))
- cmd = pwa.ProcessWholeArchiveOption('WINDOWS', wa_peers, wa_libs).construct_cmd(args)
- run = out2err
- if mode in ('cl', 'ml'):
- # First line of cl.exe and ml64.exe stdout is useless: it prints input file
- run = out2err_cut_first_line
- sys.exit(run(cmd))
|