diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/EXPRESSIONS | 87 | ||||
-rw-r--r-- | shell/RULES | 145 | ||||
-rw-r--r-- | shell/TARGETS | 1 | ||||
-rw-r--r-- | shell/test/EXPRESSIONS | 90 | ||||
-rw-r--r-- | shell/test/RULES | 7 | ||||
-rwxr-xr-x | shell/test/runner | 2 |
6 files changed, 327 insertions, 5 deletions
diff --git a/shell/EXPRESSIONS b/shell/EXPRESSIONS new file mode 100644 index 0000000..6ab6c7c --- /dev/null +++ b/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/shell/RULES b/shell/RULES new file mode 100644 index 0000000..73c295f --- /dev/null +++ b/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/shell/TARGETS b/shell/TARGETS new file mode 100644 index 0000000..705d1d7 --- /dev/null +++ b/shell/TARGETS @@ -0,0 +1 @@ +{"defaults": {"type": "defaults"}} diff --git a/shell/test/EXPRESSIONS b/shell/test/EXPRESSIONS index 80e6cdb..e158a4c 100644 --- a/shell/test/EXPRESSIONS +++ b/shell/test/EXPRESSIONS @@ -14,6 +14,11 @@ , "imports": { "artifacts_list": ["./", "../..", "field_artifacts_list"] , "runfiles_list": ["./", "../..", "field_runfiles_list"] + , "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*" @@ -42,6 +47,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": @@ -106,7 +191,9 @@ , "key": "work" , "value": {"type": "var", "name": "deps"} } + , {"type": "var", "name": "toolchain"} , {"type": "var", "name": "runner"} + , {"type": "var", "name": "invocation"} , {"type": "var", "name": "test.sh"} , {"type": "var", "name": "attempt marker"} ] @@ -115,9 +202,6 @@ , [ "cmd" , {"type": "++", "$1": [["./runner"], {"type": "var", "name": "keep"}]} ] - , [ "test_env" - , {"type": "var", "name": "TEST_ENV", "default": {"type": "empty_map"}} - ] ] , "body": { "type": "if" diff --git a/shell/test/RULES b/shell/test/RULES index 44acb00..6539622 100644 --- a/shell/test/RULES +++ b/shell/test/RULES @@ -49,6 +49,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": @@ -93,7 +94,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/shell/test/runner b/shell/test/runner index a99d5b7..f762355 100755 --- a/shell/test/runner +++ b/shell/test/runner @@ -35,7 +35,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 |