aboutsummaryrefslogtreecommitdiffstats
path: root/build/scripts/fix_msvc_output.py
blob: c9694afbc8da89be514f6c7537c4967ac54791cf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import subprocess
import sys

import process_command_files as pcf
import process_whole_archive_option as pwa

from fix_py2_protobuf import fix_py2


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__':
    mode = sys.argv[1]
    args, wa_peers, wa_libs = pwa.get_whole_archive_peers_and_libs(pcf.skip_markers(sys.argv[2:]))
    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
    if mode == 'link':
        cmd = fix_py2(cmd, have_comand_files=True, prefix='', suffix='lib')
    sys.exit(run(cmd))