summaryrefslogtreecommitdiff
path: root/rules
diff options
context:
space:
mode:
authorOliver Reiche <oliver.reiche@huawei.com>2022-08-24 18:23:37 +0200
committerOliver Reiche <oliver.reiche@huawei.com>2022-09-13 10:51:13 +0200
commitdd88616b852f2837917ee31777b5a6479941ae05 (patch)
treeead544934c549be7d957a038f51fb436a42e9171 /rules
parentee852191cec36b9a1aabe9c8fc741beb7193d0e4 (diff)
downloadjustbuild-dd88616b852f2837917ee31777b5a6479941ae05.tar.gz
Rules: Implement hierarchical defaults
Diffstat (limited to 'rules')
-rw-r--r--rules/CC/EXPRESSIONS23
-rw-r--r--rules/CC/RULES134
-rw-r--r--rules/CC/proto/EXPRESSIONS3
3 files changed, 135 insertions, 25 deletions
diff --git a/rules/CC/EXPRESSIONS b/rules/CC/EXPRESSIONS
index d04591f2..7ebc8ad4 100644
--- a/rules/CC/EXPRESSIONS
+++ b/rules/CC/EXPRESSIONS
@@ -48,6 +48,29 @@
, "body": {"type": "CALL_EXPRESSION", "name": "provider_list"}
}
}
+, "defaults-base-provides":
+ { "doc": ["Query list-provider from 'base' targets (last wins)"]
+ , "vars": ["provider"]
+ , "vars_doc":
+ {"provider": ["The name of the list-provider in the provides map."]}
+ , "imports": {"provider_list": ["./", "..", "field_provider_list"]}
+ , "expression":
+ { "type": "let*"
+ , "bindings": [["fieldname", "base"]]
+ , "body":
+ { "type": "foldl"
+ , "var": "next"
+ , "accum_var": "curr"
+ , "range": {"type": "CALL_EXPRESSION", "name": "provider_list"}
+ , "body":
+ { "type": "if"
+ , "cond": {"type": "var", "name": "next"}
+ , "then": {"type": "var", "name": "next"}
+ , "else": {"type": "var", "name": "curr"}
+ }
+ }
+ }
+ }
, "configure transition":
{ "vars": ["COMPILER_FAMILY"]
, "expression":
diff --git a/rules/CC/RULES b/rules/CC/RULES
index 099a629b..d4a85b70 100644
--- a/rules/CC/RULES
+++ b/rules/CC/RULES
@@ -6,45 +6,131 @@
, "use of this rule. As targets form a different root, the defaults"
, "can be provided without changing this directory."
]
- , "string_fields": ["CC", "CXX", "CFLAGS", "CXXFLAGS", "PATH", "AR"]
+ , "target_fields": ["base"]
+ , "string_fields":
+ [ "CC"
+ , "CXX"
+ , "CFLAGS"
+ , "CXXFLAGS"
+ , "ADD_CFLAGS"
+ , "ADD_CXXFLAGS"
+ , "PATH"
+ , "AR"
+ ]
+ , "imports": {"base-provides": "defaults-base-provides"}
, "expression":
- { "type": "RESULT"
- , "provides":
- { "type": "map_union"
- , "$1":
- [ { "type": "singleton_map"
- , "key": "CC"
- , "value": {"type": "FIELD", "name": "CC"}
+ { "type": "let*"
+ , "bindings":
+ [ ["CC", {"type": "FIELD", "name": "CC"}]
+ , ["CXX", {"type": "FIELD", "name": "CXX"}]
+ , ["CFLAGS", {"type": "FIELD", "name": "CFLAGS"}]
+ , ["CXXFLAGS", {"type": "FIELD", "name": "CXXFLAGS"}]
+ , ["AR", {"type": "FIELD", "name": "AR"}]
+ , ["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"}
}
- , { "type": "singleton_map"
- , "key": "CXX"
- , "value": {"type": "FIELD", "name": "CXX"}
+ ]
+ , ["provider", "CXX"]
+ , [ "CXX"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "CXX"}
+ , "then": {"type": "var", "name": "CXX"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"}
}
- , { "type": "singleton_map"
- , "key": "CFLAGS"
- , "value": {"type": "FIELD", "name": "CFLAGS"}
+ ]
+ , ["provider", "CFLAGS"]
+ , [ "CFLAGS"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "CFLAGS"}
+ , "then": {"type": "var", "name": "CFLAGS"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"}
}
- , { "type": "singleton_map"
- , "key": "CXXFLAGS"
- , "value": {"type": "FIELD", "name": "CXXFLAGS"}
+ ]
+ , ["provider", "CXXFLAGS"]
+ , [ "CXXFLAGS"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "CXXFLAGS"}
+ , "then": {"type": "var", "name": "CXXFLAGS"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"}
}
- , { "type": "singleton_map"
- , "key": "AR"
- , "value": {"type": "FIELD", "name": "AR"}
+ ]
+ , ["provider", "AR"]
+ , [ "AR"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "AR"}
+ , "then": {"type": "var", "name": "AR"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"}
}
- , { "type": "singleton_map"
- , "key": "ENV"
- , "value":
+ ]
+ , ["provider", "ENV"]
+ , [ "ENV"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "PATH"}
+ , "then":
{ "type": "singleton_map"
, "key": "PATH"
, "value":
{ "type": "join"
, "separator": ":"
- , "$1": {"type": "FIELD", "name": "PATH"}
+ , "$1": {"type": "var", "name": "PATH"}
}
}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"}
}
]
+ , [ "CFLAGS"
+ , { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "CFLAGS"}
+ , {"type": "FIELD", "name": "ADD_CFLAGS"}
+ ]
+ }
+ ]
+ , [ "CXXFLAGS"
+ , { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "CXXFLAGS"}
+ , {"type": "FIELD", "name": "ADD_CXXFLAGS"}
+ ]
+ }
+ ]
+ ]
+ , "body":
+ { "type": "RESULT"
+ , "provides":
+ { "type": "map_union"
+ , "$1":
+ [ { "type": "singleton_map"
+ , "key": "CC"
+ , "value": {"type": "var", "name": "CC"}
+ }
+ , { "type": "singleton_map"
+ , "key": "CXX"
+ , "value": {"type": "var", "name": "CXX"}
+ }
+ , { "type": "singleton_map"
+ , "key": "CFLAGS"
+ , "value": {"type": "var", "name": "CFLAGS"}
+ }
+ , { "type": "singleton_map"
+ , "key": "CXXFLAGS"
+ , "value": {"type": "var", "name": "CXXFLAGS"}
+ }
+ , { "type": "singleton_map"
+ , "key": "AR"
+ , "value": {"type": "var", "name": "AR"}
+ }
+ , { "type": "singleton_map"
+ , "key": "ENV"
+ , "value": {"type": "var", "name": "ENV"}
+ }
+ ]
+ }
}
}
}
diff --git a/rules/CC/proto/EXPRESSIONS b/rules/CC/proto/EXPRESSIONS
index 4f807fe8..ac0018aa 100644
--- a/rules/CC/proto/EXPRESSIONS
+++ b/rules/CC/proto/EXPRESSIONS
@@ -7,7 +7,8 @@
}
}
, "protoc-compile":
- { "vars": ["transition", "service support"]
+ { "vars":
+ ["transition", "service support", "CXX", "CXXFLAGS", "ADD_CXXFLAGS"]
, "imports":
{ "stage": ["", "stage_singleton_field"]
, "result": ["./", "..", "lib result"]