| 1 | """
 | 
| 2 | frontend/NINJA_subgraph.py
 | 
| 3 | """
 | 
| 4 | 
 | 
| 5 | from __future__ import print_function
 | 
| 6 | 
 | 
| 7 | from build import ninja_lib
 | 
| 8 | from build.ninja_lib import log
 | 
| 9 | 
 | 
| 10 | _ = log
 | 
| 11 | 
 | 
| 12 | 
 | 
| 13 | def NinjaGraph(ru):
 | 
| 14 |     n = ru.n
 | 
| 15 | 
 | 
| 16 |     ru.comment('Generated by %s' % __name__)
 | 
| 17 | 
 | 
| 18 |     n.rule('consts-gen',
 | 
| 19 |            command='_bin/shwrap/consts_gen $action $out_prefix',
 | 
| 20 |            description='consts_gen $action $out_prefix')
 | 
| 21 | 
 | 
| 22 |     n.rule('flag-gen',
 | 
| 23 |            command='_bin/shwrap/flag_gen $action $out_prefix',
 | 
| 24 |            description='flag_gen $action $out_prefix')
 | 
| 25 | 
 | 
| 26 |     n.rule('option-gen',
 | 
| 27 |            command='_bin/shwrap/option_gen $action $out_prefix',
 | 
| 28 |            description='consts_gen $action $out_prefix')
 | 
| 29 | 
 | 
| 30 |     n.rule('signal-gen',
 | 
| 31 |            command='_bin/shwrap/signal_gen $action $out_prefix',
 | 
| 32 |            description='signal_gen $action $out_prefix')
 | 
| 33 | 
 | 
| 34 |     ru.py_binary('frontend/consts_gen.py')
 | 
| 35 | 
 | 
| 36 |     ru.py_binary('frontend/flag_gen.py')
 | 
| 37 | 
 | 
| 38 |     # TODO: hook this up
 | 
| 39 |     #ru.py_binary('frontend/lexer_gen.py')
 | 
| 40 | 
 | 
| 41 |     ru.py_binary('frontend/option_gen.py')
 | 
| 42 | 
 | 
| 43 |     ru.py_binary('frontend/signal_gen.py')
 | 
| 44 | 
 | 
| 45 |     prefix = '_gen/frontend/id_kind.asdl'
 | 
| 46 |     n.build([prefix + '.h', prefix + '.cc'],
 | 
| 47 |             'consts-gen', [],
 | 
| 48 |             implicit=['_bin/shwrap/consts_gen'],
 | 
| 49 |             variables=[
 | 
| 50 |                 ('out_prefix', prefix),
 | 
| 51 |                 ('action', 'cpp'),
 | 
| 52 |             ])
 | 
| 53 |     n.newline()
 | 
| 54 | 
 | 
| 55 |     ru.cc_library(
 | 
| 56 |         '//frontend/help_meta',
 | 
| 57 |         srcs=['_gen/frontend/help_meta.cc'],
 | 
| 58 |         # generated by build/py.all -> build/doc.sh all-help -> doctools/help_gen.py
 | 
| 59 |         generated_headers=['_gen/frontend/help_meta.h'])
 | 
| 60 | 
 | 
| 61 |     ru.cc_library('//frontend/id_kind.asdl',
 | 
| 62 |                   srcs=['_gen/frontend/id_kind.asdl.cc'],
 | 
| 63 |                   generated_headers=['_gen/frontend/id_kind.asdl.h'])
 | 
| 64 | 
 | 
| 65 |     # Similar to above
 | 
| 66 |     prefix = '_gen/frontend/consts'
 | 
| 67 |     n.build([prefix + '.h', prefix + '.cc'],
 | 
| 68 |             'consts-gen', [],
 | 
| 69 |             implicit=['_bin/shwrap/consts_gen'],
 | 
| 70 |             variables=[
 | 
| 71 |                 ('out_prefix', prefix),
 | 
| 72 |                 ('action', 'cpp-consts'),
 | 
| 73 |             ])
 | 
| 74 |     n.newline()
 | 
| 75 | 
 | 
| 76 |     ru.cc_library(
 | 
| 77 |         '//frontend/consts',
 | 
| 78 |         srcs=['_gen/frontend/consts.cc'],
 | 
| 79 |         generated_headers=['_gen/frontend/consts.h'],
 | 
| 80 |         # See header
 | 
| 81 |         deps=[
 | 
| 82 |             '//core/runtime.asdl',
 | 
| 83 |             '//frontend/id_kind.asdl',
 | 
| 84 |             '//frontend/option.asdl',
 | 
| 85 |             '//frontend/types.asdl',
 | 
| 86 |         ])
 | 
| 87 | 
 | 
| 88 |     prefix = '_gen/frontend/arg_types'
 | 
| 89 |     n.build([prefix + '.h', prefix + '.cc'],
 | 
| 90 |             'flag-gen', [],
 | 
| 91 |             implicit=['_bin/shwrap/flag_gen'],
 | 
| 92 |             variables=[
 | 
| 93 |                 ('out_prefix', prefix),
 | 
| 94 |                 ('action', 'cpp'),
 | 
| 95 |             ])
 | 
| 96 |     n.newline()
 | 
| 97 | 
 | 
| 98 |     ru.cc_library(
 | 
| 99 |         '//frontend/arg_types',
 | 
| 100 |         generated_headers=['_gen/frontend/arg_types.h'],
 | 
| 101 |         srcs=['_gen/frontend/arg_types.cc'],
 | 
| 102 |         deps=['//cpp/frontend_flag_spec'],
 | 
| 103 |     )
 | 
| 104 | 
 | 
| 105 |     ru.cc_binary(
 | 
| 106 |         'frontend/arg_types_test.cc',
 | 
| 107 |         deps=['//frontend/arg_types', '//mycpp/runtime'],
 | 
| 108 |         matrix=ninja_lib.COMPILERS_VARIANTS,
 | 
| 109 |     )
 | 
| 110 | 
 | 
| 111 |     prefix = '_gen/frontend/option.asdl'
 | 
| 112 |     # no .cc file
 | 
| 113 |     n.build([prefix + '.h'],
 | 
| 114 |             'option-gen', [],
 | 
| 115 |             implicit=['_bin/shwrap/option_gen'],
 | 
| 116 |             variables=[
 | 
| 117 |                 ('out_prefix', prefix),
 | 
| 118 |                 ('action', 'cpp'),
 | 
| 119 |             ])
 | 
| 120 |     n.newline()
 | 
| 121 | 
 | 
| 122 |     ru.cc_library('//frontend/option.asdl',
 | 
| 123 |                   srcs=[],
 | 
| 124 |                   generated_headers=['_gen/frontend/option.asdl.h'])
 | 
| 125 | 
 | 
| 126 |     prefix = '_gen/frontend/signal'
 | 
| 127 |     n.build([prefix + '.h', prefix + '.cc'],
 | 
| 128 |             'signal-gen', [],
 | 
| 129 |             implicit=['_bin/shwrap/signal_gen'],
 | 
| 130 |             variables=[
 | 
| 131 |                 ('out_prefix', prefix),
 | 
| 132 |                 ('action', 'cpp'),
 | 
| 133 |             ])
 | 
| 134 |     n.newline()
 | 
| 135 | 
 | 
| 136 |     ru.cc_library('//frontend/signal',
 | 
| 137 |                   srcs=['_gen/frontend/signal.cc'],
 | 
| 138 |                   generated_headers=['_gen/frontend/signal.h'])
 | 
| 139 | 
 | 
| 140 |     ru.asdl_library('frontend/types.asdl', pretty_print_methods=False)
 | 
| 141 | 
 | 
| 142 |     # Uses core/value.asdl, but value.asdl also depeneds on frontend/syntax.asdl
 | 
| 143 |     #
 | 
| 144 |     # In Python, that an import line:
 | 
| 145 |     # if TYPE_CHECKING:
 | 
| 146 |     #    from _devbuild.gen.value_asdl import value_t
 | 
| 147 |     #
 | 
| 148 |     # In C++, it creates a forward declaration in the header namespace value_asdl { class value_t }
 | 
| 149 |     # But an #include in the .cc file, I guess for pretty printing?  Yes
 | 
| 150 |     #
 | 
| 151 |     # Questions:
 | 
| 152 |     # - Do we need the deps at all?  We have different deps
 | 
| 153 |     #   - #include "hnode.asdl.h" - if pretty_print_methods
 | 
| 154 |     #   - #include "id_kind_asdl.h" - if app_types - TODO: should refactor this
 | 
| 155 |     #     - this is using by VALUE, not just by POINTER
 | 
| 156 |     # - Should we create a single asdl_library() target?
 | 
| 157 |     # - What will we do when we switch to tagged pointers?  Then we can't
 | 
| 158 |     # forward declare?
 | 
| 159 | 
 | 
| 160 |     ru.asdl_library(
 | 
| 161 |         'frontend/syntax.asdl',
 | 
| 162 |         deps=[
 | 
| 163 |             # #include in header file
 | 
| 164 |             # Problem: asdl_main.py hard-codes this dependency
 | 
| 165 |             '//frontend/id_kind.asdl',
 | 
| 166 | 
 | 
| 167 |             # This is a circular dep.
 | 
| 168 |             # Hm it did not create a problem?  I guess only cc_library() deps
 | 
| 169 |             # can't be circular?
 | 
| 170 |             '//core/value.asdl',
 | 
| 171 |         ])
 | 
| 172 | 
 | 
| 173 |     ru.cc_binary('frontend/syntax_asdl_test.cc',
 | 
| 174 |                  deps=['//frontend/syntax.asdl'],
 | 
| 175 |                  matrix=ninja_lib.COMPILERS_VARIANTS)
 |