// file : doc/manual.cli // copyright : Copyright (c) 2014-2017 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file "\name=build2-build-system-manual" "\subject=build system" "\title=Build System" // NOTES // // - Maximum
line is 70 characters. // " \h0#preface|Preface| This is the preface. \h1#name-patterns|Name Patterns| For convenience, in certain contexts, names can be generated with shell-like wildcard patterns. A name is a \i{name pattern} if its value contains one or more unquoted wildcard characters or character sequences. For example: \ ./: */ # All (immediate) subdirectories exe{hello}: {hxx cxx}{**} # All C++ header/source files. pattern = '*.txt' # Literal '*.txt'. \ Pattern-based name generation is not performed in certain contexts. Specifically, it is not performed in target names where it is interpreted as a pattern for target type/pattern-specific variable assignments. For example. \ s = *.txt # Variable assignment (performed). ./: cxx{*} # Prerequisite names (performed). cxx{*}: dist = false # Target pattern (not performed). \ In contexts where it is performed, it can be inhibited with quoting, for example: \ pat = 'foo*bar' ./: cxx{'foo*bar'} \ The following characters are wildcards: \ * - match any number of characters (including zero) ? - match any single character \ If a pattern ends with a directory separator, then it only matches directories. Otherwise, it only matches files. Matches that start with a dot (\c{.}) are automatically ignored unless the pattern itself also starts with this character. In addition to the above wildcard characters, \c{**} and \c{***} are recognized as wildcard character sequences. If a pattern contains \c{**}, then it is matched just like \c{*} but in all the subdirectories, recursively. The \c{***} wildcard behaves like \c{**} but also matches the start directory itself. For example: \ exe{hello}: cxx{**} # All C++ source files recursively. \ A group-enclosed (\c{{\}}) pattern value may be followed by inclusion/exclusion patterns/matches. A subsequent value is treated as an inclusion if it starts with a plus sign (\c{+}) and as an exclusion if it starts with a minus (\c{-}). A subsequent value that does not start with either of these signs is illegal. For example: \ exe{hello}: cxx{f* -foo} # Exclude foo if present. exe{hello}: cxx{f* +foo} # Include foo if not present. exe{hello}: cxx{f* -fo?} # Exclude foo and fox if present. exe{hello}: cxx{f* +b* -foo -bar} # Exclude foo and bar if present. \ Inclusion and exclusion are applied in the order specified and only to the result produced up to that point. The order of names in the result is unspecified, however, it is guaranteed not to contain duplicates. The pattern and the following inclusions/exclusions must be consistent with regards to the type of filesystem entry they match. That is, they should all match either files or directories. For example: \ exe{hello}: cxx{f* -foo +*oo} # Exclusion has no effect. exe{hello}: cxx{f* +*oo} # Ok, no duplicates. ./: {*/ -build} # Error: exclusion must match a directory. \ One common situation that calls for exclusions is auto-generated source code. Let's say we have auto-generated command line parser in \c{options.hxx} and \c{options.cxx}. Because of the in-tree builds, our name pattern may or may not find these files. Note, however, that we cannot just include them as non-pattern prerequisites. We also have to exclude them from the pattern match since otherwise we may end up with duplicate prerequisites. As a result, this is how we have to handle this case provided we want to continue using patterns to find other, non-generated source files: \ exe{hello}: {hxx cxx}{* -options} {hxx cxx}{options} \ If the name pattern includes an absolute directory, then the pattern match is performed in that directory and the generated names include absolute directories as well. Otherwise, the pattern match is performed in the \i{pattern base} directory. In buildfiles this is \c{src_base} while on the command line \- the current working directory. In this case the generated names are relative to the base directory. For example, assuming we have the \c{foo.cxx} and \c{b/bar.cxx} source files: \ exe{hello}: $src_base/cxx{**} # $src_base/cxx{foo} $src_base/b/cxx{bar} exe{hello}: cxx{**} # cxx{foo} b/cxx{bar} \ Pattern matching as well as inclusion/exclusion logic is target type-specific. If the name pattern does not contain a type, then the \c{dir{\}} type is assumed if the pattern ends with a directory separator and \c{file{\}} otherwise. For the \c{dir{\}} target type the trailing directory separator is added to the pattern and all the inclusion/exclusion patterns/matches that do not already end with one. Then the filesystem search is performed for matching directories. For example: \ ./: dir{* -build} # Search for */, exclude build/. \ For the \c{file{\}} and \c{file{\}}-based target types the default extension (if any) is added to the pattern and all the inclusion/exclusion patterns/matches that do not already contain an extension. Then the filesystem search is performed for matching files. For example, the \c{cxx{\}} target type obtains the default extension from the \c{extension} variable. Assuming we have the following line in our \c{root.build}: \ cxx{*}: extension = cxx \ And the following in our \c{buildfile}: \ exe{hello}: {cxx}{* -foo -bar.cxx} \ The pattern match will first search for all the files matching the \c{*.cxx} pattern in \c{src_base} and then exclude \c{foo.cxx} and \c{bar.cxx} from the result. Note also that target type-specific decorations are removed from the result. So in the above example if the pattern match produces \c{baz.cxx}, then the prerequisite name is \c{cxx{baz\}}, not \c{cxx{baz.cxx\}}. If the name generation cannot be performed because the base directory is unknown, target type is unknown, or the target type is not directory or file-based, then the name pattern is returned as is (that is, as an ordinary name). Project-qualified names are never considered to be patterns. \h1#grammar|Grammar| \ eval: '(' (eval-comma | eval-qual)? ')' eval-comma: eval-ternary (',' eval-ternary)* eval-ternary: eval-or ('?' eval-ternary ':' eval-ternary)? eval-or: eval-and ('||' eval-and)* eval-and: eval-comp ('&&' eval-comp)* eval-comp: eval-value (('=='|'!='|'<'|'>'|'<='|'>=') eval-value)* eval-value: value-attributes? (| eval | '!' eval-value) eval-qual: ':' value-attributes: '[' ']' \ Note that \c{?:} (ternary operator) and \c{!} (logical not) are right-associative. Unlike C++, all the comparison operators have the same precedence. A qualified name cannot be combined with any other operator (including ternary) unless enclosed in parentheses. The \c{eval} option in the \c{eval-value} production shall contain single value only (no commas). \h1#module-test|Test Module| The targets to be tested as well as the tests/groups from testscripts to be run can be narrowed down using the \c{config.test} variable. While this value is normally specified as a command line override (for example, to quickly re-run a previously failed test), it can also be persisted in \c{config.build} in order to create a configuration that will only run a subset of tests by default. For example: \ b test config.test=foo/exe{driver} # Only test foo/exe{driver} target. b test config.test=bar/baz # Only run bar/baz testscript test. \ The \c{config.test} variable contains a list of \c{@}-separated pairs with the left hand side being the target and the right hand side being the testscript id path. Either can be omitted (along with \c{@}). If the value contains a target type or ends with a directory separator, then it is treated as a target name. Otherwise \- an id path. The targets are resolved relative to the root scope where the \c{config.test} value is set. For example: \ b test config.test=foo/exe{driver}@bar \ To specify multiple id paths for the same target we can use the pair generation syntax: \ b test config.test=foo/exe{driver}@{bar baz} \ If no targets are specified (only id paths), then all the targets are tested (with the testscript tests to be run limited to the specified id paths). If no id paths are specified (only targets), then all the testscript tests are run (with the targets to be tested limited to the specified targets). An id path without a target applies to all the targets being considered. A directory target without an explicit target type (for example, \c{foo/}) is treated specially. It enables all the tests at and under its directory. This special treatment can be inhibited by specifying the target type explicitly (for example, \c{dir{foo/\}}). "