diff options
Diffstat (limited to 'config/create_res.py')
-rw-r--r-- | config/create_res.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/config/create_res.py b/config/create_res.py new file mode 100644 index 0000000000..a0f6f600b1 --- /dev/null +++ b/config/create_res.py @@ -0,0 +1,102 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import os +import subprocess +import sys +import tempfile +from argparse import Action, ArgumentParser + +import buildconfig + + +class CPPFlag(Action): + all_flags = [] + + def __call__(self, parser, namespace, values, option_string=None): + if "windres" in buildconfig.substs["RC"].lower(): + if option_string == "-U": + return + if option_string == "-I": + option_string = "--include-dir" + + self.all_flags.extend((option_string, values)) + + +def generate_res(): + parser = ArgumentParser() + parser.add_argument( + "-D", action=CPPFlag, metavar="VAR[=VAL]", help="Define a variable" + ) + parser.add_argument("-U", action=CPPFlag, metavar="VAR", help="Undefine a variable") + parser.add_argument( + "-I", action=CPPFlag, metavar="DIR", help="Search path for includes" + ) + parser.add_argument("-o", dest="output", metavar="OUTPUT", help="Output file") + parser.add_argument("input", help="Input file") + args = parser.parse_args() + + is_windres = "windres" in buildconfig.substs["RC"].lower() + + verbose = os.environ.get("BUILD_VERBOSE_LOG") + + # llvm-rc doesn't preprocess on its own, so preprocess manually + # Theoretically, not windres could be rc.exe, but configure won't use it + # unless you really ask for it, and it will still work with preprocessed + # output. + try: + if not is_windres: + fd, path = tempfile.mkstemp(suffix=".rc") + command = buildconfig.substs["CXXCPP"] + CPPFlag.all_flags + command.extend(("-DRC_INVOKED", args.input)) + + cpu_arch_dict = {"x86_64": "_AMD64_", "x86": "_X86_", "aarch64": "_ARM64_"} + + # add a preprocessor #define that specifies the CPU architecture + cpu_arch_ppd = cpu_arch_dict[buildconfig.substs["CPU_ARCH"]] + + command.extend(("-D", cpu_arch_ppd)) + + if verbose: + print("Executing:", " ".join(command)) + with os.fdopen(fd, "wb") as fh: + retcode = subprocess.run(command, stdout=fh).returncode + if retcode: + # Rely on the subprocess printing out any relevant error + return retcode + else: + path = args.input + + command = [buildconfig.substs["RC"]] + if is_windres: + command.extend(("-O", "coff")) + + # Even though llvm-rc doesn't preprocess, we still need to pass at least + # the -I flags. + command.extend(CPPFlag.all_flags) + + if args.output: + if is_windres: + command.extend(("-o", args.output)) + else: + # Use win1252 code page for the input. + command.extend(("-c", "1252", "-Fo" + args.output)) + + command.append(path) + + if verbose: + print("Executing:", " ".join(command)) + retcode = subprocess.run(command).returncode + if retcode: + # Rely on the subprocess printing out any relevant error + return retcode + finally: + if path != args.input: + os.remove(path) + + return 0 + + +if __name__ == "__main__": + sys.exit(generate_res()) |