tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

generate_copts.py (2509B)


      1 #!/usr/bin/env python3
      2 """Generate Abseil compile compile option configs.
      3 
      4 Usage: <path_to_absl>/copts/generate_copts.py
      5 
      6 The configs are generated from copts.py.
      7 """
      8 
      9 from os import path
     10 import sys
     11 from copts import COPT_VARS
     12 
     13 
     14 # Helper functions
     15 def file_header_lines():
     16  return [
     17      "GENERATED! DO NOT MANUALLY EDIT THIS FILE.", "",
     18      "(1) Edit absl/copts/copts.py.",
     19      "(2) Run `python <path_to_absl>/copts/generate_copts.py`."
     20  ]
     21 
     22 
     23 def flatten(*lists):
     24  return [item for sublist in lists for item in sublist]
     25 
     26 
     27 def relative_filename(filename):
     28  return path.join(path.dirname(__file__), filename)
     29 
     30 
     31 # Style classes.  These contain all the syntactic styling needed to generate a
     32 # copt file for different build tools.
     33 class CMakeStyle(object):
     34  """Style object for CMake copts file."""
     35 
     36  def separator(self):
     37    return ""
     38 
     39  def list_introducer(self, name):
     40    return "list(APPEND " + name
     41 
     42  def list_closer(self):
     43    return ")\n"
     44 
     45  def docstring(self):
     46    return "\n".join((("# " + line).strip() for line in file_header_lines()))
     47 
     48  def filename(self):
     49    return "GENERATED_AbseilCopts.cmake"
     50 
     51 
     52 class StarlarkStyle(object):
     53  """Style object for Starlark copts file."""
     54 
     55  def separator(self):
     56    return ","
     57 
     58  def list_introducer(self, name):
     59    return name + " = ["
     60 
     61  def list_closer(self):
     62    return "]\n"
     63 
     64  def docstring(self):
     65    docstring_quotes = "\"\"\""
     66    return docstring_quotes + "\n".join(
     67        flatten(file_header_lines(), [docstring_quotes]))
     68 
     69  def filename(self):
     70    return "GENERATED_copts.bzl"
     71 
     72 
     73 def copt_list(name, arg_list, style):
     74  """Copt file generation."""
     75 
     76  make_line = lambda s: "    \"" + s + "\"" + style.separator()
     77  external_str_list = [make_line(s) for s in arg_list]
     78 
     79  return "\n".join(
     80      flatten(
     81          [style.list_introducer(name)],
     82          external_str_list,
     83          [style.list_closer()]))
     84 
     85 
     86 def generate_copt_file(style):
     87  """Creates a generated copt file using the given style object.
     88 
     89  Args:
     90    style: either StarlarkStyle() or CMakeStyle()
     91  """
     92  with open(relative_filename(style.filename()), "w") as f:
     93    f.write(style.docstring())
     94    f.write("\n")
     95    for var_name, arg_list in sorted(COPT_VARS.items()):
     96      f.write("\n")
     97      f.write(copt_list(var_name, arg_list, style))
     98 
     99 
    100 def main(argv):
    101  if len(argv) > 1:
    102    raise RuntimeError("generate_copts needs no command line args")
    103 
    104  generate_copt_file(StarlarkStyle())
    105  generate_copt_file(CMakeStyle())
    106 
    107 
    108 if __name__ == "__main__":
    109  main(sys.argv)