aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/variable.cxx
AgeCommit message (Collapse)AuthorFilesLines
2024-10-09Add support for JSON compilation database generation and maintenanceBoris Kolpackov1-1/+4
See the "Compilation Database" section in the "cc Module" chapter of the manual for details.
2024-09-25Use type-aware iteration in script for-loop (GH issue #436)Boris Kolpackov1-3/+6
2024-06-17Fix bug in integer, boolean value type comparisonBoris Kolpackov1-3/+3
2024-02-21Fix issue with json null representation in containersBoris Kolpackov1-2/+9
2024-02-20Add json_map and json_set buildfile value typesBoris Kolpackov1-32/+58
These expose the std::map<json_value,json_value> and std::set<json_value> types to buildfiles. New functions: $size(<json-set>) $size(<json-map>) $keys(<json-map>) Note that the $keys() function returns the list of map key as a json array. For example: m = [json_map] 2@([json] a@1 b@2) 1@([json] 1 2) s = [json_set] ([json] x@1 y@2) ([json] a@1 b@2) print ($m[2][b]) # 2 print ($s[([json] y@2 x@1)]) # true
2024-02-20Add custom subscript, iterate functions for vector and set value typesBoris Kolpackov1-2/+3
2024-02-20Add string_set buildfile value typeBoris Kolpackov1-0/+2
This exposes the std::set<std::string> type to buildfiles. New functions: $size(<string-set>) Subscript returns true if the value is present and false otherwise (so it is mapped to std::set::contains()). For example: set = [string_set] a b c if ($set[b]) ... Note that append (+=) and prepend (=+) have the same semantics (std::set::insert()). For example: set = [string_set] a b set += c b # a b c set =+ d b # a b c d Example of iteration: set = [string_set] a b c for k: $set ...
2024-02-19Add string_map buildfile value typeBoris Kolpackov1-2/+2
This exposes the std::map<std::string,std::string> type to buildfiles. New functions: $size(<string-map>) $keys(<string-map>) Subscript can be used to lookup a value by key. The result is [null] if there is no value associated with the specified key. For example: map = [string_map] a@1 b@2 c@3 b = ($map[b]) # 2 if ($map[z] == [null]) ... Note that append (+=) is overriding (like std::map::insert_or_assign()) while prepend (=+) is not (like std::map::insert()). In a sense, whatever appears last (from left to right) is kept, which is consistent with what we expect to happen when specifying the same key repeatedly in a literal representation. For example: map = [string_map] a@0 b@2 a@1 # a@1 b@2 map += b@0 c@3 # a@1 b@0 c@3 map =+ b@1 d@4 # a@1 b@0 c@3 d@4 Example of iteration: map = [string_map] a@1 b@2 c@3 for p: $map { k = $first($p) v = $second($p) } While the subscript is mapped to key lookup only, index-based access can be implemented (with a bit of overhead) using the $keys() function: map = [string_map] a@1 b@2 c@3 keys = $keys($m) for i: $integer_sequence(0, $size($keys)) { k = ($keys[$i]) v = ($map[$k]) } Also, this commit changes the naming of other template-based value types (not exposed as buildfile value types) to use C++ template id-like names (e.g., map<string,optional<bool>>).
2024-02-14Add comment on json_array assignment issueBoris Kolpackov1-0/+4
2024-02-12Move to_string(uint64_t,base,width) to utility, use everywhereBoris Kolpackov1-10/+1
2024-02-07Use reverse to fundamental types semantics in $json.member_value()Boris Kolpackov1-3/+2
Feels like this is an equivalent context to subscript/iteration.
2024-02-07Map JSON null in subscript/iteration to [null] instead of emptyBoris Kolpackov1-18/+29
This in fact feels more natural in the "for consumption" model and also helps with the nested subscript semantics.
2024-02-07Add support for nested subscript, use for json accessBoris Kolpackov1-3/+10
2024-02-07Add experimental support for JSON value typesBoris Kolpackov1-0/+926
New types: json json_array json_object New functions: $json.value_type(<json>) $json.value_size(<json>) $json.member_{name,value}(<json-member>) $json.object_names(<json-object>) $json.array_size(<json-array>) $json.array_find(<json-array>, <json>) $json.array_find_index(<json-array>, <json>) $json.load(<path>) $json.parse(<text>) $json.serialize(<json>[, <indentation>]) For example, to load a JSON value from a file: j = $json.load($src_base/board.json) Or to construct it in a buildfile: j = [json] one@1 two@([json] 2 3 4) three@([json] x@1 y@-1) This can also be done incrementally with append/prepend: j = [json_object] j += one@1 j += two@([json] 2 3 4) j += three@([json] x@1 y@-1) Instead of using this JSON-like syntax, one can also specify valid JSON input text: j = [json] '{"one":1, "two":[2, 3, 4], "three":{"x":1, "y":-1}' Besides the above set of functions, other handy ways to access components in a JSON value are iteration and subscript. For example: for m: $j print $member_name($m) $member_value($m) print ($j[three]) A subscript can be nested: print ($j[two][1]) print ($j[three][x]) While a JSON value can be printed directly like any other value, the representation will not be pretty-printed. As a result, for complex JSON values, printing a serialized representation might be a more readable option: info $serialize($j)
2024-02-06Add support for value type-specific subscript and iterationBoris Kolpackov1-18/+46
2024-01-10Fix abs_dir_path conversion diagnosticsBoris Kolpackov1-1/+8
2023-04-05Allow creating context with bare minimum of initializationsBoris Kolpackov1-2/+2
This is used by bpkg to detect forwarded configurations without incurring the full context creation overhead.
2023-03-02Replace deprecated std::aligned_storage with alignasBoris Kolpackov1-5/+5
Based on patch by Matthew Krupcale.
2022-12-15Add noexcept to move constructors and move assignment operatorsKaren Arutyunov1-1/+3
2022-12-14Improve empty simple value to empty list of names reduction heuristicsBoris Kolpackov1-10/+31
Specifically, do not reduce typed RHS empty simple values for prepend/append and additionally for assignment provided LHS is typed and is a container.
2022-10-27Suppress (potential) bogus GCC 12 -Wrestrict warningsBoris Kolpackov1-3/+3
2022-10-24Allow conversion of untyped split dir/value names to stringBoris Kolpackov1-11/+19
2022-10-13Switch to public/private variables modelBoris Kolpackov1-1/+66
Now unqualified variables are project-private and can be typified.
2022-10-11Factor variable patterns out of variable_pool into separate variable_patternsBoris Kolpackov1-16/+18
We have patterns only for the public variables pool.
2022-10-10Preparatory work for public/private variable distinctionBoris Kolpackov1-1/+95
We still always use the public var_pool from context but where required, all access now goes through scope::var_pool().
2022-10-10Use term shared instead of global for scope, var pool, etcBoris Kolpackov1-7/+7
2022-09-22Add support for hex notation for uint64 typeBoris Kolpackov1-12/+30
Specifically, now we can do: x = [uint64] 0x0000ffff cxx.poptions += "-DOFFSET=$x" # -DOFFSET=65535 cxx.poptions += "-DOFFSET=$string($x, 16)" # -DOFFSET=0xffff cxx.poptions += "-DOFFSET=$string($x, 16, 8)" # -DOFFSET=0x0000ffff Note that there is no hex notation support for the int64 (signed) type.
2022-07-07Use new cmdline type for canned command lines in {Build,Test}scriptBoris Kolpackov1-0/+132
2022-06-03Reset value::extra on variable_map value change/version incrementBoris Kolpackov1-1/+7
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-05-22Add support for variable patterns in config.config.disfigureBoris Kolpackov1-0/+8
2022-03-02Add update operation-specific variable with unmatch|match additional valuesBoris Kolpackov1-1/+1
Note that the unmatch (match but do not update) and match (update during match) values are only supported by certain rules (and potentially only for certain prerequisite types). Additionally: - All operation-specific variables are now checked for false as an override for the prerequisite-specific include value. In particular, this can now be used to disable a prerequisite for update, for example: ./: exe{test}: update = false - The cc::link_rule now supports the update=match value for headers and ad hoc prerequisites. In particular, this can be used to make sure all the library headers are updated before matching any of its (or dependent's) object files.
2022-01-06Factor reusable code to target_key::effective_name()Boris Kolpackov1-33/+2
2021-09-28Adapt to libbutl headers extension change from .mxx to .hxxKaren Arutyunov1-1/+1
2021-09-02Don't consider aliasing in variable override lookupBoris Kolpackov1-2/+3
2021-07-23Reserve variable names/components that start with underscore to build2 coreBoris Kolpackov1-3/+3
2021-05-28Add support for regex-based target type/pattern specific variablesBoris Kolpackov1-14/+81
This is in addition to the already supported path-based target type/pattern specific variables. For example: hxx{*}: x = y # path-based hxx{~/.*/}: x = y # regex-based
2021-05-28Ban conversion of patterns to valuesBoris Kolpackov1-47/+54
Also improve conversion diagnostic.
2021-05-28Tie loose ends in target type/pattern-specific matchingBoris Kolpackov1-5/+56
2021-05-28Make notion of name pattern explicit, fix various related loose endsBoris Kolpackov1-2/+1
2021-04-20Detect environment changes in ad hoc recipesBoris Kolpackov1-3/+24
2021-04-04Add base functionality for hermetic build configurationshermeticBoris Kolpackov1-0/+8
2021-02-09Minor simplificationBoris Kolpackov1-2/+2
2021-01-30Add std::{map, multimap} to types.hxxBoris Kolpackov1-5/+5
Seeing that std::map is becoming a common Buildfile variable type.
2021-01-28Make std::map prepend (=+) overriding (like insert_or_assign())Boris Kolpackov1-0/+6
2021-01-22Add support for optional pair halves in variable valuesBoris Kolpackov1-0/+12
2020-11-11Make value_traits<bool>::convert() non-modifyingBoris Kolpackov1-1/+1
2020-08-24Add copying version of convert<T>(value)Boris Kolpackov1-0/+18
2020-08-12Add int64 and int64s variable typesBoris Kolpackov1-0/+49
2020-06-09Make metadata variable prefix mandatoryBoris Kolpackov1-4/+1
While we could automatically set it if the target is imported, there is nothing we can do if the target is used in the same project. So to avoid confusion we make it mandatory.
2020-06-03Fix $process.run() to properly handle proces_path_exKaren Arutyunov1-1/+14