Home | History | Annotate | Download | only in yasm
      1 # Copyright 2014 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 """A wrapper to run yasm.
      6 
      7 Its main job is to provide a Python wrapper for GN integration, and to write
      8 the makefile-style output yasm generates in stdout to a .d file for dependency
      9 management of .inc files.
     10 
     11 Run with:
     12   python run_yasm.py <yasm_binary_path> <all other yasm args>
     13 
     14 Note that <all other yasm args> must include an explicit output file (-o). This
     15 script will append a ".d" to this and write the dependencies there. This script
     16 will add "-M" to cause yasm to write the deps to stdout, so you don't need to
     17 specify that.
     18 """
     19 
     20 import argparse
     21 import sys
     22 import subprocess
     23 
     24 # Extract the output file name from the yasm command line so we can generate a
     25 # .d file with the same base name.
     26 parser = argparse.ArgumentParser()
     27 parser.add_argument("-o", dest="objfile")
     28 options, _ = parser.parse_known_args()
     29 
     30 objfile = options.objfile
     31 depfile = objfile + '.d'
     32 
     33 # Assemble.
     34 result_code = subprocess.call(sys.argv[1:])
     35 if result_code != 0:
     36   sys.exit(result_code)
     37 
     38 # Now generate the .d file listing the dependencies. The -M option makes yasm
     39 # write the Makefile-style dependencies to stdout, but it seems that inhibits
     40 # generating any compiled output so we need to do this in a separate pass.
     41 # However, outputting deps seems faster than actually assembling, and yasm is
     42 # so fast anyway this is not a big deal.
     43 #
     44 # This guarantees proper dependency management for assembly files. Otherwise,
     45 # we would have to require people to manually specify the .inc files they
     46 # depend on in the build file, which will surely be wrong or out-of-date in
     47 # some cases.
     48 deps = subprocess.check_output(sys.argv[1:] + ['-M'])
     49 with open(depfile, "wb") as f:
     50   f.write(deps)
     51 
     52