Chromium Code Reviews| Index: build/win/message_compiler.py |
| diff --git a/build/win/message_compiler.py b/build/win/message_compiler.py |
| index 86aba4f93009f0a8cee7c1eee3deaf2962ddc1c2..b6fd03ec8ae7d3c86d0da1d436ac7920659e0f27 100644 |
| --- a/build/win/message_compiler.py |
| +++ b/build/win/message_compiler.py |
| @@ -7,22 +7,57 @@ |
| # |
| # Usage: message_compiler.py <environment_file> [<args to mc.exe>*] |
| +import os |
| import subprocess |
| import sys |
| -# Read the environment block from the file. This is stored in the format used |
| -# by CreateProcess. Drop last 2 NULs, one for list terminator, one for trailing |
| -# vs. separator. |
| -env_pairs = open(sys.argv[1]).read()[:-2].split('\0') |
| -env_dict = dict([item.split('=', 1) for item in env_pairs]) |
| +def main(): |
| + # Read the environment block from the file. This is stored in the format used |
| + # by CreateProcess. Drop last 2 NULs, one for list terminator, one for |
| + # trailing vs. separator. |
| + env_pairs = open(sys.argv[1]).read()[:-2].split('\0') |
| + env_dict = dict([item.split('=', 1) for item in env_pairs]) |
| -# mc writes to stderr, so this explicitly redirects to stdout and eats it. |
| -try: |
| - # This needs shell=True to search the path in env_dict for the mc executable. |
| - subprocess.check_output(["mc.exe"] + sys.argv[2:], |
| - env=env_dict, |
| - stderr=subprocess.STDOUT, |
| - shell=True) |
| -except subprocess.CalledProcessError as e: |
| - print e.output |
| - sys.exit(e.returncode) |
| + # mc writes to stderr, so this explicitly redirects to stdout and eats it. |
| + try: |
| + # This needs shell=True to search the path in env_dict for the mc |
| + # executable. |
| + rest = sys.argv[2:] |
| + subprocess.check_output(['mc.exe'] + rest, |
| + env=env_dict, |
| + stderr=subprocess.STDOUT, |
| + shell=True) |
| + # We require all source code (in particular, the header generated here) to |
| + # be UTF-8. jinja can output the intermediate .mc file in UTF-8 or UTF-16LE. |
| + # However, mc.exe only supports Unicode via the -u flag, and it assumes when |
| + # that is specified that the input is UTF-16LE (and errors out on UTF-8 |
| + # files, assuming they're ANSI). Even with -u specified and UTF16-LE input, |
| + # it generates an ANSI header, and includes broken versions of the message |
| + # text in the comment before the value. To work around this, for any invalid |
| + # // comment lines, we simply drop the line in the header after building it. |
|
Nico
2016/11/22 17:45:21
(did you file an msconnect for getting support for
|
| + header_dir = None |
| + input_file = None |
| + for i, arg in enumerate(rest): |
| + if arg == '-h' and len(rest) > i + 1: |
| + assert header_dir == None |
| + header_dir = rest[i + 1] |
| + elif arg.endswith('.mc') or arg.endswith('.man'): |
| + assert input_file == None |
| + input_file = arg |
| + if header_dir: |
| + header_file = os.path.join( |
| + header_dir, os.path.splitext(os.path.basename(input_file))[0] + '.h') |
| + header_contents = [] |
| + with open(header_file, 'rb') as f: |
| + for line in f.readlines(): |
| + if line.startswith('//') and '?' in line: |
| + continue |
| + header_contents.append(line) |
| + with open(header_file, 'wb') as f: |
| + f.write(''.join(header_contents)) |
| + except subprocess.CalledProcessError as e: |
| + print e.output |
| + sys.exit(e.returncode) |
| + |
| +if __name__ == '__main__': |
| + main() |