# 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 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' # 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)