summaryrefslogtreecommitdiff
path: root/doc/concepts/doc-strings.md
diff options
context:
space:
mode:
Diffstat (limited to 'doc/concepts/doc-strings.md')
-rw-r--r--doc/concepts/doc-strings.md152
1 files changed, 152 insertions, 0 deletions
diff --git a/doc/concepts/doc-strings.md b/doc/concepts/doc-strings.md
new file mode 100644
index 00000000..a1a156ac
--- /dev/null
+++ b/doc/concepts/doc-strings.md
@@ -0,0 +1,152 @@
+Documentation of build rules, expressions, etc
+==============================================
+
+Build rules can obtain a non-trivial complexity. This is especially true
+if several rules have to exist for slightly different use cases, or if
+the rule supports many different fields. Therefore, documentation of the
+rules (and also expressions for the benefit of rule authors) is
+desirable.
+
+Experience shows that documentation that is not versioned together with
+the code it refers to quickly gets out of date, or lost. Therefore, we
+add documentation directly into the respective definitions.
+
+Multi-line strings in JSON
+--------------------------
+
+In JSON, the newline character is encoded specially and not taken
+literally; also, there is not implicit joining of string literals. So,
+in order to also have documentation readable in the JSON representation
+itself, instead of single strings, we take arrays of strings, with the
+understanding that they describe the strings obtained by joining the
+entries with newline characters.
+
+Documentation is optional
+-------------------------
+
+While documentation is highly recommended, it still remains optional.
+Therefore, when in the following we state that a key is for a list or a
+map, it is always implied that it may be absent; in this case, the empty
+array or the empty map is taken as default, respectively.
+
+Rules
+-----
+
+Each rule is described as a JSON object with a fixed set of keys. So
+having fixed keys for documentation does not cause conflicts. More
+precisely, the keys `doc`, `field doc`, `config_doc`, `artifacts_doc`,
+`runfiles_doc`, and `provides_doc` are reserved for documentation. Here,
+`doc` has to be a list of strings describing the rule in general.
+`field doc` has to be a map from (some of) the field names to an array
+of strings, containing additional information on that particular field.
+`config_doc` has to be a map from (some of) the config variables to an
+array of strings describing the respective variable. `artifacts_doc` is
+an array of strings describing the artifacts produced by the rule.
+`runfiles_doc` is an array of strings describing the runfiles produced
+by this rule. Finally, `provides_doc` is a map describing (some of) the
+providers by that rule; as opposed to fields or config variables there
+is no authoritative list of providers given elsewhere in the rule, so it
+is up to the rule author to give an accurate documentation on the
+provided data.
+
+### Example
+
+``` jsonc
+{ "library":
+ { "doc":
+ [ "A C library"
+ , ""
+ , "Define a library that can be used to be statically linked to a"
+ , "binary. To do so, the target can simply be specified in the deps"
+ , "field of a binary; it can also be a dependency of another library"
+ , "and the information is then propagated to the corresponding binary."
+ ]
+ , "string_fields": ["name"]
+ , "target_fields": ["srcs", "hdrs", "private-hdrs", "deps"]
+ , "field_doc":
+ { "name":
+ ["The base name of the library (i.e., the name without the leading lib)."]
+ , "srcs": ["The source files (i.e., *.c files) of the library."]
+ , "hdrs":
+ [ "The public header files of this library. Targets depending on"
+ , "this library will have access to those header files"
+ ]
+ , "private-hdrs":
+ [ "Additional internal header files that are used when compiling"
+ , "the source files. Targets depending on this library have no access"
+ , "to those header files."
+ ]
+ , "deps":
+ [ "Any other libraries that this library uses. The dependency is"
+ , "also propagated (via the link-deps provider) to any consumers of"
+ , "this target. So only direct dependencies should be declared."
+ ]
+ }
+ , "config_vars": ["CC"]
+ , "config_doc":
+ { "CC":
+ [ "single string. defaulting to \"cc\", specifying the compiler"
+ , "to be used. The compiler is also used to launch the preprocessor."
+ ]
+ }
+ , "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"
+ ]
+ }
+ , "expression": { ... }
+ }
+}
+```
+
+Expressions
+-----------
+
+Expressions are also described by a JSON object with a fixed set of
+keys. Here we use the keys `doc` and `vars_doc` for documentation, where
+`doc` is an array of strings describing the expression as a whole and
+`vars_doc` is a map from (some of) the `vars` to an array of strings
+describing this variable.
+
+Export targets
+--------------
+
+As export targets play the role of interfaces between repositories, it
+is important that they be documented as well. Again, export targets are
+described as a JSON object with fixed set of keys amd we use the keys
+`doc` and `config_doc` for documentation. Here `doc` is an array of
+strings describing the targeted in general and `config_doc` is a map
+from (some of) the variables of the `flexible_config` to an array of
+strings describing this parameter.
+
+Presentation of the documentation
+---------------------------------
+
+As all documentation are just values (that need not be evaluated) in
+JSON objects, it is easy to write tool rendering documentation pages for
+rules, etc, and we expect those tools to be written independently.
+Nevertheless, for the benefit of developers using rules from a git-tree
+roots that might not be checked out, there is a subcommand `describe`
+which takes a target specification like the `analyze` command, looks up
+the corresponding rule and describes it fully, i.e., prints in
+human-readable form
+
+ - the documentation for the rule
+ - all the fields available for that rule together with
+ - their type (`string_field`, `target_field`, etc), and
+ - their documentation,
+ - all the configuration variables of the rule with their documentation
+ (if given), and
+ - the documented providers.