Tint makes use of code generation tooling to emit source code and build files used to build Tint.
All code is generated with ./tools/run gen
.
The generator uses heavy use of Go's text/template package. This is augmented with the functions declared in tools/src/template/template.go
, and the data types provided by the tooling.
The generator will scan all the Tint source directories to produce BUILD.gn
and BUILD.cmake
files. These files contain the per-directory targets, conditionals and inter-target dependency information which is labour-intensive to maintain by hand.
The bulk of the build generator logic is in the file: tools/src/cmd/gen/build/build.go
There are 4 kinds of build target:
lib
targets are libraries used in production code, and can also be used as a dependency by any other target kind .test
targets are libraries used by Tint unittests. Must not be used by production code.bench
targets are libraries used by Tint benchmarks. Must not be used by production code.cmd
targets are executables.The build generator uses a file naming convention to classify each source file to a single target kind:
_test
suffix before the file extension are classed as test
targets. Example: parser_test.cc
._bench
suffix before the file extension are classed as bench
targets. Example: writer_bench.cc
.main.cc
are classed as executable entry-points. These typically exist under src/tint/cmd
. Example: main.cc
.lib
targets. Example: parser.cc
.Each source directory can have at most one lib
, test
, bench
or cmd
target.
The graph of target dependencies must be acyclic (DAG).
Target dependencies are automatically inferred from #include
s made by the source files. Additional target dependencies can be added with the use of a BUILD.cfg
file.
GEN_BUILD
directivesSource and build files can be annotated with special directives in comments to control the build file generation.
Directive | Description |
---|---|
GEN_BUILD:IGNORE | Apply to the end of a #include in a source file to ignore this include for dependency analysis Example: #include "foo/bar.h" // GEN_BUILD:IGNORE |
GEN_BUILD:CONDITION( cond) | Applies the build condition for this source file. Example: // GEN_BUILD:CONDITION(is_linux) |
GEN_BUILD:DO_NOT_GENERATE | Prevents the BUILD.* file from being generated. Example: # GEN_BUILD:DO_NOT_GENERATE |
BUILD.cfg
filesA source directory may have an optional BUILD.cfg
JSON file. The syntax of this file is:
{ /* Build condition to apply to all targets of this directory. */ "Condition": "cond", /* Options for the 'lib' target */ "lib": { /* see TargetConfig */ }, /* Options for the 'test' target */ "test": { /* see TargetConfig */ }, /* Options for the 'bench' target */ "bench": { /* see TargetConfig */ }, /* Options for the 'cmd' target */ "cmd": { /* see TargetConfig */ }, }
All fields are optional.
The syntax of TargetConfig
is:
{ "AdditionalDependencies": [ /* A list of target patterns that should in added as dependencies to this target. And use the '*' wildcard for a single directory, or '**' as a multi-directory wildcard. */ ], }
All fields are optional.
The build generator will emit a BUILD.
ext file in each source directory, for each BUILD.
ext.tmpl
file found in tools/src/cmd/gen/build
.
The template will be passed the Directory
as $
.