Lei Zhang | 0e5d892 | 2017-04-06 21:43:50 -0700 | [diff] [blame] | 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 | |