diff options
-rw-r--r-- | rules/CC/auto/RULES | 59 | ||||
-rw-r--r-- | rules/patch/RULES | 21 | ||||
-rw-r--r-- | rules/shell/EXPRESSIONS | 87 | ||||
-rw-r--r-- | rules/shell/RULES | 145 | ||||
-rw-r--r-- | rules/shell/TARGETS | 1 | ||||
-rw-r--r-- | rules/shell/test/EXPRESSIONS | 87 | ||||
-rw-r--r-- | rules/shell/test/RULES | 7 | ||||
-rwxr-xr-x | rules/shell/test/runner | 2 |
8 files changed, 393 insertions, 16 deletions
diff --git a/rules/CC/auto/RULES b/rules/CC/auto/RULES index b1419fb..d1a147b 100644 --- a/rules/CC/auto/RULES +++ b/rules/CC/auto/RULES @@ -23,6 +23,7 @@ , "given in \"have_{cfile,cxxfile,ctype,cxxtype,csymbol,cxxsymbol}\"." ] , "defaults": ["The C/C++ toolchain to use"] + , "shell defaults": ["The shell toolchain to use"] } , "config_doc": { "CC": @@ -160,8 +161,13 @@ , "default-PATH": ["./", "..", "default-PATH"] , "default-TOOLCHAIN": ["./", "..", "default-TOOLCHAIN"] , "default-NON_SYSTEM_TOOLS": ["./", "..", "default-NON_SYSTEM_TOOLS"] + , "map_provider": ["./", "../..", "field_map_provider"] + , "sh": ["./", "../../shell", "sh"] + } + , "implicit": + { "defaults": [["./", "..", "defaults"]] + , "shell defaults": [["./", "../../shell", "defaults"]] } - , "implicit": {"defaults": [["./", "..", "defaults"]]} , "expression": { "type": "let*" , "bindings": @@ -203,12 +209,37 @@ ] , ["TOOLCHAIN_DIR", "toolchain"] , ["TOOLCHAIN", {"type": "CALL_EXPRESSION", "name": "default-TOOLCHAIN"}] + , [ "shell TOOLCHAIN" + , { "type": "let*" + , "bindings": + [ ["fieldname", "shell defaults"] + , ["provider", "TOOLCHAIN"] + , ["default", {"type": "empty_map"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} + } + ] + , [ "TOOLCHAIN" + , { "type": "disjoint_map_union" + , "msg": "Shell and CC toolchain must not conflict" + , "$1": + [ {"type": "var", "name": "TOOLCHAIN"} + , {"type": "var", "name": "shell TOOLCHAIN"} + ] + } + ] , [ "TOOLCHAIN" , { "type": "to_subdir" , "subdir": {"type": "var", "name": "TOOLCHAIN_DIR"} , "$1": {"type": "var", "name": "TOOLCHAIN"} } ] + , [ "sh" + , { "type": "let*" + , "bindings": [["fieldname", "shell defaults"]] + , "body": {"type": "CALL_EXPRESSION", "name": "sh"} + } + ] , [ "NON_SYSTEM_TOOLS" , {"type": "CALL_EXPRESSION", "name": "default-NON_SYSTEM_TOOLS"} ] @@ -573,7 +604,7 @@ ] } , "cmd": - [ "sh" + [ {"type": "var", "name": "sh"} , "./file_check.sh" , {"type": "var", "name": "CC"} , "c" @@ -617,7 +648,7 @@ ] } , "cmd": - [ "sh" + [ {"type": "var", "name": "sh"} , "./file_check.sh" , {"type": "var", "name": "CXX"} , "cxx" @@ -661,7 +692,7 @@ ] } , "cmd": - [ "sh" + [ {"type": "var", "name": "sh"} , "./type_check.sh" , {"type": "var", "name": "CC"} , "c" @@ -705,7 +736,7 @@ ] } , "cmd": - [ "sh" + [ {"type": "var", "name": "sh"} , "./type_check.sh" , {"type": "var", "name": "CXX"} , "cxx" @@ -753,7 +784,7 @@ , "cmd": { "type": "++" , "$1": - [ [ "sh" + [ [ {"type": "var", "name": "sh"} , "./symbol_check.sh" , {"type": "var", "name": "CC"} , "c" @@ -804,7 +835,7 @@ , "cmd": { "type": "++" , "$1": - [ [ "sh" + [ [ {"type": "var", "name": "sh"} , "./symbol_check.sh" , {"type": "var", "name": "CXX"} , "cxx" @@ -855,7 +886,7 @@ , "cmd": { "type": "++" , "$1": - [ [ "sh" + [ [ {"type": "var", "name": "sh"} , "./size_check.sh" , {"type": "var", "name": "CC"} , "c" @@ -913,7 +944,7 @@ , "cmd": { "type": "++" , "$1": - [ [ "sh" + [ [ {"type": "var", "name": "sh"} , "./size_check.sh" , {"type": "var", "name": "CXX"} , "cxx" @@ -964,9 +995,15 @@ ] , [ "outfile" , { "type": "ACTION" - , "inputs": {"type": "var", "name": "definitions"} + , "inputs": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "TOOLCHAIN"} + , {"type": "var", "name": "definitions"} + ] + } , "cmd": - [ "sh" + [ {"type": "var", "name": "sh"} , "-c" , { "type": "join" , "separator": " " diff --git a/rules/patch/RULES b/rules/patch/RULES index 446f842..e7d50f9 100644 --- a/rules/patch/RULES +++ b/rules/patch/RULES @@ -144,13 +144,15 @@ { "doc": ["Replace a file, logically in place, by a patched version"] , "target_fields": ["src", "patch"] , "config_vars": ["PATCH", "ENV"] - , "implicit": {"patch-defaults": ["defaults"]} + , "implicit": + {"patch-defaults": ["defaults"], "defaults": [["shell", "defaults"]]} , "field_doc": { "src": [ "The single source file to patch, typically an explicit file reference." ] , "patch": ["The patch to apply."] , "patch-defaults": ["The patch binary (and toolchain) to use"] + , "defaults": ["The shell toolchain to use"] } , "artifacts_doc": ["The patched file, staged to the position the of the original file"] @@ -163,12 +165,23 @@ , "default-ENV": "default-ENV" , "default-PATH": "default-PATH" , "default-NON_SYSTEM_TOOLS": "default-NON_SYSTEM_TOOLS" + , "sh-TOOLCHAIN": ["CC", "default-TOOLCHAIN"] + , "sh-PATH": ["CC", "default-PATH"] + , "sh": ["shell", "sh"] } , "expression": { "type": "let*" , "bindings": [ ["TOOLCHAIN_DIR", "toolchain"] - , ["TOOLCHAIN", {"type": "CALL_EXPRESSION", "name": "default-TOOLCHAIN"}] + , [ "TOOLCHAIN" + , { "type": "disjoint_map_union" + , "msg": "Staging conflict between patch and sh toolchain" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-TOOLCHAIN"} + , {"type": "CALL_EXPRESSION", "name": "sh-TOOLCHAIN"} + ] + } + ] , [ "TOOLCHAIN" , { "type": "to_subdir" , "subdir": {"type": "var", "name": "TOOLCHAIN_DIR"} @@ -228,6 +241,7 @@ { "type": "++" , "$1": [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} + , {"type": "CALL_EXPRESSION", "name": "sh-PATH"} , { "type": "if" , "cond": {"type": "var", "name": "ENV_PATH"} , "then": [{"type": "var", "name": "ENV_PATH"}] @@ -239,6 +253,7 @@ ] } ] + , ["sh", {"type": "CALL_EXPRESSION", "name": "sh"}] , [ "orig" , { "type": "let*" , "bindings": [["fieldname", "src"], ["location", "orig"]] @@ -294,7 +309,7 @@ , { "type": "ACTION" , "inputs": {"type": "var", "name": "inputs"} , "outs": ["patched"] - , "cmd": ["sh", "./run_patch.sh"] + , "cmd": [{"type": "var", "name": "sh"}, "./run_patch.sh"] , "env": {"type": "var", "name": "ENV"} } ] diff --git a/rules/shell/EXPRESSIONS b/rules/shell/EXPRESSIONS new file mode 100644 index 0000000..6ab6c7c --- /dev/null +++ b/rules/shell/EXPRESSIONS @@ -0,0 +1,87 @@ +{ "default-sh": + { "vars": ["defaults-transition", "fieldname"] + , "imports": {"list_provider": ["./", "..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ [ "fieldname" + , {"type": "var", "name": "fieldname", "default": "defaults"} + ] + , ["provider", "sh"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + , [ "provided sh" + , { "type": "join" + , "$1": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + ] + , [ "sh" + , { "type": "if" + , "cond": {"type": "var", "name": "provided sh"} + , "then": {"type": "var", "name": "provided sh"} + , "else": "sh" + } + ] + ] + , "body": {"type": "var", "name": "sh"} + } + } +, "NON_SYSTEM": + { "vars": ["defaults-transition", "fieldname"] + , "expression": + { "type": "map_union" + , "$1": + { "type": "foreach" + , "var": "x" + , "range": + { "type": "FIELD" + , "name": {"type": "var", "name": "fieldname", "default": "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"} + } + } + } + } +, "sh": + { "vars": ["defaults-transition", "TOOLCHAIN_DIR", "fieldname"] + , "imports": {"default-sh": "default-sh", "NON_SYSTEM": "NON_SYSTEM"} + , "expression": + { "type": "let*" + , "bindings": + [ ["sh", {"type": "CALL_EXPRESSION", "name": "default-sh"}] + , ["NON_SYSTEM", {"type": "CALL_EXPRESSION", "name": "NON_SYSTEM"}] + , [ "sh" + , { "type": "if" + , "cond": + { "type": "lookup" + , "key": "sh" + , "map": {"type": "var", "name": "NON_SYSTEM"} + } + , "then": + { "type": "join" + , "separator": "/" + , "$1": + [ "." + , { "type": "var" + , "name": "TOOLCHAIN_DIR" + , "default": "toolchain" + } + , {"type": "var", "name": "sh"} + ] + } + , "else": {"type": "var", "name": "sh"} + } + ] + ] + , "body": {"type": "var", "name": "sh"} + } + } +} diff --git a/rules/shell/RULES b/rules/shell/RULES new file mode 100644 index 0000000..73c295f --- /dev/null +++ b/rules/shell/RULES @@ -0,0 +1,145 @@ +{ "defaults": + { "doc": + [ "A rule to provide defaults for the usage of the shell" + , "" + , "All targets using invocations of the shell use the target" + , "[\"shel\", \"defaults\"] to determine which shell to use and how to" + , "invoke it. The definition of this default target is probably the only" + , "meaningful use of this rule." + ] + , "target_fields": ["base", "toolchain"] + , "string_fields": ["sh", "PATH"] + , "field_doc": + { "base": ["Other targets (using the same rule) to inherit values from."] + , "toolchain": + [ "Optional toolchain directory. A collection of artifacts that" + , "form the toolchain, in particular the shell itself, where not taken" + , "from the ambient host environment." + , "Values provided from base are extended." + , "This field is built for the host." + ] + , "sh": + [ "The name of the sh binary; if the the field \"toolchain\" is" + , "not empty, the value is interpreted as relative to the toolchain" + , "directory." + ] + , "PATH": + [ "Paths for looking up system tools." + , "Specifying this field extends values from \"base\"." + ] + } + , "config_vars": ["ARCH", "HOST_ARCH", "TARGET_ARCH"] + , "imports": + { "for host": ["transitions", "for host"] + , "artifacts_list": ["", "field_artifacts_list"] + , "base-provides-list": ["CC", "defaults-base-provides-list"] + , "base-provides-++": ["CC", "defaults-base-provides-++"] + , "base-provides": ["CC", "defaults-base-provides"] + } + , "config_transitions": + {"toolchain": [{"type": "CALL_EXPRESSION", "name": "for host"}]} + , "expression": + { "type": "let*" + , "bindings": + [ [ "TOOLCHAIN" + , { "type": "disjoint_map_union" + , "msg": "toolchain artifacts must not overlap" + , "$1": + { "type": "++" + , "$1": + [ { "type": "let*" + , "bindings": + [ ["provider", "TOOLCHAIN"] + , ["default", {"type": "empty_map"}] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "base-provides-list"} + } + , { "type": "let*" + , "bindings": + [ ["fieldname", "toolchain"] + , [ "transition" + , {"type": "CALL_EXPRESSION", "name": "for host"} + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "artifacts_list"} + } + ] + } + } + ] + , [ "sh" + , { "type": "if" + , "cond": {"type": "FIELD", "name": "sh"} + , "then": {"type": "FIELD", "name": "sh"} + , "else": + { "type": "let*" + , "bindings": [["provider", "sh"]] + , "body": {"type": "CALL_EXPRESSION", "name": "base-provides"} + } + } + ] + , [ "NON_SYSTEM_TOOLS" + , { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ [ { "type": "let*" + , "bindings": + [ ["provider", "NON_SYSTEM_TOOLS"] + , ["default", {"type": "empty_map"}] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "base-provides"} + } + ] + , { "type": "if" + , "cond": {"type": "FIELD", "name": "sh"} + , "then": + [ { "type": "singleton_map" + , "key": "sh" + , "value": + { "type": "if" + , "cond": {"type": "FIELD", "name": "toolchain"} + , "then": true + , "else": false + } + } + ] + } + ] + } + } + ] + , [ "PATH" + , { "type": "reverse" + , "$1": + { "type": "nub_right" + , "$1": + { "type": "reverse" + , "$1": + { "type": "++" + , "$1": + [ {"type": "FIELD", "name": "PATH"} + , { "type": "let*" + , "bindings": [["provider", "PATH"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "base-provides-++"} + } + ] + } + } + } + } + ] + ] + , "body": + { "type": "RESULT" + , "provides": + { "type": "env" + , "vars": ["TOOLCHAIN", "sh", "NON_SYSTEM_TOOLS", "PATH"] + } + } + } + } +} diff --git a/rules/shell/TARGETS b/rules/shell/TARGETS new file mode 100644 index 0000000..705d1d7 --- /dev/null +++ b/rules/shell/TARGETS @@ -0,0 +1 @@ +{"defaults": {"type": "defaults"}} diff --git a/rules/shell/test/EXPRESSIONS b/rules/shell/test/EXPRESSIONS index 2692c31..2526973 100644 --- a/rules/shell/test/EXPRESSIONS +++ b/rules/shell/test/EXPRESSIONS @@ -15,6 +15,11 @@ { "artifacts_list": ["./", "../..", "field_artifacts_list"] , "runfiles_list": ["./", "../..", "field_runfiles_list"] , "map_provider": ["./", "../..", "field_map_provider"] + , "default-TOOLCHAIN": ["./", "../../CC", "default-TOOLCHAIN"] + , "default-NON_SYSTEM_TOOLS": + ["./", "../../CC", "default-NON_SYSTEM_TOOLS"] + , "default-PATH": ["./", "../../CC", "default-PATH"] + , "default-sh": ["./", "..", "default-sh"] } , "expression": { "type": "let*" @@ -43,6 +48,86 @@ } } ] + , ["toolchain dirname", "toolchain"] + , [ "toolchain" + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "toolchain dirname"} + , "$1": {"type": "CALL_EXPRESSION", "name": "default-TOOLCHAIN"} + } + ] + , ["sh", {"type": "CALL_EXPRESSION", "name": "default-sh"}] + , [ "NON_SYSTEM_TOOLS" + , {"type": "CALL_EXPRESSION", "name": "default-NON_SYSTEM_TOOLS"} + ] + , [ "sh from workdir" + , { "type": "if" + , "cond": + { "type": "lookup" + , "key": "sh" + , "map": {"type": "var", "name": "NON_SYSTEM_TOOLS"} + } + , "then": + { "type": "join" + , "$1": ["../toolchain/", {"type": "var", "name": "sh"}] + } + , "else": {"type": "var", "name": "sh"} + } + ] + , [ "invocation cmd" + , [{"type": "var", "name": "sh from workdir"}, "../test.sh"] + ] + , [ "invocation" + , { "type": "singleton_map" + , "key": "invocation" + , "value": + { "type": "BLOB" + , "data": + { "type": "join_cmd" + , "$1": {"type": "var", "name": "invocation cmd"} + } + } + } + ] + , [ "test_env" + , {"type": "var", "name": "TEST_ENV", "default": {"type": "empty_map"}} + ] + , [ "test_env PATH" + , { "type": "lookup" + , "key": "PATH" + , "map": {"type": "var", "name": "test_env"} + } + ] + , [ "PATH" + , { "type": "join" + , "separator": ":" + , "$1": + { "type": "++" + , "$1": + [ { "type": "if" + , "cond": {"type": "var", "name": "test_env PATH"} + , "then": [{"type": "var", "name": "test_env PATH"}] + } + , {"type": "CALL_EXPRESSION", "name": "default-PATH"} + ] + } + } + ] + , [ "test_env" + , { "type": "if" + , "cond": {"type": "var", "name": "PATH"} + , "then": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "test_env"} + , { "type": "singleton_map" + , "key": "PATH" + , "value": {"type": "var", "name": "PATH"} + } + ] + } + , "else": {"type": "var", "name": "test_env"} + } + ] , [ "deps" , { "type": "TREE" , "$1": @@ -124,7 +209,9 @@ , "key": "libs" , "value": {"type": "var", "name": "run-libs"} } + , {"type": "var", "name": "toolchain"} , {"type": "var", "name": "runner"} + , {"type": "var", "name": "invocation"} , {"type": "var", "name": "test.sh"} , {"type": "var", "name": "attempt marker"} ] diff --git a/rules/shell/test/RULES b/rules/shell/test/RULES index ec26609..7a7aebd 100644 --- a/rules/shell/test/RULES +++ b/rules/shell/test/RULES @@ -53,6 +53,7 @@ [ "Tool to aggregate the results of individual test runs (for flakyness" , "detection) to an overall test result." ] + , "defaults": ["The shell toolcahin to use."] } , "config_doc": { "RUNS_PER_TEST": @@ -97,7 +98,11 @@ , "As the built-in \"install\" rule only takes the runfiles of its \"deps\"" , "argument, this gives an easy way of defining test suites." ] - , "implicit": {"runner": ["runner"], "summarizer": ["summarizer"]} + , "implicit": + { "runner": ["runner"] + , "summarizer": ["summarizer"] + , "defaults": [["./", "..", "defaults"]] + } , "imports": { "test-result": "test-result" , "action": "test-action" diff --git a/rules/shell/test/runner b/rules/shell/test/runner index 97c75ef..2f97005 100755 --- a/rules/shell/test/runner +++ b/rules/shell/test/runner @@ -36,7 +36,7 @@ cd work date +%s > ../time-start # TODO: # - proper wrapping with timeout -if sh ../test.sh > ../stdout 2> ../stderr +if . ../invocation > ../stdout 2> ../stderr then RESULT=PASS else |