summaryrefslogtreecommitdiff
path: root/rules/CC/RULES
diff options
context:
space:
mode:
Diffstat (limited to 'rules/CC/RULES')
-rw-r--r--rules/CC/RULES1217
1 files changed, 1217 insertions, 0 deletions
diff --git a/rules/CC/RULES b/rules/CC/RULES
new file mode 100644
index 0000000..82305d9
--- /dev/null
+++ b/rules/CC/RULES
@@ -0,0 +1,1217 @@
+{ "defaults":
+ { "doc":
+ [ "A rule to provide defaults."
+ , "All CC targets take their defaults for CC, CXX, flags, etc from"
+ , "the target [\"CC\", \"defaults\"]. This is probably the only sensible"
+ , "use of this rule. As targets form a different root, the defaults"
+ , "can be provided without changing this directory."
+ ]
+ , "target_fields": ["base", "toolchain", "deps", "include_scanner"]
+ , "string_fields":
+ [ "CC"
+ , "CXX"
+ , "CFLAGS"
+ , "CXXFLAGS"
+ , "LDFLAGS"
+ , "ARFLAGS"
+ , "DEBUGFLAGS"
+ , "ADD_COMPILE_FLAGS"
+ , "ADD_CFLAGS"
+ , "ADD_CXXFLAGS"
+ , "ADD_LDFLAGS"
+ , "ADD_DEBUGFLAGS"
+ , "AR"
+ , "DWP"
+ , "PATH"
+ , "SYSTEM_TOOLS"
+ ]
+ , "config_vars": ["ARCH", "HOST_ARCH", "TARGET_ARCH", "DEBUG"]
+ , "field_doc":
+ { "base": ["Other targets (using the same rule) to inherit values from."]
+ , "toolchain":
+ [ "Optional toolchain directory. A collection of artifacts that provide"
+ , "the tools CC, CXX, and AR (if needed). Note that only artifacts of"
+ , "the specified targets are considered (no runfiles etc.). Specifying"
+ , "this field extends artifacts from \"base\". If the toolchain"
+ , "supports cross-compilation, it should perform a dispatch on the"
+ , "configuration variable \"BUILD_ARCH\" to determine for which"
+ , "architecture to generate code for."
+ ]
+ , "deps":
+ [ "Optional CC libraries any CC library and CC binary implicitly depend"
+ , "on. Those are typically \"libstdc++\" or \"libc++\" for C++ targets."
+ , "Specifying this field extends dependencies from \"base\"."
+ ]
+ , "CC": ["The C compiler to use"]
+ , "CXX": ["The C++ compiler to use"]
+ , "AR": ["The archiver tool to use"]
+ , "DWP":
+ [ "The DWARF format packaging tool to use. Required by debug builds that"
+ , "enable debug fission."
+ ]
+ , "SYSTEM_TOOLS":
+ [ "List of tools (\"CC\", \"CXX\", \"AR\", or \"DWP\") that should be"
+ , "taken from the system instead of from \"toolchain\" (if specified)."
+ ]
+ , "CFLAGS":
+ [ "Flags for C compilation. Specifying this field overwrites"
+ , "values from \"base\"."
+ ]
+ , "CXXFLAGS":
+ [ "Flags for C++ compilation. Specifying this field overwrites"
+ , "values from \"base\"."
+ ]
+ , "LDFLAGS":
+ [ "Linker flags for linking the final CC library. Specifying this field"
+ , "overwrites values from \"base\"."
+ ]
+ , "ARFLAGS":
+ [ "Arguments to tell the archiver to create an archive with the specified"
+ , "object files. If the \"ARFLAGS\" specified in the defaults target are"
+ , "empty, the rules will use [\"cqs\"]."
+ ]
+ , "DEBUGFLAGS":
+ [ "Flags to be used for the debug-stage for both C and C++, instead of"
+ , "the resulting CFLAGS and CXXFLAGS, respectively."
+ , "Specifying this field overwrites values from \"base\"."
+ ]
+ , "ADD_COMPILE_FLAGS":
+ [ "Additional compilation flags for C and C++. Specifying this field"
+ , "extends values from \"base\" for both, \"CFLAGS\" and \"CXXFLAGS\"."
+ ]
+ , "ADD_CFLAGS":
+ [ "Additional compilation flags specific for C. Specifying this field"
+ , "extends values from \"base\"."
+ ]
+ , "ADD_CXXFLAGS":
+ [ "Additional compilation flags specific for C++. Specifying this field"
+ , "extends values from \"base\"."
+ ]
+ , "ADD_LDFLAGS":
+ [ "Additional linker flags for linking the final CC library. Specifying"
+ , "this field extends values from \"base\"."
+ ]
+ , "ADD_DEBUGFLAGS":
+ [ "Additional compilation flags for the debug-stage. Specifying this"
+ , "field extends values from \"base\" for both, \"CFLAGS\" and"
+ , "\"CXXFLAGS\"."
+ ]
+ , "PATH":
+ [ "Path for looking up the compilers. Individual paths are joined"
+ , "with \":\". Specifying this field extends values from \"base\"."
+ ]
+ , "include_scanner":
+ [ "Specify an include scanner to be run before each compile action, which"
+ , "removes unused headers from the include tree. The given target must"
+ , "contain a single executable artifact, a script or binary. The tool"
+ , "specified must accept as first argument the <out_dir> path and as"
+ , "remaining arguments the argv of the preprocessor command (-E -M)."
+ , "The input headers are located in the local directory \"include\" and"
+ , "the scanner should copy all used headers to \"<out_dir>/include\"."
+ , "Specifying this field overwrites values from \"base\"."
+ ]
+ }
+ , "config_doc":
+ { "ARCH":
+ [ "The unqualified architecture. Is taken as a default for \"HOST_ARCH\""
+ , "and \"TARGET_ARCH\" if not set."
+ ]
+ , "HOST_ARCH":
+ ["The architecture on which the build actions are carried out."]
+ , "TARGET_ARCH": ["The architecture for which to build."]
+ , "DEBUG":
+ [ "If logically true (typically, a non-empty map), use debug-related"
+ , "options, otherwise not."
+ ]
+ }
+ , "imports":
+ { "base-provides": "defaults-base-provides"
+ , "base-provides-++": "defaults-base-provides-++"
+ , "base-provides-list": "defaults-base-provides-list"
+ , "artifacts_list": ["./", "..", "field_artifacts_list"]
+ , "artifacts": ["./", "..", "field_artifacts"]
+ , "compile-deps": "compile-deps"
+ , "compile-args-deps": "compile-args-deps"
+ , "link-deps": "link-deps"
+ , "link-args-deps": "link-args-deps"
+ , "run-libs-deps": "run-libs-deps"
+ , "run-libs-args-deps": "run-libs-args-deps"
+ , "cflags-files-deps": "cflags-files-deps"
+ , "ldflags-files-deps": "ldflags-files-deps"
+ , "for host": ["transitions", "for host"]
+ , "debug-deps": "debug-deps"
+ }
+ , "config_transitions":
+ { "toolchain": [{"type": "CALL_EXPRESSION", "name": "for host"}]
+ , "include_scanner": [{"type": "CALL_EXPRESSION", "name": "for host"}]
+ }
+ , "expression":
+ { "type": "let*"
+ , "bindings":
+ [ ["CC", {"type": "FIELD", "name": "CC"}]
+ , ["CXX", {"type": "FIELD", "name": "CXX"}]
+ , ["CFLAGS", {"type": "FIELD", "name": "CFLAGS"}]
+ , ["CXXFLAGS", {"type": "FIELD", "name": "CXXFLAGS"}]
+ , ["LDFLAGS", {"type": "FIELD", "name": "LDFLAGS"}]
+ , ["ARFLAGS", {"type": "FIELD", "name": "ARFLAGS"}]
+ , ["DEBUGFLAGS", {"type": "FIELD", "name": "DEBUGFLAGS"}]
+ , ["AR", {"type": "FIELD", "name": "AR"}]
+ , ["DWP", {"type": "FIELD", "name": "DWP"}]
+ , ["PATH", {"type": "FIELD", "name": "PATH"}]
+ , ["provider", "CC"]
+ , [ "CC"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "CC"}
+ , "then": {"type": "var", "name": "CC"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"}
+ }
+ ]
+ , ["provider", "CXX"]
+ , [ "CXX"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "CXX"}
+ , "then": {"type": "var", "name": "CXX"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"}
+ }
+ ]
+ , ["provider", "CFLAGS"]
+ , [ "CFLAGS"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "CFLAGS"}
+ , "then": {"type": "var", "name": "CFLAGS"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides-++"}
+ }
+ ]
+ , ["provider", "CXXFLAGS"]
+ , [ "CXXFLAGS"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "CXXFLAGS"}
+ , "then": {"type": "var", "name": "CXXFLAGS"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides-++"}
+ }
+ ]
+ , ["provider", "LDFLAGS"]
+ , [ "LDFLAGS"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "LDFLAGS"}
+ , "then": {"type": "var", "name": "LDFLAGS"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides-++"}
+ }
+ ]
+ , ["provider", "ARFLAGS"]
+ , [ "ARFLAGS"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "ARFLAGS"}
+ , "then": {"type": "var", "name": "ARFLAGS"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides-++"}
+ }
+ ]
+ , ["provider", "DEBUGFLAGS"]
+ , [ "DEBUGFLAGS"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "DEBUGFLAGS"}
+ , "then": {"type": "var", "name": "DEBUGFLAGS"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides-++"}
+ }
+ ]
+ , ["provider", "AR"]
+ , [ "AR"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "AR"}
+ , "then": {"type": "var", "name": "AR"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"}
+ }
+ ]
+ , ["provider", "DWP"]
+ , [ "DWP"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "DWP"}
+ , "then": {"type": "var", "name": "DWP"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"}
+ }
+ ]
+ , ["provider", "PATH"]
+ , [ "PATH"
+ , { "type": "nub_left"
+ , "$1":
+ { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "PATH"}
+ , {"type": "CALL_EXPRESSION", "name": "base-provides-++"}
+ ]
+ }
+ }
+ ]
+ , ["provider", "ENV"]
+ , ["default", {"type": "empty_map"}]
+ , ["ENV", {"type": "CALL_EXPRESSION", "name": "base-provides"}]
+ , ["provider", "INCLUDE_SCANNER"]
+ , ["default", {"type": "empty_map"}]
+ , [ "INCLUDE_SCANNER"
+ , { "type": "if"
+ , "cond": {"type": "FIELD", "name": "include_scanner"}
+ , "then":
+ { "type": "let*"
+ , "bindings":
+ [ ["fieldname", "include_scanner"]
+ , ["transition", {"type": "CALL_EXPRESSION", "name": "for host"}]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"}
+ }
+ , "else":
+ { "type": "disjoint_map_union"
+ , "$1": {"type": "CALL_EXPRESSION", "name": "base-provides-list"}
+ }
+ }
+ ]
+ , ["provider", "NON_SYSTEM_TOOLS"]
+ , ["default", {"type": "empty_map"}]
+ , [ "NON_SYSTEM_TOOLS"
+ , { "type": "map_union"
+ , "$1":
+ { "type": "++"
+ , "$1":
+ [ [{"type": "CALL_EXPRESSION", "name": "base-provides"}]
+ , { "type": "if"
+ , "cond": {"type": "FIELD", "name": "CC"}
+ , "then":
+ [ { "type": "singleton_map"
+ , "key": "CC"
+ , "value":
+ { "type": "if"
+ , "cond": {"type": "FIELD", "name": "toolchain"}
+ , "then": true
+ , "else": false
+ }
+ }
+ ]
+ }
+ , { "type": "if"
+ , "cond": {"type": "FIELD", "name": "CXX"}
+ , "then":
+ [ { "type": "singleton_map"
+ , "key": "CXX"
+ , "value":
+ { "type": "if"
+ , "cond": {"type": "FIELD", "name": "toolchain"}
+ , "then": true
+ , "else": false
+ }
+ }
+ ]
+ }
+ , { "type": "if"
+ , "cond": {"type": "FIELD", "name": "AR"}
+ , "then":
+ [ { "type": "singleton_map"
+ , "key": "AR"
+ , "value":
+ { "type": "if"
+ , "cond": {"type": "FIELD", "name": "toolchain"}
+ , "then": true
+ , "else": false
+ }
+ }
+ ]
+ }
+ , { "type": "if"
+ , "cond": {"type": "FIELD", "name": "DWP"}
+ , "then":
+ [ { "type": "singleton_map"
+ , "key": "DWP"
+ , "value":
+ { "type": "if"
+ , "cond": {"type": "FIELD", "name": "toolchain"}
+ , "then": true
+ , "else": false
+ }
+ }
+ ]
+ }
+ , { "type": "foreach"
+ , "range": {"type": "FIELD", "name": "SYSTEM_TOOLS"}
+ , "var": "tool"
+ , "body":
+ { "type": "singleton_map"
+ , "key": {"type": "var", "name": "tool"}
+ , "value": false
+ }
+ }
+ ]
+ }
+ }
+ ]
+ , ["provider", "TOOLCHAIN"]
+ , ["default", {"type": "empty_map"}]
+ , [ "TOOLCHAIN"
+ , { "type": "disjoint_map_union"
+ , "msg": "toolchain artifacts may not overlap"
+ , "$1":
+ { "type": "++"
+ , "$1":
+ [ {"type": "CALL_EXPRESSION", "name": "base-provides-list"}
+ , { "type": "if"
+ , "cond": {"type": "FIELD", "name": "toolchain"}
+ , "then":
+ { "type": "let*"
+ , "bindings":
+ [ ["fieldname", "toolchain"]
+ , [ "transition"
+ , {"type": "CALL_EXPRESSION", "name": "for host"}
+ ]
+ ]
+ , "body":
+ {"type": "CALL_EXPRESSION", "name": "artifacts_list"}
+ }
+ }
+ ]
+ }
+ }
+ ]
+ , [ "CFLAGS"
+ , { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "CFLAGS"}
+ , {"type": "FIELD", "name": "ADD_COMPILE_FLAGS"}
+ , {"type": "FIELD", "name": "ADD_CFLAGS"}
+ ]
+ }
+ ]
+ , [ "CXXFLAGS"
+ , { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "CXXFLAGS"}
+ , {"type": "FIELD", "name": "ADD_COMPILE_FLAGS"}
+ , {"type": "FIELD", "name": "ADD_CXXFLAGS"}
+ ]
+ }
+ ]
+ , [ "LDFLAGS"
+ , { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "LDFLAGS"}
+ , {"type": "FIELD", "name": "ADD_LDFLAGS"}
+ ]
+ }
+ ]
+ , [ "CFLAGS"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "DEBUG"}
+ , "then":
+ { "type": "++"
+ , "$1":
+ [ { "type": "if"
+ , "cond": {"type": "var", "name": "DEBUGFLAGS"}
+ , "then": {"type": "var", "name": "DEBUGFLAGS"}
+ , "else": {"type": "var", "name": "CFLAGS"}
+ }
+ , {"type": "FIELD", "name": "ADD_DEBUGFLAGS"}
+ ]
+ }
+ , "else": {"type": "var", "name": "CFLAGS"}
+ }
+ ]
+ , [ "CXXFLAGS"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "DEBUG"}
+ , "then":
+ { "type": "++"
+ , "$1":
+ [ { "type": "if"
+ , "cond": {"type": "var", "name": "DEBUGFLAGS"}
+ , "then": {"type": "var", "name": "DEBUGFLAGS"}
+ , "else": {"type": "var", "name": "CXXFLAGS"}
+ }
+ , {"type": "FIELD", "name": "ADD_DEBUGFLAGS"}
+ ]
+ }
+ , "else": {"type": "var", "name": "CXXFLAGS"}
+ }
+ ]
+ , ["deps-fieldnames", ["base", "deps"]]
+ , ["compile-deps", {"type": "CALL_EXPRESSION", "name": "compile-deps"}]
+ , [ "compile-args"
+ , {"type": "CALL_EXPRESSION", "name": "compile-args-deps"}
+ ]
+ , ["link-deps", {"type": "CALL_EXPRESSION", "name": "link-deps"}]
+ , ["link-args", {"type": "CALL_EXPRESSION", "name": "link-args-deps"}]
+ , ["run-libs", {"type": "CALL_EXPRESSION", "name": "run-libs-deps"}]
+ , [ "run-libs-args"
+ , {"type": "CALL_EXPRESSION", "name": "run-libs-args-deps"}
+ ]
+ , [ "cflags-files"
+ , {"type": "CALL_EXPRESSION", "name": "cflags-files-deps"}
+ ]
+ , [ "ldflags-files"
+ , {"type": "CALL_EXPRESSION", "name": "ldflags-files-deps"}
+ ]
+ , ["package", {"type": "env", "vars": ["cflags-files", "ldflags-files"]}]
+ , [ "debug-srcs"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "DEBUG"}
+ , "then":
+ { "type": "let*"
+ , "bindings": [["deps-provider", "debug-srcs"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"}
+ }
+ , "else": {"type": "empty_map"}
+ }
+ ]
+ , [ "debug-hdrs"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "DEBUG"}
+ , "then":
+ { "type": "map_union"
+ , "$1":
+ [ { "type": "let*"
+ , "bindings": [["deps-provider", "debug-hdrs"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "debug-deps"}
+ }
+ , {"type": "var", "name": "compile-deps"}
+ ]
+ }
+ , "else": {"type": "empty_map"}
+ }
+ ]
+ ]
+ , "body":
+ { "type": "RESULT"
+ , "provides":
+ { "type": "env"
+ , "vars":
+ [ "CC"
+ , "CXX"
+ , "CFLAGS"
+ , "CXXFLAGS"
+ , "LDFLAGS"
+ , "AR"
+ , "DWP"
+ , "ARFLAGS"
+ , "PATH"
+ , "ENV"
+ , "INCLUDE_SCANNER"
+ , "TOOLCHAIN"
+ , "NON_SYSTEM_TOOLS"
+ , "compile-deps"
+ , "compile-args"
+ , "link-deps"
+ , "link-args"
+ , "run-libs"
+ , "run-libs-args"
+ , "package"
+ , "debug-srcs"
+ , "debug-hdrs"
+ ]
+ }
+ }
+ }
+ }
+, "library":
+ { "doc": ["A C++ library"]
+ , "target_fields":
+ [ "srcs"
+ , "hdrs"
+ , "private-hdrs"
+ , "deps"
+ , "private-deps"
+ , "proto"
+ , "private-proto"
+ , "components"
+ ]
+ , "string_fields":
+ [ "name"
+ , "stage"
+ , "pure C"
+ , "defines"
+ , "private-defines"
+ , "cflags"
+ , "private-cflags"
+ , "ldflags"
+ , "private-ldflags"
+ , "soversion"
+ , "pkg-name"
+ ]
+ , "config_fields": ["shared"]
+ , "config_vars":
+ [ "CC"
+ , "CXX"
+ , "CFLAGS"
+ , "CXXFLAGS"
+ , "LDFLAGS"
+ , "ADD_CFLAGS"
+ , "ADD_CXXFLAGS"
+ , "ADD_LDFLAGS"
+ , "AR"
+ , "DWP"
+ , "ENV"
+ , "BUILD_POSITION_INDEPENDENT"
+ , "BUILD_OBJECT_ONLY"
+ , "BUILD_OBJECT_ONLY_DROP_OBJECT_LINKING"
+ , "DEBUG"
+ , "LINT"
+ ]
+ , "implicit": {"defaults": ["defaults"]}
+ , "field_doc":
+ { "name":
+ ["The name of the library (without leading \"lib\" or trailing \".a\")."]
+ , "srcs": ["The source files of the library."]
+ , "hdrs": ["Any public header files of the library."]
+ , "private-hdrs":
+ [ "Any header files that only need to be present when compiling the"
+ , "source files, but are not needed for any consumer of the library."
+ ]
+ , "components":
+ [ "Any other libraries that are considered part of this library;"
+ , "all object files of those are included unconditionally into this"
+ , "library."
+ ]
+ , "stage":
+ [ "The logical location of all header and source files, as well as the"
+ , "resulting library file. Individual directory components are joined"
+ , "with \"/\"."
+ ]
+ , "pure C":
+ [ "If non-empty, compile as C sources rather than C++ sources."
+ , "In particular, CC is used to compile rather than CXX (or their"
+ , "respective defaults)."
+ ]
+ , "defines":
+ [ "List of defines set for this target and its consumers."
+ , "Each list entry will be prepended by \"-D\"."
+ ]
+ , "private-defines":
+ [ "List of defines set for source files local to this target."
+ , "Each list entry will be prepended by \"-D\"."
+ ]
+ , "cflags":
+ ["List of compile flags set for this target and its consumers."]
+ , "private-cflags":
+ ["List of compile flags set for source files local to this target."]
+ , "ldflags":
+ [ "Additional linker flags for linking external libraries for this"
+ , "target and its consumers (not built by this tool, typically system"
+ , "libraries)."
+ ]
+ , "private-ldflags":
+ [ "Additional linker flags for linking external libraries (not built"
+ , "by this tool, typically system libraries)."
+ ]
+ , "deps": ["Any other libraries this library depends upon."]
+ , "private-deps":
+ [ "Any other libraries this library depends upon but does not include"
+ , "in its public headers."
+ ]
+ , "proto":
+ [ "Any [\"proto\", \"library\"] this target depends upon directly."
+ , "The creation of C++ bindings for this proto library as well as of"
+ , "its dependencies will be taken care of (as anonymous targets, so no"
+ , "duplicate work will be carried out, even if the same proto library"
+ , "is used at various places)."
+ ]
+ , "private-proto":
+ [ "Any [\"proto\", \"library\"] this target depends upon privately."
+ , "The creation of C++ bindings for this proto library as well as of"
+ , "its dependencies will be taken care of (as anonymous targets, so no"
+ , "duplicate work will be carried out, even if the same proto library"
+ , "is used at various places)."
+ ]
+ , "shared": ["If non-empty, produce a shared instead of a static library."]
+ , "soversion":
+ [ "The SOVERSION for shared libraries. Individual version components are"
+ , "joined with \".\"."
+ ]
+ , "pkg-name":
+ [ "Name to use for pkg-config files. If this field is empty, the field"
+ , "\"name\" is used instead."
+ ]
+ , "defaults": ["The C/C++ toolchain to use"]
+ }
+ , "config_doc":
+ { "CC":
+ [ "The name of the C compiler to be used (when compiling pure C code)."
+ , "If None, the respective value from [\"CC\", \"defaults\"] will be taken."
+ ]
+ , "CXX":
+ [ "The name of the C++ compiler to be used."
+ , "If None, the respective value from [\"CC\", \"defaults\"] will be taken."
+ ]
+ , "CFLAGS":
+ [ "The flags for CC to be used instead of the default ones."
+ , "For libraries that should be built in a non-standard way; usually"
+ , "adapting the default target [\"CC\", \"defaults\"] is the better"
+ , "choice."
+ ]
+ , "CXXFLAGS":
+ [ "The flags for CXX to be used instead of the default ones."
+ , "For libraries that should be built in a non-standard way; usually"
+ , "adapting the default target [\"CC\", \"defaults\"] is the better"
+ , "choice."
+ ]
+ , "LDFLAGS":
+ [ "The linker flags to be used instead of the default ones."
+ , "For libraries that should be built in a non-standard way; usually"
+ , "adapting the default target [\"CC\", \"defaults\"] is the better"
+ , "choice."
+ ]
+ , "ADD_CFLAGS":
+ [ "The flags to add to the default ones for CC."
+ , "For libraries that should be built in a non-standard way; usually"
+ , "adapting the default target [\"CC\", \"defaults\"] is the better"
+ , "choice."
+ ]
+ , "ADD_CXXFLAGS":
+ [ "The flags to add to the default ones for CXX."
+ , "For libraries that should be built in a non-standard way; usually"
+ , "adapting the default target [\"CC\", \"defaults\"] is the better"
+ , "choice."
+ ]
+ , "ADD_LDFLAGS":
+ [ "The linker flags to add to the default ones."
+ , "For libraries that should be built in a non-standard way; usually"
+ , "adapting the default target [\"CC\", \"defaults\"] is the better"
+ , "choice."
+ ]
+ , "AR":
+ [ "The archive tool to used for creating the library"
+ , "If None, the respective value from [\"CC\", \"defaults\"] will be taken."
+ ]
+ , "DWP":
+ [ "The DWARF format packaging tool to use in debug builds that enable"
+ , "debug fission."
+ , "If None, the respective value from [\"CC\", \"defaults\"] will be taken."
+ ]
+ , "ENV": ["The environment for any action generated."]
+ , "BUILD_POSITION_INDEPENDENT": ["Build with -fPIC."]
+ , "DEBUG":
+ [ "Either a logically false value to disable debugging, or a non-empty"
+ , "map to enable debugging. If debugging is enabled, the following values"
+ , "of the map are used."
+ , ""
+ , "The key \"USE_DEBUG_FISSION\" expects a flag which enables the debug"
+ , "fission mode, but does not add any flags. Explicitly setting it to a"
+ , "false value is needed to enable regular debug mode."
+ , "The key \"FISSION_CONFIG\" expects a map configuring debug fission."
+ , " - subkey \"USE_SPLIT_DWARF\" expects a flag that, if true, adds the"
+ , "-gsplit-dwarf compile flag."
+ , " - subkey \"DWARF_VERSION\" expects a string that adds the"
+ , "-gdwarf-<value> compile flag."
+ , " - subkey \"USE_GDB_INDEX\" expects a flag that, if true, adds the"
+ , "-Wl,--gdb-index linker flag."
+ , " - subkey \"USE_DEBUG_TYPES_SECTION\" expects a flag that, if true,"
+ , "adds the -fdebug-types-section compile flag."
+ , ""
+ , "If no compile flags are otherwise configured, [\"-g\"] will be taken."
+ ]
+ , "BUILD_OBJECT_ONLY":
+ [ "If true, produce an object library, resulting in object files"
+ , "added to the linker line of all depending targets. If this"
+ , "configuration is set, the \"shared\" option is ignored. This"
+ , "variable is cleared for all dependencies."
+ ]
+ , "BUILD_OBJECT_ONLY_DROP_OBJECT_LINKING":
+ [ "If true, do not include the objects in the provided \"link-args\"."
+ , "This allows consuming libraries that pick on the objects themselves"
+ , "to still forward the \"link-args\" of that library, and thus getting"
+ , "correct linking instructions for the resulting library."
+ ]
+ , "LINT":
+ [ "Also provide nodes describing compile actions and header files;"
+ , "those can be used by lint rules (doing also the config transition)"
+ , "for additional checks."
+ ]
+ }
+ , "artifacts_doc":
+ ["The actual library (libname.a) staged in the specified directory"]
+ , "runfiles_doc": ["The public headers of this library"]
+ , "provides_doc":
+ { "compile-deps":
+ [ "Map of artifacts specifying any additional files that, besides the runfiles,"
+ , "have to be present in compile actions of targets depending on this library"
+ ]
+ , "link-deps":
+ [ "Map of artifacts specifying any additional files that, besides the artifacts,"
+ , "have to be present in a link actions of targets depending on this library"
+ ]
+ , "link-args":
+ [ "List of strings that have to be added to the command line for linking actions"
+ , "in targets depending on this library"
+ ]
+ , "debug-srcs": ["Map of all sources needed for debugging."]
+ , "debug-hdrs": ["Map of all additional headers needed for debugging."]
+ , "run-libs":
+ [ "Map of artifacts specifying libraries that have to be present at"
+ , "runtime (as well as during linking)."
+ ]
+ , "run-libs-args":
+ [ "Additional arguments for linking that are related to the run-libs."
+ , "Those are added on the linker command line after the regular link-args."
+ ]
+ , "package":
+ [ "Information related to packaging the library. This provider is a map,"
+ , "specifying \"name\" and \"version\" of the package, as well as"
+ , "additional stages \"cflags-files\" and \"ldflags-files\" for files"
+ , "with compile-flags or link-flags, respctively."
+ ]
+ }
+ , "anonymous":
+ { "proto-deps":
+ { "target": "proto"
+ , "provider": "proto"
+ , "rule_map":
+ { "library": ["./", "proto", "library"]
+ , "service library": ["./", "proto", "service library"]
+ }
+ }
+ , "private-proto-deps":
+ { "target": "private-proto"
+ , "provider": "proto"
+ , "rule_map":
+ { "library": ["./", "proto", "library"]
+ , "service library": ["./", "proto", "service library"]
+ }
+ }
+ }
+ , "imports":
+ { "artifacts": ["./", "..", "field_artifacts"]
+ , "runfiles": ["./", "..", "field_runfiles"]
+ , "static result": "lib result"
+ , "shared result": "shared result"
+ , "object result": "object result"
+ , "fPIC transition": ["transitions", "with fPIC, not object-only"]
+ , "component transition": ["transitions", "with fPIC, object-only"]
+ }
+ , "config_transitions":
+ { "deps": [{"type": "CALL_EXPRESSION", "name": "fPIC transition"}]
+ , "private-deps": [{"type": "CALL_EXPRESSION", "name": "fPIC transition"}]
+ , "proto-deps": [{"type": "CALL_EXPRESSION", "name": "fPIC transition"}]
+ , "private-proto-deps":
+ [{"type": "CALL_EXPRESSION", "name": "fPIC transition"}]
+ , "defaults": [{"type": "CALL_EXPRESSION", "name": "fPIC transition"}]
+ , "components":
+ [{"type": "CALL_EXPRESSION", "name": "component transition"}]
+ }
+ , "expression":
+ { "type": "let*"
+ , "bindings":
+ [ ["name", {"type": "join", "$1": {"type": "FIELD", "name": "name"}}]
+ , [ "DEBUG"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "DEBUG"}
+ , "then": {"type": "var", "name": "DEBUG"}
+ , "else": {"type": "empty_map"}
+ }
+ ]
+ , ["pure C", {"type": "FIELD", "name": "pure C"}]
+ , [ "cflags"
+ , { "type": "++"
+ , "$1":
+ [ {"type": "FIELD", "name": "cflags"}
+ , { "type": "foreach"
+ , "var": "def"
+ , "range": {"type": "FIELD", "name": "defines"}
+ , "body":
+ {"type": "join", "$1": ["-D", {"type": "var", "name": "def"}]}
+ }
+ ]
+ }
+ ]
+ , [ "private-cflags"
+ , { "type": "++"
+ , "$1":
+ [ {"type": "FIELD", "name": "private-cflags"}
+ , { "type": "foreach"
+ , "var": "def"
+ , "range": {"type": "FIELD", "name": "private-defines"}
+ , "body":
+ {"type": "join", "$1": ["-D", {"type": "var", "name": "def"}]}
+ }
+ ]
+ }
+ ]
+ , [ "stage"
+ , { "type": "join"
+ , "separator": "/"
+ , "$1": {"type": "FIELD", "name": "stage"}
+ }
+ ]
+ , [ "srcs"
+ , { "type": "to_subdir"
+ , "subdir": {"type": "var", "name": "stage"}
+ , "$1":
+ { "type": "let*"
+ , "bindings": [["fieldname", "srcs"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"}
+ }
+ }
+ ]
+ , [ "hdrs"
+ , { "type": "to_subdir"
+ , "subdir": {"type": "var", "name": "stage"}
+ , "$1":
+ { "type": "let*"
+ , "bindings": [["fieldname", "hdrs"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"}
+ }
+ }
+ ]
+ , [ "component transition"
+ , {"type": "CALL_EXPRESSION", "name": "component transition"}
+ ]
+ , [ "component hdrs"
+ , { "type": "let*"
+ , "bindings":
+ [ ["fieldname", "components"]
+ , ["transition", {"type": "var", "name": "component transition"}]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "runfiles"}
+ }
+ ]
+ , [ "hdrs"
+ , { "type": "disjoint_map_union"
+ , "msg": "Staging conflict between component and own header files"
+ , "$1":
+ [ {"type": "var", "name": "hdrs"}
+ , {"type": "var", "name": "component hdrs"}
+ ]
+ }
+ ]
+ , [ "private-hdrs"
+ , { "type": "to_subdir"
+ , "subdir": {"type": "var", "name": "stage"}
+ , "$1":
+ { "type": "let*"
+ , "bindings": [["fieldname", "private-hdrs"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"}
+ }
+ }
+ ]
+ , ["ldflags", {"type": "FIELD", "name": "ldflags"}]
+ , ["private-ldflags", {"type": "FIELD", "name": "private-ldflags"}]
+ , ["soversion", {"type": "FIELD", "name": "soversion"}]
+ , [ "pkg-name"
+ , { "type": "if"
+ , "cond": {"type": "FIELD", "name": "pkg-name"}
+ , "then":
+ {"type": "join", "$1": {"type": "FIELD", "name": "pkg-name"}}
+ , "else": {"type": "var", "name": "name"}
+ }
+ ]
+ , [ "defaults-transition"
+ , {"type": "CALL_EXPRESSION", "name": "fPIC transition"}
+ ]
+ , [ "deps-transition"
+ , {"type": "CALL_EXPRESSION", "name": "fPIC transition"}
+ ]
+ , ["public-fieldnames", ["deps", "proto-deps", "defaults"]]
+ , [ "private-fieldnames"
+ , [ "deps"
+ , "private-deps"
+ , "proto-deps"
+ , "private-proto-deps"
+ , "defaults"
+ , "components"
+ ]
+ ]
+ , ["component-fieldnames", ["components"]]
+ , [ "modified-transitions"
+ , { "type": "singleton_map"
+ , "key": "components"
+ , "value": {"type": "var", "name": "component transition"}
+ }
+ ]
+ , [ "shared"
+ , { "type": "and"
+ , "$1":
+ [ {"type": "FIELD", "name": "shared"}
+ , { "type": "not"
+ , "$1": {"type": "var", "name": "BUILD_OBJECT_ONLY"}
+ }
+ ]
+ }
+ ]
+ ]
+ , "body":
+ { "type": "cond"
+ , "cond":
+ [ [ {"type": "var", "name": "shared"}
+ , {"type": "CALL_EXPRESSION", "name": "shared result"}
+ ]
+ , [ {"type": "var", "name": "BUILD_OBJECT_ONLY"}
+ , {"type": "CALL_EXPRESSION", "name": "object result"}
+ ]
+ ]
+ , "default": {"type": "CALL_EXPRESSION", "name": "static result"}
+ }
+ }
+ }
+, "binary":
+ { "doc": ["A binary written in C++"]
+ , "target_fields": ["srcs", "private-hdrs", "private-deps", "private-proto"]
+ , "string_fields":
+ [ "name"
+ , "stage"
+ , "pure C"
+ , "private-defines"
+ , "private-cflags"
+ , "private-ldflags"
+ ]
+ , "config_vars":
+ [ "CC"
+ , "CXX"
+ , "CFLAGS"
+ , "CXXFLAGS"
+ , "LDFLAGS"
+ , "ADD_CFLAGS"
+ , "ADD_CXXFLAGS"
+ , "ADD_LDFLAGS"
+ , "DWP"
+ , "ENV"
+ , "BUILD_POSITION_INDEPENDENT"
+ , "DEBUG"
+ , "LINT"
+ ]
+ , "implicit": {"defaults": ["defaults"]}
+ , "field_doc":
+ { "name": ["The name of the binary"]
+ , "srcs": ["The source files of the library."]
+ , "private-hdrs":
+ [ "Any header files that need to be present when compiling the"
+ , "source files."
+ ]
+ , "stage":
+ [ "The logical location of all header and source files, as well as the"
+ , "resulting binary file. Individual directory components are joined"
+ , "with \"/\"."
+ ]
+ , "pure C":
+ [ "If non-empty, compile as C sources rather than C++ sources."
+ , "In particular, CC is used to compile rather than CXX"
+ ]
+ , "private-defines":
+ [ "List of defines set for source files local to this target."
+ , "Each list entry will be prepended by \"-D\"."
+ ]
+ , "private-cflags":
+ ["List of compile flags set for source files local to this target."]
+ , "private-ldflags":
+ ["Additional linker flags for linking external libraries."]
+ , "private-deps": ["Any other libraries this binary depends upon."]
+ , "private-proto":
+ [ "Any [\"proto\", \"library\"] this target depends upon directly."
+ , "The creation of C++ bindings for this proto library as well as of"
+ , "is dependencies will be taken care of (as anonymous targets, so no"
+ , "duplicate work will be carried out, even if the same proto library"
+ , "is used at various places)."
+ ]
+ , "defaults": ["The C/C++ toolchain to use"]
+ }
+ , "config_doc":
+ { "CC":
+ ["The name of the C compiler to be used (when compiling pure C code)"]
+ , "CXX": ["The name of the C++ compiler to be used."]
+ , "CFLAGS":
+ [ "The flags for CXX to be used instead of the default ones"
+ , "taken from the [\"CC\", \"defaults\"] target"
+ ]
+ , "CXXFLAGS":
+ [ "The flags for CXX to be used instead of the default ones"
+ , "taken from the [\"CC\", \"defaults\"] target"
+ ]
+ , "LDFLAGS":
+ [ "The linker flags do be used instead of the default ones"
+ , "taken from the [\"CC\", \"defaults\"] target"
+ ]
+ , "ADD_CFLAGS":
+ [ "The flags to add to the default ones for CC"
+ , "taken from the [\"CC\", \"defaults\"] target"
+ ]
+ , "ADD_CXXFLAGS":
+ [ "The flags to add to the default ones for CXX"
+ , "taken from the [\"CC\", \"defaults\"] target"
+ ]
+ , "ADD_LDFLAGS":
+ [ "The linker flags to add to the default ones"
+ , "taken from the [\"CC\", \"defaults\"] target"
+ ]
+ , "DWP":
+ [ "The DWARF format packaging tool to use in debug builds that enable"
+ , "debug fission."
+ , "If None, the respective value from [\"CC\", \"defaults\"] will be taken."
+ ]
+ , "ENV": ["The environment for any action generated."]
+ , "BUILD_POSITION_INDEPENDENT": ["Build with -fPIC."]
+ , "DEBUG":
+ [ "Either a logically false value to disable debugging, or a non-empty"
+ , "map to enable debugging. If debugging is enabled, the following values"
+ , "of the map are used."
+ , ""
+ , "The key \"USE_DEBUG_FISSION\" expects a flag which enables the debug"
+ , "fission mode, but does not add any flags. Explicitly setting it to a"
+ , "false value is needed to enable regular debug mode."
+ , "The key \"FISSION_CONFIG\" expects a map configuring debug fission."
+ , " - subkey \"USE_SPLIT_DWARF\" expects a flag that, if true, adds the"
+ , "-gsplit-dwarf compile flag."
+ , " - subkey \"DWARF_VERSION\" expects a string that adds the"
+ , "-gdwarf-<value> compile flag."
+ , " - subkey \"USE_GDB_INDEX\" expects a flag that, if true, adds the"
+ , "-Wl,--gdb-index linker flag."
+ , " - subkey \"USE_DEBUG_TYPES_SECTION\" expects a flag that, if true,"
+ , "adds the -fdebug-types-section compile flag."
+ , ""
+ , "If no compile flags are otherwise configured, [\"-g\"] will be taken."
+ ]
+ , "LINT":
+ [ "Also provide nodes describing compile actions and header files;"
+ , "those can be used by lint rules (doing also the config transition)"
+ , "for additional checks."
+ ]
+ }
+ , "artifacts_doc": ["The final binary, staged to the given directory"]
+ , "runfiles_doc": ["None"]
+ , "provides_doc":
+ { "debug-srcs": ["Map of all sources needed for debugging."]
+ , "debug-hdrs": ["Map of all additional headers needed for debugging."]
+ }
+ , "anonymous":
+ { "private-proto-deps":
+ { "target": "private-proto"
+ , "provider": "proto"
+ , "rule_map":
+ { "library": ["./", "proto", "library"]
+ , "service library": ["./", "proto", "service library"]
+ }
+ }
+ }
+ , "imports":
+ {"artifacts": ["./", "..", "field_artifacts"], "bin result": "bin result"}
+ , "expression":
+ { "type": "let*"
+ , "bindings":
+ [ [ "name"
+ , { "type": "assert_non_empty"
+ , "msg": "A non-empty name has to be provided for binaries"
+ , "$1": {"type": "join", "$1": {"type": "FIELD", "name": "name"}}
+ }
+ ]
+ , [ "DEBUG"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "DEBUG"}
+ , "then": {"type": "var", "name": "DEBUG"}
+ , "else": {"type": "empty_map"}
+ }
+ ]
+ , ["pure C", {"type": "FIELD", "name": "pure C"}]
+ , [ "stage"
+ , { "type": "join"
+ , "separator": "/"
+ , "$1": {"type": "FIELD", "name": "stage"}
+ }
+ ]
+ , [ "srcs"
+ , { "type": "to_subdir"
+ , "subdir": {"type": "var", "name": "stage"}
+ , "$1":
+ { "type": "let*"
+ , "bindings": [["fieldname", "srcs"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"}
+ }
+ }
+ ]
+ , [ "private-hdrs"
+ , { "type": "to_subdir"
+ , "subdir": {"type": "var", "name": "stage"}
+ , "$1":
+ { "type": "let*"
+ , "bindings": [["fieldname", "private-hdrs"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"}
+ }
+ }
+ ]
+ , [ "private-cflags"
+ , { "type": "++"
+ , "$1":
+ [ { "type": "foreach"
+ , "var": "def"
+ , "range": {"type": "FIELD", "name": "private-defines"}
+ , "body":
+ {"type": "join", "$1": ["-D", {"type": "var", "name": "def"}]}
+ }
+ , {"type": "FIELD", "name": "private-cflags"}
+ ]
+ }
+ ]
+ , ["private-ldflags", {"type": "FIELD", "name": "private-ldflags"}]
+ , [ "private-fieldnames"
+ , ["private-deps", "private-proto-deps", "defaults"]
+ ]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "bin result"}
+ }
+ }
+, "install-with-deps":
+ { "doc":
+ [ "Install target's artifacts with transitive dependencies. Depending on"
+ , "the target, artifacts and dependencies will be installed to"
+ , "subdirectories \"bin\", \"include\", and \"lib\". For library targets,"
+ , "a pkg-config file is generated and provided in \"lib/pkgconfig\"."
+ , "In debug mode, depending on the target, additional artifacts needed for"
+ , "local debugging are gathered and installed, depending on target, to"
+ , "\"work\" and \"include\"."
+ ]
+ , "config_vars": ["PREFIX"]
+ , "target_fields": ["targets"]
+ , "string_fields": ["flat-libs", "prefix", "hdrs-only", "skip-debug-stage"]
+ , "imports": {"install result": "install-with-deps result"}
+ , "field_doc":
+ { "targets": ["Targets to install artifacts from."]
+ , "flat-libs":
+ [ "Install libraries flat to the \"lib\" subdirectory. Be aware that"
+ , "conflicts may occur if any of the (transitive) libraries happen to"
+ , "have the same base name."
+ ]
+ , "prefix":
+ [ "The prefix used for pkg-config files. The path will be made absolute"
+ , "and individual directory components are joined with \"/\". If no"
+ , "prefix is specified, the value from the config variable \"PREFIX\" is"
+ , "taken, with the default value being \"/\"."
+ ]
+ , "hdrs-only": ["Only collect headers from deps (without subdirectory)."]
+ , "skip-debug-stage":
+ [ "If in debug mode, skip installing additional artifacts gathered if no"
+ , "local debugging is needed, but debug targets are nonetheless desired."
+ ]
+ }
+ , "config_doc":
+ { "PREFIX":
+ [ "The absolute path that is used as prefix inside generated pkg-config"
+ , "files. The default value for this variable is \"/\". This variable"
+ , "is ignored if the field \"prefix\" is set."
+ ]
+ }
+ , "artifacts_doc":
+ ["Installed artifacts in subdirectories (\"bin\"/\"include\"/\"lib\")."]
+ , "expression":
+ { "type": "let*"
+ , "bindings":
+ [ ["pc-install-dir", "lib/pkgconfig"]
+ , ["targets", {"type": "FIELD", "name": "targets"}]
+ , [ "prefix"
+ , { "type": "if"
+ , "cond": {"type": "FIELD", "name": "prefix"}
+ , "then":
+ { "type": "join"
+ , "separator": "/"
+ , "$1":
+ {"type": "++", "$1": [[""], {"type": "FIELD", "name": "prefix"}]}
+ }
+ , "else": {"type": "var", "name": "PREFIX", "default": "/"}
+ }
+ ]
+ , ["flat-libs", {"type": "FIELD", "name": "flat-libs"}]
+ , ["hdrs-only", {"type": "FIELD", "name": "hdrs-only"}]
+ , ["skip-debug-stage", {"type": "FIELD", "name": "skip-debug-stage"}]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "install result"}
+ }
+ }
+}