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