aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/parser.cxx
AgeCommit message (Collapse)AuthorFilesLines
2022-10-21Change attribute syntax in script to come after variable in set and for (set ↵Karen Arutyunov1-21/+25
x [...], for x [...])
2022-10-20Tweak documentation in parser::parse_for()Karen Arutyunov1-2/+2
2022-10-20Add support for for-loop element typeKaren Arutyunov1-8/+24
2022-10-20Diagnose incorrect output directory specificationBoris Kolpackov1-1/+24
2022-10-14Fix 'for [<attrs>] x: ...' to treat <attrs> as value attributesKaren Arutyunov1-12/+0
2022-10-13Add visibility, overridable variable attributesBoris Kolpackov1-11/+70
2022-10-13Switch to public/private variables modelBoris Kolpackov1-2/+10
Now unqualified variables are project-private and can be typified.
2022-10-10Preparatory work for public/private variable distinctionBoris Kolpackov1-5/+4
We still always use the public var_pool from context but where required, all access now goes through scope::var_pool().
2022-09-29Fix variable append logic in scriptBoris Kolpackov1-0/+12
2022-09-28Add support for typed value subscriptBoris Kolpackov1-5/+37
2022-09-27Fix bug in handling of name patterns with trailing dotKaren Arutyunov1-1/+8
2022-09-16Register fallback dist meta-operation rule for out of project targetsBoris Kolpackov1-1/+3
The problematic scenario this fixes is an ad hoc pattern rule (which we register for dist in order to inject any additional sources; see parser.cxx for details) that pulls a tool imported from the system (say /usr/bin/xxd).
2022-09-13Fix bug in handling of disabled recipes in ad hoc pattern rulesBoris Kolpackov1-3/+16
2022-09-09Evaluate target specific variable assignment/block on ad hoc membersBoris Kolpackov1-35/+99
This is in preparation for (again) not treating primary member of an ad hoc group as a group for variable lookup.
2022-09-05Allow empty prerequisites in prerequisite-specific variable assignment/blockBoris Kolpackov1-27/+52
The old semantics was not very consistent, consider: exe{foo}: cxx{$empty} # Ok. exe{foo}: cxx{$empty}: include = false # Not ok? So now both are ok, as well as the block variant: exe{foo}: cxx{$empty}: { include = false } Note that the empty prerequisite list in the dependency chain is still an error: ./: exe{$empty}: cxx{foo} # Error. Note also that the syntactically-empty prerequisite list was and still is an error: exe{foo}: : include = false # Error.
2022-09-02Add missing if! support in recipesBoris Kolpackov1-2/+2
2022-07-21Use bundle scope when deciding whether project is being distributedBoris Kolpackov1-2/+3
2022-07-21Add link to HOWTO entry in conditional dependency declaration warningBoris Kolpackov1-1/+3
2022-07-21Don't issue conditional dependency declaration warning for imported projectsBoris Kolpackov1-7/+19
2022-07-20Tweak diagnosticsBoris Kolpackov1-1/+1
2022-07-20Adjust conditional dependency declaration warning logicBoris Kolpackov1-5/+13
Now instead of ignoring imported stuff (which turned out to be racy), we only consider conditions up to the include boundary. The thinking here is that an included (but not sourced) buildfile is a standalone entity (e.g., imported project but also could be just a side-included buildfile). Note that unfortunately we will still be issuing warnings in imported projects since there is no straightforward way to know what is being distributed and what is not while parsing.
2022-07-19Warn about conditional dependency declarations during distributionBoris Kolpackov1-0/+42
2022-07-07Use new cmdline type for canned command lines in {Build,Test}scriptBoris Kolpackov1-0/+1
2022-06-28Add support for querying out-qualified target-specific variablesBoris Kolpackov1-27/+54
2022-06-28Handle out-qualified prerequisitesBoris Kolpackov1-6/+20
2022-06-28Add support for rule-specific import phase 2Boris Kolpackov1-15/+44
For example: import! [metadata, rule_hint=cxx.link] lib = libhello%lib{hello}
2022-06-21Add --trace-{match,execute} optionsBoris Kolpackov1-32/+72
These options can be used to understand which dependency chain causes matching or execution of a particular target.
2022-06-03Reset value::extra on variable_map value change/version incrementBoris Kolpackov1-1/+1
The reset on each modification semantics is used to implement the default value distinction as currently done in the config module but later probably will be done for ?= and $origin().
2022-06-03Expose type name to value_type mapping function in parserBoris Kolpackov1-4/+4
2022-04-08Register ad hoc rules for configure in addition to distBoris Kolpackov1-8/+12
2022-04-06Add support for specifying custom ad hoc pattern rule namesBoris Kolpackov1-7/+53
Besides diagnostics, this allows us to use name in the rule hint, for example: [rule_name=hello.link] exe{~'/(.*)/'}: obje{~'/\1/'} {{ $cxx.path -o $path($>) $path($<[0]) }} [rule_hint=hello] exe{hello}: obje{hello} obje{hello}: c{hello-c}
2022-04-06Add support for rule hintsBoris Kolpackov1-14/+115
A rule hint is a target attribute, for example: [rule_hint=cxx] exe{hello}: c{hello} Rule hints can be used to resolve ambiguity when multiple rules match the same target as well as to override an unambiguous match.
2022-03-23Make project configuration variables non-nullable by defaultBoris Kolpackov1-4/+46
A project configuration variable with the NULL default value is naturally assumed nullable, for example: config [string] config.libhello.fallback_name ?= [null] Otherwise, to make a project configuration nullable we use the `null` variable attribute, for example: config [string, null] config.libhello.fallback_name ?= "World"
2022-02-21Ban module names that start with underscoreBoris Kolpackov1-0/+3
2022-02-16Invent quoting modes for to_stream(name)Karen Arutyunov1-1/+1
2022-02-14Add parser::parse_eval() public API functionBoris Kolpackov1-0/+44
2022-02-07Add support for meta-operation wildcard in scope::insert_rule()Boris Kolpackov1-0/+6
2022-01-06Add depdb-dyndep --update-{include,exclude} optionsBoris Kolpackov1-1/+2
These options specify prerequisite targets/patterns to include/exclude (from the static prerequisite set) for update during match as part of dynamic dependency extraction (those excluded will be updated during execute). For example: depdb dyndep ... --update-exclude libue{hello-meta} ... depdb dyndep ... --update-exclude libue{*} ... depdb dyndep ... --update-include $moc --update-include hxx{*} ... The order in which these options are specified is significant with the first target/pattern that matches determining the result. If only the --update-include options are specified, then only the explicitly included prerequisites will be updated. Otherwise, all prerequisites that are not explicitly excluded will be updated. If none of these options is specified, then all the static prerequisites are updated during match. Note also that these options do not apply to ad hoc prerequisites which are always updated during match.
2021-12-02Automatically register pattern rules for dist meta-operationBoris Kolpackov1-4/+28
We need to do this in order to inject additional pattern prerequisites which may "pull" additional sources into the distribution.
2021-10-14Add ability to detect sole expansion in parser::parse_names()Boris Kolpackov1-5/+12
2021-09-28Adapt to libbutl headers extension change from .mxx to .hxxKaren Arutyunov1-1/+1
2021-09-20Assign pre-defined semantics to config.<project>.develop variablesBoris Kolpackov1-20/+59
This variable allows a project to distinguish between development and consumption builds. While normally there is no distinction between these two modes, sometimes a project may need to provide additional functionality during development. For example, a source code generator which uses its own generated code in its implementation may need to provide a bootstrap step from the pre-generated code. Normally, such a step is only needed during development. See "Project Configuration" in the manual for details.
2021-08-09Use parse_variable_name() in parse_import(), parse_config()Boris Kolpackov1-15/+19
2021-08-09Make variable assignment mandatory in import directiveBoris Kolpackov1-125/+52
In return we get the ability to specify value attributes.
2021-08-04Take into account file-base'ness in ad hoc buildscript recipesBoris Kolpackov1-3/+9
2021-07-23Reserve variable names/components that start with underscore to build2 coreBoris Kolpackov1-2/+28
2021-06-08Redo low verbosity diagnostic deduction to use scope instead of targetBoris Kolpackov1-8/+2
2021-06-08Get rid of special *{} wildcard target type notation in target type/patternsBoris Kolpackov1-17/+6
Explicit target{} should be used instead. Also, in this context, absent target type is now treated as file{} rather than target{}, for consistency with all other cases.
2021-06-08Implement ad hoc regex pattern rule supportBoris Kolpackov1-189/+600
An ad hoc pattern rule consists of a pattern that mimics a dependency declaration followed by one or more recipes. For example: exe{~'/(.*)/'}: cxx{~'/\1/'} {{ $cxx.path -o $path($>) $path($<[0]) }} If a pattern matches a dependency declaration of a target, then the recipe is used to perform the corresponding operation on this target. For example, the following dependency declaration matches the above pattern which means the rule's recipe will be used to update this target: exe{hello}: cxx{hello} While the following declarations do not match the above pattern: exe{hello}: c{hello} # Type mismatch. exe{hello}: cxx{howdy} # Name mismatch. On the left hand side of `:` in the pattern we can have a single target or an ad hoc target group. The single target or the first (primary) ad hoc group member must be a regex pattern (~). The rest of the ad hoc group members can be patterns or substitutions (^). For example: <exe{~'/(.*)/'} file{^'/\1.map/'}>: cxx{~'/\1/'} {{ $cxx.path -o $path($>[0]) "-Wl,-Map=$path($>[1])" $path($<[0]) }} On the left hand side of `:` in the pattern we have prerequisites which can be patterns, substitutions, or non-patterns. For example: <exe{~'/(.*)/'} file{^'/\1.map/'}>: cxx{~'/\1/'} hxx{^'/\1/'} hxx{common} {{ $cxx.path -o $path($>[0]) "-Wl,-Map=$path($>[1])" $path($<[0]) }} Substitutions on the left hand side of `:` and substitutions and non-patterns on the right hand side are added to the dependency declaration. For example, given the above rule and dependency declaration, the effective dependency is going to be: <exe{hello} file{hello.map>: cxx{hello} hxx{hello} hxx{common}
2021-06-08Only pass target to recipe_text() if recipe is not sharedBoris Kolpackov1-3/+9