• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python
2"""Generate Abseil compile compile option configs.
3
4Usage: <path_to_absl>/copts/generate_copts.py
5
6The configs are generated from copts.py.
7"""
8
9from os import path
10import sys
11from copts import COPT_VARS
12
13
14# Helper functions
15def 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
23def flatten(*lists):
24  return [item for sublist in lists for item in sublist]
25
26
27def 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.
33class 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
52class 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
73def 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
86def 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
100def 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
108if __name__ == "__main__":
109  main(sys.argv)
110