diff options
Diffstat (limited to 'rules/patch')
-rw-r--r-- | rules/patch/EXPRESSIONS | 77 | ||||
-rw-r--r-- | rules/patch/RULES | 318 | ||||
-rw-r--r-- | rules/patch/TARGETS | 6 |
3 files changed, 401 insertions, 0 deletions
diff --git a/rules/patch/EXPRESSIONS b/rules/patch/EXPRESSIONS new file mode 100644 index 0000000..7f8ce19 --- /dev/null +++ b/rules/patch/EXPRESSIONS @@ -0,0 +1,77 @@ +{ "default-PATCH": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "patch-defaults"] + , ["provider", "PATCH"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } +, "default-ENV": + { "vars": ["defaults-transition"] + , "imports": {"map_provider": ["./", "..", "field_map_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "patch-defaults"] + , ["provider", "ENV"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + , ["default", {"type": "empty_map"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} + } + } +, "default-PATH": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "patch-defaults"] + , ["provider", "PATH"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } +, "default-TOOLCHAIN": + { "vars": ["defaults-transition"] + , "imports": {"map_provider": ["./", "..", "field_map_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "patch-defaults"] + , ["provider", "TOOLCHAIN"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + , ["default", {"type": "empty_map"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} + } + } +, "default-NON_SYSTEM_TOOLS": + { "vars": ["defaults-transition"] + , "expression": + { "type": "map_union" + , "$1": + { "type": "foreach" + , "var": "x" + , "range": {"type": "FIELD", "name": "patch-defaults"} + , "body": + { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "x"} + , "provider": "NON_SYSTEM_TOOLS" + , "transition": + { "type": "var" + , "name": "defaults-transition" + , "default": {"type": "empty_map"} + } + , "default": {"type": "empty_map"} + } + } + } + } +} diff --git a/rules/patch/RULES b/rules/patch/RULES new file mode 100644 index 0000000..712a487 --- /dev/null +++ b/rules/patch/RULES @@ -0,0 +1,318 @@ +{ "defaults": + { "doc": + [ "A rule to provide defaults." + , "All targets take their defaults for PATCH from the target" + , "[\"\", \"defaults\"]. This is probably the only sensible" + , "use of this rule. As targets form a different root, the defaults" + , "can be provided without changing this directory." + ] + , "target_fields": ["base", "toolchain"] + , "string_fields": ["PATCH", "PATH", "SYSTEM_TOOLS"] + , "field_doc": + { "base": ["Other targets (using the same rule) to inherit values from."] + , "toolchain": + [ "Optional toolchain directory. A collection of artifacts that provide" + , "the tool PATCH. Note that only artifacts of" + , "the specified targets are considered (no runfiles etc.). Specifying" + , "this field extends artifacts from \"base\"." + ] + , "PATCH": ["The patch binary to use"] + , "SYSTEM_TOOLS": + [ "List of tools (\"PATCH\") that should be taken from" + , "the system instead of from \"toolchain\" (if specified)." + ] + , "PATH": + [ "Path for looking up the compilers. Individual paths are joined" + , "with \":\". Specifying this field extends values from \"base\"." + ] + } + , "config_vars": ["ARCH", "HOST_ARCH", "TARGET_ARCH"] + , "imports": + { "base-provides": ["CC", "defaults-base-provides"] + , "base-provides-list": ["CC", "defaults-base-provides-list"] + , "artifacts_list": ["", "field_artifacts_list"] + , "nub_left": ["", "nub_left"] + , "for host": ["transitions", "for host"] + } + , "config_transitions": + {"toolchain": [{"type": "CALL_EXPRESSION", "name": "for host"}]} + , "expression": + { "type": "let*" + , "bindings": + [ ["PATCH", {"type": "FIELD", "name": "PATCH"}] + , ["PATH", {"type": "FIELD", "name": "PATH"}] + , ["provider", "PATCH"] + , [ "PATCH" + , { "type": "if" + , "cond": {"type": "var", "name": "PATCH"} + , "then": {"type": "var", "name": "PATCH"} + , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"} + } + ] + , ["provider", "PATH"] + , [ "PATH" + , { "type": "++" + , "$1": + [ {"type": "var", "name": "PATH"} + , { "type": "++" + , "$1": {"type": "CALL_EXPRESSION", "name": "base-provides-list"} + } + ] + } + ] + , [ "PATH" + , { "type": "let*" + , "bindings": [["list", {"type": "var", "name": "PATH"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "nub_left"} + } + ] + , ["provider", "ENV"] + , ["default", {"type": "empty_map"}] + , ["ENV", {"type": "CALL_EXPRESSION", "name": "base-provides"}] + , ["provider", "NON_SYSTEM_TOOLS"] + , ["default", {"type": "empty_map"}] + , [ "NON_SYSTEM_TOOLS" + , { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ [{"type": "CALL_EXPRESSION", "name": "base-provides"}] + , { "type": "if" + , "cond": {"type": "FIELD", "name": "PATCH"} + , "then": + [ { "type": "singleton_map" + , "key": "PATCH" + , "value": + { "type": "if" + , "cond": {"type": "FIELD", "name": "toolchain"} + , "then": true + , "else": false + } + } + ] + } + , { "type": "foreach" + , "range": {"type": "FIELD", "name": "SYSTEM_TOOLS"} + , "var": "tool" + , "body": + { "type": "singleton_map" + , "key": {"type": "var", "name": "tool"} + , "value": false + } + } + ] + } + } + ] + , ["provider", "TOOLCHAIN"] + , ["default", {"type": "empty_map"}] + , [ "TOOLCHAIN" + , { "type": "disjoint_map_union" + , "msg": "toolchain artifacts may not overlap" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "base-provides-list"} + , { "type": "if" + , "cond": {"type": "FIELD", "name": "toolchain"} + , "then": + { "type": "let*" + , "bindings": + [ ["fieldname", "toolchain"] + , [ "transition" + , {"type": "CALL_EXPRESSION", "name": "for host"} + ] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "artifacts_list"} + } + } + ] + } + } + ] + ] + , "body": + { "type": "RESULT" + , "provides": + { "type": "env" + , "vars": ["PATCH", "PATH", "ENV", "TOOLCHAIN", "NON_SYSTEM_TOOLS"] + } + } + } + } +, "file": + { "doc": ["Replace a file, logically in place, by a patched version"] + , "target_fields": ["src", "patch"] + , "config_vars": ["PATCH", "ENV"] + , "implicit": {"patch-defaults": ["defaults"]} + , "field_doc": + { "src": + [ "The single source file to patch, typically an explicit file reference." + ] + , "patch": ["The patch to apply."] + } + , "artifacts_doc": + ["The patched file, staged to the position the of the original file"] + , "runfiles_doc": ["Same as artifacts"] + , "imports": + { "stage_field": ["./", "..", "stage_singleton_field"] + , "stage_artifact": ["./", "..", "stage_artifact_to_singleton_field"] + , "default-PATCH": "default-PATCH" + , "default-TOOLCHAIN": "default-TOOLCHAIN" + , "default-ENV": "default-ENV" + , "default-PATH": "default-PATH" + , "default-NON_SYSTEM_TOOLS": "default-NON_SYSTEM_TOOLS" + } + , "expression": + { "type": "let*" + , "bindings": + [ ["TOOLCHAIN_DIR", "toolchain"] + , ["TOOLCHAIN", {"type": "CALL_EXPRESSION", "name": "default-TOOLCHAIN"}] + , [ "TOOLCHAIN" + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "TOOLCHAIN_DIR"} + , "$1": {"type": "var", "name": "TOOLCHAIN"} + } + ] + , [ "NON_SYSTEM_TOOLS" + , {"type": "CALL_EXPRESSION", "name": "default-NON_SYSTEM_TOOLS"} + ] + , [ "PATCH" + , { "type": "var" + , "name": "PATCH" + , "default": + { "type": "join" + , "$1": + { "type": "++" + , "$1": + [ { "type": "if" + , "cond": + { "type": "lookup" + , "key": "PATCH" + , "map": {"type": "var", "name": "NON_SYSTEM_TOOLS"} + } + , "then": + ["./", {"type": "var", "name": "TOOLCHAIN_DIR"}, "/"] + } + , {"type": "CALL_EXPRESSION", "name": "default-PATCH"} + ] + } + } + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} + ] + } + ] + , [ "ENV_PATH" + , { "type": "lookup" + , "map": {"type": "var", "name": "ENV"} + , "key": "PATH" + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "ENV"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , { "type": "if" + , "cond": {"type": "var", "name": "ENV_PATH"} + , "then": [{"type": "var", "name": "ENV_PATH"}] + } + ] + } + } + } + ] + } + ] + , [ "orig" + , { "type": "let*" + , "bindings": [["fieldname", "src"], ["location", "orig"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} + } + ] + , [ "patch" + , { "type": "let*" + , "bindings": [["fieldname", "patch"], ["location", "patch"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} + } + ] + , [ "script" + , { "type": "singleton_map" + , "key": "run_patch.sh" + , "value": + { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + [ "set -e" + , "cp orig patched" + , "chmod +w patched" + , { "type": "join" + , "$1": + [ { "type": "join_cmd" + , "$1": + [ {"type": "var", "name": "PATCH", "default": "patch"} + , "patched" + , "patch" + ] + } + , " >log || (cat log && exit 1)" + ] + } + ] + } + } + } + ] + , [ "inputs" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "orig"} + , {"type": "var", "name": "patch"} + , {"type": "var", "name": "TOOLCHAIN"} + , {"type": "var", "name": "script"} + ] + } + ] + , [ "patched" + , { "type": "ACTION" + , "inputs": {"type": "var", "name": "inputs"} + , "outs": ["patched"] + , "cmd": ["sh", "./run_patch.sh"] + , "env": {"type": "var", "name": "ENV"} + } + ] + , [ "result" + , { "type": "let*" + , "bindings": + [ ["artifact", {"type": "var", "name": "patched"}] + , ["fieldname", "src"] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "stage_artifact"} + } + ] + ] + , "body": + { "type": "RESULT" + , "artifacts": {"type": "var", "name": "result"} + , "runfiles": {"type": "var", "name": "result"} + } + } + } +} diff --git a/rules/patch/TARGETS b/rules/patch/TARGETS new file mode 100644 index 0000000..9a0ad77 --- /dev/null +++ b/rules/patch/TARGETS @@ -0,0 +1,6 @@ +{ "defaults": + { "type": ["patch", "defaults"] + , "PATCH": ["patch"] + , "PATH": ["/bin", "/usr/bin"] + } +} |