| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """A wrapper to run yasm. |
| |
| Its main job is to provide a Python wrapper for GN integration, and to write |
| the makefile-style output yasm generates in stdout to a .d file for dependency |
| management of .inc files. |
| |
| Run with: |
| python run_yasm.py <yasm_binary_path> <all other yasm args> |
| |
| Note that <all other yasm args> must include an explicit output file (-o). This |
| script will append a ".d" to this and write the dependencies there. This script |
| will add "-M" to cause yasm to write the deps to stdout, so you don't need to |
| specify that. |
| """ |
| |
| import argparse |
| import os |
| import sys |
| import subprocess |
| |
| # Extract the output file name from the yasm command line so we can generate a |
| # .d file with the same base name. |
| parser = argparse.ArgumentParser() |
| parser.add_argument("-o", dest="objfile") |
| options, _ = parser.parse_known_args() |
| |
| objfile = options.objfile |
| depfile = objfile + '.d' |
| |
| # Set up environment for yasm. |
| # Setting YASM_TEST_SUITE makes yasm output deterministic: |
| # - the PE/COFF timestamp field is always 0 (this breaks link.exe /incremental, |
| # but we no longer user link.exe) |
| # - in debug info, yasm identifies itself as "yasm HEAD" instead of e.g. |
| # "yasm 1.3.0" (we don't care much about this effect) |
| # - in debug info, file paths are no longer absolute but relative to '.' |
| os.environ['YASM_TEST_SUITE'] = '1' |
| |
| # Assemble. |
| result_code = subprocess.call(sys.argv[1:]) |
| if result_code != 0: |
| sys.exit(result_code) |
| |
| # Now generate the .d file listing the dependencies. The -M option makes yasm |
| # write the Makefile-style dependencies to stdout, but it seems that inhibits |
| # generating any compiled output so we need to do this in a separate pass. |
| # However, outputting deps seems faster than actually assembling, and yasm is |
| # so fast anyway this is not a big deal. |
| # |
| # This guarantees proper dependency management for assembly files. Otherwise, |
| # we would have to require people to manually specify the .inc files they |
| # depend on in the build file, which will surely be wrong or out-of-date in |
| # some cases. |
| deps = subprocess.check_output(sys.argv[1:] + ['-M']) |
| with open(depfile, "wb") as f: |
| f.write(deps) |
| |