diff options
author | Alberto Sartori <alberto.sartori@huawei.com> | 2024-06-24 15:49:36 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-06-24 15:49:36 +0200 |
commit | f87ad41f72ca4465a0c5b4ba9fd36a7b09e4d4f4 (patch) | |
tree | 24d4a3a5975df2046714c6bc114d5d050bdc61fc /rules | |
download | rules-rust-f87ad41f72ca4465a0c5b4ba9fd36a7b09e4d4f4.tar.gz |
Initial commit
Co-authored-by: Klaus Aehlig <klaus.aehlig@huawei.com>
Diffstat (limited to 'rules')
-rw-r--r-- | rules/EXPRESSIONS | 194 | ||||
-rw-r--r-- | rules/TARGETS | 1 | ||||
-rw-r--r-- | rules/cargo/RULES | 374 | ||||
-rw-r--r-- | rules/rust/EXPRESSIONS | 1319 | ||||
-rw-r--r-- | rules/rust/RULES | 906 | ||||
-rw-r--r-- | rules/rust/TARGETS | 171 | ||||
-rwxr-xr-x | rules/rust/runner.py | 82 |
7 files changed, 3047 insertions, 0 deletions
diff --git a/rules/EXPRESSIONS b/rules/EXPRESSIONS new file mode 100644 index 0000000..101af7b --- /dev/null +++ b/rules/EXPRESSIONS @@ -0,0 +1,194 @@ +{ "default_from_base": + { "doc": + [ "If the \"value\" is evaluated as null, the value associated to" + , "\"key\" is retrieved from the \"base\" targets." + ] + , "vars": ["base", "transition", "key", "value"] + , "imports": {"flatten_from_provides": "flatten_from_provides"} + , "expression": + { "type": "if" + , "cond": {"type": "var", "name": "value"} + , "then": {"type": "var", "name": "value"} + , "else": + { "type": "let*" + , "bindings": [["range", {"type": "var", "name": "base"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + } +, "disjoint_map_from_provides": + { "doc": + [ "Performs a disjoint map union of the maps contained in the" + , "provides map of each element in the \"range\" under the key \"key\"." + ] + , "vars": ["range", "transition", "key"] + , "expression": + { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "transition" + , "default": {"type": "empty_map"} + } + ] + ] + , "body": + { "type": "disjoint_map_union" + , "$1": + { "type": "foreach" + , "var": "x" + , "range": {"type": "var", "name": "range"} + , "body": + { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "x"} + , "provider": {"type": "var", "name": "key"} + , "default": {"type": "empty_map"} + , "transition": {"type": "var", "name": "transition"} + } + } + } + } + } +, "flatten_from_provides": + { "doc": + [ "Flatten the lists contained in the provides map of each element" + , "in the \"range\" under the key \"key\"." + ] + , "vars": ["range", "transition", "key"] + , "expression": + { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "transition" + , "default": {"type": "empty_map"} + } + ] + ] + , "body": + { "type": "++" + , "$1": + { "type": "foreach" + , "var": "x" + , "range": {"type": "var", "name": "range"} + , "body": + { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "x"} + , "provider": {"type": "var", "name": "key"} + , "transition": {"type": "var", "name": "transition"} + } + } + } + } + } +, "get_artifacts": + { "vars": ["field_content", "transition"] + , "expression": + { "type": "disjoint_map_union" + , "$1": + { "type": "foreach" + , "var": "x" + , "range": {"type": "var", "name": "field_content"} + , "body": + { "type": "DEP_ARTIFACTS" + , "dep": {"type": "var", "name": "x"} + , "transition": + { "type": "var" + , "name": "transition" + , "default": {"type": "empty_map"} + } + } + } + } + } +, "get_runfiles": + { "vars": ["field_content", "transition"] + , "expression": + { "type": "disjoint_map_union" + , "$1": + { "type": "foreach" + , "var": "x" + , "range": {"type": "var", "name": "field_content"} + , "body": + { "type": "DEP_RUNFILES" + , "dep": {"type": "var", "name": "x"} + , "transition": + { "type": "var" + , "name": "transition" + , "default": {"type": "empty_map"} + } + } + } + } + } +, "get_unique_artifact": + { "doc": + [ "Retrive the unique artifact. Asserts double checks that the" + , "\"field_content\" evaluates to a single artifact." + ] + , "vars": ["field_name", "field_content", "transition"] + , "imports": {"get_artifacts": "get_artifacts"} + , "expression": + { "type": "let*" + , "bindings": + [ [ "_" + , { "type": "assert_non_empty" + , "msg": + { "type": "join" + , "$1": + [ "Please define field " + , { "type": "json_encode" + , "$1": {"type": "var", "name": "field_name"} + } + , ". It cannot be empty." + ] + , "separator": "" + } + , "$1": {"type": "var", "name": "field_content"} + } + ] + , ["artifacts", {"type": "CALL_EXPRESSION", "name": "get_artifacts"}] + , [ "_" + , { "type": "assert" + , "msg": + { "type": "join" + , "$1": + [ { "type": "json_encode" + , "$1": {"type": "var", "name": "field_name"} + } + , " must evaluate to exactly one artifact but found " + , { "type": "json_encode" + , "$1": {"type": "var", "name": "artifacts"} + } + ] + , "separator": "" + } + , "predicate": + { "type": "==" + , "$1": {"type": "length", "$1": {"type": "var", "name": "_"}} + , "$2": 1 + } + , "$1": {"type": "keys", "$1": {"type": "var", "name": "artifacts"}} + } + ] + ] + , "body": {"type": "var", "name": "artifacts"} + } + } +, "stage_unique_artifact": + { "vars": ["artifact", "name"] + , "expression": + { "type": "disjoint_map_union" + , "$1": + { "type": "foreach" + , "var": "x" + , "range": {"type": "values", "$1": {"type": "var", "name": "artifact"}} + , "body": + { "type": "singleton_map" + , "key": {"type": "var", "name": "name"} + , "value": {"type": "var", "name": "x"} + } + } + } + } +} diff --git a/rules/TARGETS b/rules/TARGETS new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/rules/TARGETS @@ -0,0 +1 @@ +{} diff --git a/rules/cargo/RULES b/rules/cargo/RULES new file mode 100644 index 0000000..19d961b --- /dev/null +++ b/rules/cargo/RULES @@ -0,0 +1,374 @@ +{ "build_script": + { "doc": + [ "The custom build script supported by cargo. This binary is" + , "executed before compiling the other crates. Currently, only its" + , "output is processed to augment the rustc flags. During a cross" + , "compilation, since the build script must be run on the host" + , "system, it is always compiled according to the configuration" + , "provided by the \"defaults\" for the \"HOST_ARCH\"." + ] + , "string_fields": ["name", "edition", "stage", "version", "pkg_name"] + , "target_fields": ["crate_root", "srcs", "deps", "cargo_features"] + , "field_doc": + { "name": ["The name of the crate being built."] + , "cargo_features": + ["List of cargo features this binary requires to be enabled."] + , "crate_root": + [ "The crate to be fed to the Rust compiler. It must evaluate to" + , "a single artifact/file." + ] + , "defaults": ["The Rust toolchain to use."] + , "deps": ["Any other libraries this binary depends upon."] + , "edition": + [ "The edition of the compiler to use during compilation. If" + , "unset, 2015 is used." + ] + , "pkg_name": + [ "The name of the package the crate belongs to. It is" + , "exported to the CARGO_PKG_NAME environment variable." + ] + , "srcs": ["The source files of the binary."] + , "stage": + [ "The logical location of the resulting artifact. Elements are" + , "joined with \"/\"." + ] + , "version": + [ "The crate version. Elements are joined with \".\" and the first" + , "three elements are used for the major, minor, and patch" + , "number respectively." + ] + } + , "config_vars": ["ARCH", "HOST_ARCH", "ENV"] + , "config_doc": + { "ARCH": + [ "Default value for both HOST_ARCH and TARGET_ARCH. It is user's" + , "responsibility to adapt the \"defaults\" according to the" + , "provided value." + ] + , "ENV": + [ "Additional environment variables (besides ones provided by" + , "the \"defaults\" target) to be set for each action. If the" + , "same variable is set here and in the \"defaults\", the former" + , "is taken." + ] + , "HOST_ARCH": + [ "The host CPU architecture. It is user's responsibility to" + , "adapt the \"defaults\" according to the provided value." + ] + } + , "config_transitions": + { "cargo_features": + [{"type": "CALL_EXPRESSION", "name": "for host as rlib"}] + , "crate_root": [{"type": "CALL_EXPRESSION", "name": "for host"}] + , "defaults": [{"type": "CALL_EXPRESSION", "name": "for host"}] + , "deps": [{"type": "CALL_EXPRESSION", "name": "for host as rlib"}] + , "srcs": [{"type": "CALL_EXPRESSION", "name": "for host"}] + } + , "imports": + { "call rustc artifact": ["./", "../rust", "call rustc artifact"] + , "for host": ["./", "../rust", "for host"] + , "for host as rlib": ["./", "../rust", "for host as rlib"] + , "get_runfiles": ["./", "..", "get_runfiles"] + } + , "implicit": {"defaults": [["./", "../rust", "defaults"]]} + , "expression": + { "type": "let*" + , "bindings": + [ ["crate_name", {"type": "FIELD", "name": "name"}] + , ["crate_type", "bin"] + , [ "stage" + , { "type": "if" + , "cond": {"type": "FIELD", "name": "stage"} + , "then": + { "type": "join" + , "$1": {"type": "FIELD", "name": "stage"} + , "separator": "/" + } + , "else": "." + } + ] + , ["crate_root", {"type": "FIELD", "name": "crate_root"}] + , ["edition", {"type": "FIELD", "name": "edition"}] + , ["srcs", {"type": "FIELD", "name": "srcs"}] + , ["deps", {"type": "FIELD", "name": "deps"}] + , ["cargo_features", {"type": "FIELD", "name": "cargo_features"}] + , ["emit", "link"] + , ["is_custom_build_script", true] + , ["transition", {"type": "CALL_EXPRESSION", "name": "for host"}] + , [ "deps-transition" + , {"type": "CALL_EXPRESSION", "name": "for host as rlib"} + ] + , ["version", {"type": "FIELD", "name": "version"}] + , ["pkg_name", {"type": "FIELD", "name": "pkg_name"}] + , ["defaults", {"type": "FIELD", "name": "defaults"}] + , [ "artifact result" + , {"type": "CALL_EXPRESSION", "name": "call rustc artifact"} + ] + , [ "exe" + , { "type": "assert" + , "msg": + { "type": "join" + , "$1": + [ "Expected single executable but found " + , {"type": "json_encode", "$1": {"type": "var", "name": "_"}} + ] + } + , "predicate": + { "type": "==" + , "$1": + { "type": "length" + , "$1": {"type": "keys", "$1": {"type": "var", "name": "_"}} + } + , "$2": 1 + } + , "$1": + { "type": "lookup" + , "key": "artifact" + , "map": {"type": "var", "name": "artifact result"} + } + } + ] + , [ "exe_name" + , { "type": "lookup" + , "key": "artifact-name" + , "map": {"type": "var", "name": "artifact result"} + } + ] + , [ "out_name" + , { "type": "join" + , "$1": [{"type": "var", "name": "stage"}, "out"] + , "separator": "/" + } + ] + , [ "out" + , { "type": "ACTION" + , "outs": [{"type": "var", "name": "out_name"}] + , "inputs": {"type": "var", "name": "exe"} + , "cmd": + [ "sh" + , "-ce" + , { "type": "join" + , "$1": + [ { "type": "join_cmd" + , "$1": [{"type": "var", "name": "exe_name"}] + } + , " > " + , {"type": "var", "name": "out_name"} + , " && " + , { "type": "join_cmd" + , "$1": ["cat", {"type": "var", "name": "out_name"}] + } + , " | " + , { "type": "join_cmd" + , "$1": + [ "xargs" + , "printf" + , { "type": "join" + , "$1": + ["[", {"type": "var", "name": "stage"}, "] ", "%s\n"] + , "separator": "" + } + ] + } + ] + , "separator": "" + } + ] + , "env": + { "type": "lookup" + , "key": "env" + , "map": {"type": "var", "name": "artifact result"} + } + } + ] + , [ "file_args_name" + , { "type": "join" + , "$1": [{"type": "var", "name": "stage"}, "file_args"] + , "separator": "/" + } + ] + , [ "file_args" + , { "type": "ACTION" + , "outs": [{"type": "var", "name": "file_args_name"}] + , "inputs": {"type": "var", "name": "out"} + , "cmd": + [ "sh" + , "-c" + , { "type": "join" + , "$1": + [ { "type": "join_cmd" + , "$1": ["cat", {"type": "var", "name": "out_name"}] + } + , " | " + , { "type": "join_cmd" + , "$1": + [ "awk" + , { "type": "join" + , "$1": + [ "/rustc-cfg/ {split($0,x,\"=\"); printf \"--cfg\\n%s\\n\", x[2]}" + , "/rustc-link-arg/ {split($0,x,\"=\"); printf \"-Clink-arg=%s\\n\", x[2]}" + ] + , "separator": " " + } + ] + } + , " > " + , {"type": "var", "name": "file_args_name"} + ] + , "separator": "" + } + ] + } + ] + , [ "args" + , { "type": "join" + , "$1": ["@", {"type": "var", "name": "file_args_name"}] + , "separator": "" + } + ] + ] + , "body": + { "type": "RESULT" + , "artifacts": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "exe"} + , {"type": "var", "name": "file_args"} + , {"type": "var", "name": "out"} + ] + } + , "provides": + { "type": "map_union" + , "$1": + [ { "type": "singleton_map" + , "key": "rust-compile-artifacts" + , "value": {"type": "var", "name": "file_args"} + } + , { "type": "singleton_map" + , "key": "rust-link-artifacts" + , "value": {"type": "var", "name": "file_args"} + } + , { "type": "singleton_map" + , "key": "rustc-compile-args" + , "value": [{"type": "var", "name": "args"}] + } + , { "type": "singleton_map" + , "key": "rustc-link-args" + , "value": [{"type": "var", "name": "args"}] + } + ] + } + } + } + } +, "feature": + { "doc": ["A cargo feature."] + , "string_fields": ["name"] + , "target_fields": ["deps"] + , "field_doc": + { "name": + [ "The feature name. The flag `--cfg feature=<name>` is passed to" + , "the Rust compiler." + ] + , "deps": + ["Any other features or \"[rust, library]\" this feature depends", "on."] + } + , "imports": + { "disjoint_map_from_provides": ["./", "..", "disjoint_map_from_provides"] + , "flatten_from_provides": ["./", "..", "flatten_from_provides"] + } + , "expression": + { "type": "let*" + , "bindings": + [ [ "feature_name" + , {"type": "[]", "index": 0, "list": {"type": "FIELD", "name": "name"}} + ] + , [ "my_feature_arg" + , [ "--cfg" + , { "type": "join" + , "$1": + ["feature=\"", {"type": "var", "name": "feature_name"}, "\""] + } + ] + ] + , ["deps", {"type": "FIELD", "name": "deps"}] + , ["range", {"type": "var", "name": "deps"}] + , [ "compile-deps" + , { "type": "let*" + , "bindings": [["key", "rust-compile-artifacts"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "disjoint_map_from_provides"} + } + ] + , [ "link-deps" + , { "type": "let*" + , "bindings": [["key", "rust-link-artifacts"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "disjoint_map_from_provides"} + } + ] + , [ "compile-deps-args" + , { "type": "let*" + , "bindings": [["key", "rustc-compile-args"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + ] + , [ "link-deps-args" + , { "type": "let*" + , "bindings": [["key", "rustc-link-args"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + ] + , [ "stage-deps-args" + , { "type": "let*" + , "bindings": [["key", "stage-args"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + ] + ] + , "body": + { "type": "RESULT" + , "provides": + { "type": "map_union" + , "$1": + [ { "type": "singleton_map" + , "key": "rust-compile-artifacts" + , "value": {"type": "var", "name": "compile-deps"} + } + , { "type": "singleton_map" + , "key": "rust-link-artifacts" + , "value": {"type": "var", "name": "link-deps"} + } + , { "type": "singleton_map" + , "key": "rustc-compile-args" + , "value": + { "type": "++" + , "$1": + [ {"type": "var", "name": "my_feature_arg"} + , {"type": "var", "name": "compile-deps-args"} + ] + } + } + , { "type": "singleton_map" + , "key": "rustc-link-args" + , "value": + { "type": "++" + , "$1": + [ {"type": "var", "name": "my_feature_arg"} + , {"type": "var", "name": "link-deps-args"} + ] + } + } + , { "type": "singleton_map" + , "key": "stage-args" + , "value": {"type": "var", "name": "stage-deps-args"} + } + ] + } + } + } + } +} diff --git a/rules/rust/EXPRESSIONS b/rules/rust/EXPRESSIONS new file mode 100644 index 0000000..3f23d41 --- /dev/null +++ b/rules/rust/EXPRESSIONS @@ -0,0 +1,1319 @@ +{ "call rustc": + { "vars": ["cmd", "inputs", "outs", "out_dirs", "env"] + , "expression": + { "type": "ACTION" + , "outs": {"type": "var", "name": "outs", "default": []} + , "inputs": {"type": "var", "name": "inputs"} + , "cmd": {"type": "var", "name": "cmd"} + , "env": {"type": "var", "name": "env"} + , "out_dirs": {"type": "var", "name": "out_dirs", "default": []} + } + } +, "call rustc artifact": + { "doc": + [ "The artifact produced by the calling of the Rust compiler. The" + , "expression \"call rustc result\" first calls this expression." + ] + , "vars": + [ "crate_root" + , "crate_name" + , "deps" + , "crate_type" + , "srcs" + , "edition" + , "cargo_features" + , "stage" + , "build_script" + , "emit" + , "rmeta" + , "runner" + , "transition" + , "deps-transition" + , "version" + , "test" + , "defaults" + , "pkg_name" + , "ENV" + ] + , "imports": + { "call rustc": "call rustc" + , "disjoint_map_from_provides": ["./", "..", "disjoint_map_from_provides"] + , "flatten_from_provides": ["./", "..", "flatten_from_provides"] + , "for host": "for host" + , "get_artifacts": ["./", "..", "get_artifacts"] + , "get_runfiles": ["./", "..", "get_runfiles"] + , "get_unique_artifact": ["./", "..", "get_unique_artifact"] + } + , "expression": + { "type": "let*" + , "bindings": + [ [ "crate_root" + , { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "transition" + , "default": {"type": "empty_map"} + } + ] + , ["field_name", "crate_root"] + , ["field_content", {"type": "var", "name": "crate_root"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "get_unique_artifact"} + } + ] + , [ "crate_root_name" + , { "type": "join" + , "$1": {"type": "keys", "$1": {"type": "var", "name": "crate_root"}} + } + ] + , [ "crate_name" + , {"type": "join", "$1": {"type": "var", "name": "crate_name"}} + ] + , [ "srcs" + , { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "transition" + , "default": {"type": "empty_map"} + } + ] + , ["field_content", {"type": "var", "name": "srcs"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "get_artifacts"} + } + ] + , [ "c-deps" + , { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "deps-transition" + , "default": {"type": "empty_map"} + } + ] + , ["field_content", {"type": "var", "name": "deps"}] + , [ "artifacts" + , {"type": "CALL_EXPRESSION", "name": "get_artifacts"} + ] + , ["runfiles", {"type": "CALL_EXPRESSION", "name": "get_runfiles"}] + , ["range", {"type": "var", "name": "deps"}] + , [ "compile-deps" + , { "type": "let*" + , "bindings": [["key", "compile-deps"]] + , "body": + { "type": "CALL_EXPRESSION" + , "name": "disjoint_map_from_provides" + } + } + ] + , [ "link-deps" + , { "type": "let*" + , "bindings": [["key", "link-deps"]] + , "body": + { "type": "CALL_EXPRESSION" + , "name": "disjoint_map_from_provides" + } + } + ] + ] + , "body": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "runfiles"} + , {"type": "var", "name": "artifacts"} + , {"type": "var", "name": "compile-deps"} + , {"type": "var", "name": "link-deps"} + ] + } + } + ] + , [ "run-libs" + , { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "deps-transition" + , "default": {"type": "empty_map"} + } + ] + , ["range", {"type": "var", "name": "deps"}] + , ["key", "run-libs"] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "disjoint_map_from_provides"} + } + ] + , [ "c-deps-link-args" + , { "type": "let*" + , "bindings": + [ ["range", {"type": "var", "name": "deps"}] + , [ "transition" + , { "type": "var" + , "name": "deps-transition" + , "default": {"type": "empty_map"} + } + ] + , ["key", "link-args"] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + ] + , [ "c-deps-run-libs-args" + , { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "deps-transition" + , "default": {"type": "empty_map"} + } + ] + , ["range", {"type": "var", "name": "deps"}] + , ["key", "run-libs-args"] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + ] + , [ "range" + , { "type": "++" + , "$1": + [ {"type": "var", "name": "deps"} + , {"type": "var", "name": "cargo_features"} + , {"type": "var", "name": "build_script", "default": []} + ] + } + ] + , [ "compile-deps" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "c-deps"} + , {"type": "var", "name": "run-libs"} + , { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "deps-transition" + , "default": {"type": "empty_map"} + } + ] + , ["key", "rust-compile-artifacts"] + ] + , "body": + { "type": "CALL_EXPRESSION" + , "name": "disjoint_map_from_provides" + } + } + ] + } + ] + , [ "link-deps" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "c-deps"} + , {"type": "var", "name": "run-libs"} + , { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "deps-transition" + , "default": {"type": "empty_map"} + } + ] + , ["key", "rust-link-artifacts"] + ] + , "body": + { "type": "CALL_EXPRESSION" + , "name": "disjoint_map_from_provides" + } + } + ] + } + ] + , [ "compile-deps-args" + , { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "deps-transition" + , "default": {"type": "empty_map"} + } + ] + , ["key", "rustc-compile-args"] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + ] + , [ "link-deps-args" + , { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "deps-transition" + , "default": {"type": "empty_map"} + } + ] + , ["key", "rustc-link-args"] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + ] + , [ "stage-deps-args" + , { "type": "let*" + , "bindings": + [ [ "transition" + , { "type": "var" + , "name": "deps-transition" + , "default": {"type": "empty_map"} + } + ] + , ["key", "stage-args"] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + ] + , ["range", {"type": "var", "name": "defaults"}] + , [ "transition" + , { "type": "var" + , "name": "transition" + , "default": {"type": "empty_map"} + } + ] + , [ "TARGET" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "TARGET"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "HOST" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "HOST"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "RUSTC" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "RUSTC"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "RUSTC_FLAGS" + , { "type": "let*" + , "bindings": [["key", "RUSTC_FLAGS"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + ] + , [ "ADD_RUSTC_FLAGS" + , { "type": "let*" + , "bindings": [["key", "ADD_RUSTC_FLAGS"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + ] + , [ "PATH" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "PATH"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + , "separator": ":" + } + ] + , [ "CARGO_CFG_TARGET_ARCH" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_TARGET_ARCH"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "CARGO_CFG_TARGET_ENDIAN" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_TARGET_ENDIAN"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "CARGO_CFG_TARGET_ENV" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_TARGET_ENV"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "CARGO_CFG_TARGET_FAMILY" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_TARGET_FAMILY"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "CARGO_CFG_TARGET_FEATURE" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_TARGET_FEATURE"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + , "separator": "," + } + ] + , [ "CARGO_CFG_TARGET_HAS_ATOMIC" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_TARGET_HAS_ATOMIC"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + , "separator": "," + } + ] + , [ "CARGO_CFG_TARGET_OS" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_TARGET_OS"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "CARGO_CFG_TARGET_POINTER_WIDTH" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_TARGET_POINTER_WIDTH"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "CARGO_CFG_TARGET_VENDOR" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_TARGET_VENDOR"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "CARGO_CFG_UNIX" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_UNIX"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "CARGO_CFG_WINDOWS" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_CFG_WINDOWS"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "CARGO_ENCODED_RUSTFLAGS" + , { "type": "join" + , "$1": + { "type": "let*" + , "bindings": [["key", "CARGO_ENCODED_RUSTFLAGS"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "flatten_from_provides"} + } + } + ] + , [ "edition" + , { "type": "if" + , "cond": {"type": "var", "name": "edition"} + , "then": {"type": "join", "$1": {"type": "var", "name": "edition"}} + , "else": "2015" + } + ] + , [ "cmd" + , [ "sh" + , "-c" + , { "type": "join" + , "$1": + [ { "type": "join_cmd" + , "$1": + { "type": "++" + , "$1": + [ [ { "type": "var" + , "name": "runner" + , "default": {"type": "var", "name": "RUSTC"} + } + , {"type": "var", "name": "crate_root_name"} + , "--crate-name" + , {"type": "var", "name": "crate_name"} + , "--crate-type" + , {"type": "var", "name": "crate_type"} + , "--emit" + , {"type": "var", "name": "emit"} + , "--edition" + , {"type": "var", "name": "edition"} + , "--out-dir" + , {"type": "var", "name": "stage"} + ] + , {"type": "var", "name": "RUSTC_FLAGS"} + , {"type": "var", "name": "ADD_RUSTC_FLAGS"} + , { "type": "if" + , "cond": {"type": "var", "name": "TARGET"} + , "then": ["--target", {"type": "var", "name": "TARGET"}] + , "else": [] + } + , { "type": "if" + , "cond": {"type": "var", "name": "LINKER"} + , "then": + [ "-C" + , { "type": "join" + , "$1": + ["linker=", {"type": "var", "name": "LINKER"}] + } + ] + , "else": [] + } + , { "type": "if" + , "cond": {"type": "var", "name": "test"} + , "then": ["--test"] + , "else": [] + } + , { "type": "case" + , "case": + { "bin": {"type": "var", "name": "link-deps-args"} + , "cdylib": {"type": "var", "name": "link-deps-args"} + , "dylib": {"type": "var", "name": "link-deps-args"} + , "proc-macro": + {"type": "var", "name": "link-deps-args"} + , "rlib": {"type": "var", "name": "compile-deps-args"} + , "staticlib": + {"type": "var", "name": "link-deps-args"} + } + , "expr": {"type": "var", "name": "crate_type"} + } + , { "type": "if" + , "cond": + { "type": "==" + , "$1": {"type": "var", "name": "crate_type"} + , "$2": "proc-macro" + } + , "then": ["--extern", "proc_macro"] + , "else": [] + } + , { "type": "if" + , "cond": {"type": "var", "name": "c-deps-link-args"} + , "then": + { "type": "let*" + , "bindings": + [ [ "args" + , { "type": "++" + , "$1": + [ ["-Clink-arg=-Wl"] + , {"type": "var", "name": "c-deps-link-args"} + ] + } + ] + ] + , "body": + [ { "type": "join" + , "$1": {"type": "var", "name": "args"} + , "separator": "," + } + ] + } + , "else": [] + } + , { "type": "if" + , "cond": {"type": "var", "name": "c-deps-run-libs-args"} + , "then": + { "type": "let*" + , "bindings": + [ [ "args" + , { "type": "++" + , "$1": + [ ["-Clink-arg=-Wl"] + , { "type": "var" + , "name": "c-deps-run-libs-args" + } + ] + } + ] + ] + , "body": + [ { "type": "join" + , "$1": {"type": "var", "name": "args"} + , "separator": "," + } + ] + } + , "else": [] + } + ] + } + } + , "--remap-path-prefix" + , "\"${PWD}=\"" + ] + , "separator": " " + } + ] + ] + , [ "inputs" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "crate_root"} + , {"type": "var", "name": "srcs"} + , { "type": "case" + , "case": + { "bin": {"type": "var", "name": "link-deps"} + , "cdylib": {"type": "var", "name": "link-deps"} + , "dylib": {"type": "var", "name": "link-deps"} + , "proc-macro": {"type": "var", "name": "link-deps"} + , "rlib": {"type": "var", "name": "compile-deps"} + , "staticlib": {"type": "var", "name": "link-deps"} + } + , "expr": {"type": "var", "name": "crate_type"} + } + ] + } + ] + , [ "outs" + , { "type": "if" + , "cond": {"type": "var", "name": "rmeta"} + , "then": + [ { "type": "join" + , "$1": + [ {"type": "var", "name": "stage"} + , { "type": "join" + , "$1": + ["lib", {"type": "var", "name": "crate_name"}, ".rmeta"] + , "separator": "" + } + ] + , "separator": "/" + } + ] + , "else": + { "type": "case" + , "case": + { "bin": + [ { "type": "join" + , "$1": + [ {"type": "var", "name": "stage"} + , {"type": "var", "name": "crate_name"} + ] + , "separator": "/" + } + ] + , "cdylib": + [ { "type": "join" + , "$1": + [ {"type": "var", "name": "stage"} + , { "type": "join" + , "$1": + ["lib", {"type": "var", "name": "crate_name"}, ".so"] + , "separator": "" + } + ] + , "separator": "/" + } + ] + , "dylib": + [ { "type": "join" + , "$1": + [ {"type": "var", "name": "stage"} + , { "type": "join" + , "$1": + ["lib", {"type": "var", "name": "crate_name"}, ".so"] + , "separator": "" + } + ] + , "separator": "/" + } + ] + , "proc-macro": + [ { "type": "join" + , "$1": + [ {"type": "var", "name": "stage"} + , { "type": "join" + , "$1": + ["lib", {"type": "var", "name": "crate_name"}, ".so"] + , "separator": "" + } + ] + , "separator": "/" + } + ] + , "rlib": + [ { "type": "join" + , "$1": + [ {"type": "var", "name": "stage"} + , { "type": "join" + , "$1": + ["lib", {"type": "var", "name": "crate_name"}, ".rlib"] + , "separator": "" + } + ] + , "separator": "/" + } + ] + , "staticlib": + [ { "type": "join" + , "$1": + [ {"type": "var", "name": "stage"} + , { "type": "join" + , "$1": + ["lib", {"type": "var", "name": "crate_name"}, ".a"] + , "separator": "" + } + ] + , "separator": "/" + } + ] + } + , "expr": {"type": "var", "name": "crate_type"} + } + } + ] + , ["OUT_DIR", {"type": "var", "name": "stage"}] + , [ "TARGET" + , { "type": "if" + , "cond": {"type": "var", "name": "TARGET"} + , "then": {"type": "var", "name": "TARGET"} + , "else": "" + } + ] + , [ "HOST" + , { "type": "if" + , "cond": {"type": "var", "name": "HOST"} + , "then": {"type": "var", "name": "HOST"} + , "else": "" + } + ] + , [ "CARGO_PKG_VERSION" + , { "type": "join" + , "$1": {"type": "var", "name": "version", "default": []} + , "separator": "." + } + ] + , [ "CARGO_PKG_VERSION_MAJOR" + , { "type": "[]" + , "index": 0 + , "list": {"type": "var", "name": "version", "default": []} + , "default": "" + } + ] + , [ "CARGO_PKG_VERSION_MINOR" + , { "type": "[]" + , "index": 1 + , "list": {"type": "var", "name": "version", "default": []} + , "default": "" + } + ] + , [ "CARGO_PKG_VERSION_PATCH" + , { "type": "[]" + , "index": 2 + , "list": {"type": "var", "name": "version", "default": []} + , "default": "" + } + ] + , [ "CARGO_PKG_NAME" + , {"type": "join", "$1": {"type": "var", "name": "pkg_name"}} + ] + , [ "env" + , { "type": "map_union" + , "$1": + [ { "type": "env" + , "vars": + [ "RUSTC" + , "PATH" + , "OUT_DIR" + , "HOST" + , "TARGET" + , "CARGO_PKG_NAME" + , "CARGO_PKG_VERSION" + , "CARGO_PKG_VERSION_MAJOR" + , "CARGO_PKG_VERSION_MINOR" + , "CARGO_PKG_VERSION_PATCH" + ] + } + , { "type": "if" + , "cond": {"type": "var", "name": "CARGO_CFG_TARGET_ARCH"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_TARGET_ARCH" + , "value": {"type": "var", "name": "CARGO_CFG_TARGET_ARCH"} + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": {"type": "var", "name": "CARGO_CFG_TARGET_ENDIAN"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_TARGET_ENDIAN" + , "value": {"type": "var", "name": "CARGO_CFG_TARGET_ENDIAN"} + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": {"type": "var", "name": "CARGO_CFG_TARGET_ENV"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_TARGET_ENV" + , "value": {"type": "var", "name": "CARGO_CFG_TARGET_ENV"} + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": {"type": "var", "name": "CARGO_CFG_TARGET_FAMILY"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_TARGET_FAMILY" + , "value": {"type": "var", "name": "CARGO_CFG_TARGET_FAMILY"} + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": {"type": "var", "name": "CARGO_CFG_TARGET_FEATURE"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_TARGET_FEATURE" + , "value": {"type": "var", "name": "CARGO_CFG_TARGET_FEATURE"} + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": {"type": "var", "name": "CARGO_CFG_TARGET_HAS_ATOMIC"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_TARGET_HAS_ATOMIC" + , "value": + {"type": "var", "name": "CARGO_CFG_TARGET_HAS_ATOMIC"} + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": {"type": "var", "name": "CARGO_CFG_TARGET_OS"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_TARGET_OS" + , "value": {"type": "var", "name": "CARGO_CFG_TARGET_OS"} + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": + {"type": "var", "name": "CARGO_CFG_TARGET_POINTER_WIDTH"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_TARGET_POINTER_WIDTH" + , "value": + {"type": "var", "name": "CARGO_CFG_TARGET_POINTER_WIDTH"} + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": {"type": "var", "name": "CARGO_CFG_TARGET_VENDOR"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_TARGET_VENDOR" + , "value": {"type": "var", "name": "CARGO_CFG_TARGET_VENDOR"} + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": {"type": "var", "name": "CARGO_CFG_UNIX"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_UNIX" + , "value": {"type": "var", "name": "CARGO_CFG_UNIX"} + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": {"type": "var", "name": "CARGO_CFG_WINDOWS"} + , "then": + { "type": "singleton_map" + , "key": "CARGO_CFG_WINDOWS" + , "value": {"type": "var", "name": "CARGO_CFG_WINDOWS"} + } + , "else": {"type": "empty_map"} + } + , {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} + ] + } + ] + , ["artifact", {"type": "CALL_EXPRESSION", "name": "call rustc"}] + , [ "artifact-name" + , {"type": "join", "$1": {"type": "var", "name": "outs"}} + ] + ] + , "body": + { "type": "map_union" + , "$1": + [ { "type": "env" + , "vars": + [ "artifact" + , "artifact-name" + , "stage-args" + , "link-deps" + , "compile-deps" + , "stage-deps-args" + , "run-libs" + , "c-deps-link-args" + , "c-deps-run-libs-args" + ] + } + , { "type": "singleton_map" + , "key": "env" + , "value": {"type": "var", "name": "env"} + } + ] + } + } + } +, "call rustc result": + { "doc": ["The RESULT from the invocation of rustc."] + , "vars": + [ "crate_root" + , "crate_name" + , "deps" + , "crate_type" + , "srcs" + , "edition" + , "cargo_features" + , "stage" + , "build_script" + , "transition" + , "deps-transition" + , "version" + , "defaults" + , "pkg_name" + , "c_hdrs" + , "ENV" + ] + , "imports": + { "call rustc artifact": "call rustc artifact" + , "stage_unique_artifact": ["./", "..", "stage_unique_artifact"] + } + , "expression": + { "type": "let*" + , "bindings": + [ ["emit", "metadata,link"] + , [ "rmeta result" + , { "type": "if" + , "cond": + { "type": "==" + , "$1": {"type": "var", "name": "crate_type"} + , "$2": "bin" + } + , "then": {"type": "empty_map"} + , "else": + { "type": "let*" + , "bindings": [["rmeta", true]] + , "body": + {"type": "CALL_EXPRESSION", "name": "call rustc artifact"} + } + } + ] + , [ "link result" + , {"type": "CALL_EXPRESSION", "name": "call rustc artifact"} + ] + , ["emit", "metadata,link"] + , [ "crate_name" + , {"type": "join", "$1": {"type": "var", "name": "crate_name"}} + ] + , [ "stage_args" + , { "type": "++" + , "$1": + [ ["-L", {"type": "var", "name": "stage"}] + , { "type": "lookup" + , "key": "stage-deps-args" + , "map": {"type": "var", "name": "link result"} + } + ] + } + ] + , [ "link_arg_rmeta" + , { "type": "cond" + , "cond": + [ [ { "type": "==" + , "$1": {"type": "var", "name": "crate_type"} + , "$2": "bin" + } + , [] + ] + , [ true + , { "type": "++" + , "$1": + [ {"type": "var", "name": "stage_args"} + , [ "--extern" + , { "type": "join" + , "$1": + [ {"type": "var", "name": "crate_name"} + , "=" + , { "type": "lookup" + , "key": "artifact-name" + , "map": {"type": "var", "name": "rmeta result"} + } + ] + } + ] + ] + } + ] + ] + } + ] + , [ "link_arg_rlib" + , { "type": "cond" + , "cond": + [ [ { "type": "==" + , "$1": {"type": "var", "name": "crate_type"} + , "$2": "bin" + } + , [] + ] + , [ true + , { "type": "++" + , "$1": + [ {"type": "var", "name": "stage_args"} + , [ "--extern" + , { "type": "join" + , "$1": + [ {"type": "var", "name": "crate_name"} + , "=" + , { "type": "lookup" + , "key": "artifact-name" + , "map": {"type": "var", "name": "link result"} + } + ] + } + ] + ] + } + ] + ] + } + ] + , [ "run-libs-map" + , { "type": "singleton_map" + , "key": "run-libs" + , "value": + { "type": "map_union" + , "$1": + [ { "type": "lookup" + , "key": "run-libs" + , "map": {"type": "var", "name": "link result"} + } + , { "type": "case" + , "case": + { "bin": {"type": "empty_map"} + , "cdylib": + { "type": "lookup" + , "key": "artifact" + , "map": {"type": "var", "name": "link result"} + } + , "dylib": + { "type": "lookup" + , "key": "artifact" + , "map": {"type": "var", "name": "link result"} + } + , "proc-macro": {"type": "empty_map"} + , "rlib": {"type": "empty_map"} + , "staticlib": {"type": "empty_map"} + } + , "expr": {"type": "var", "name": "crate_type"} + } + ] + } + } + ] + ] + , "body": + { "type": "RESULT" + , "artifacts": + { "type": "map_union" + , "$1": + [ { "type": "lookup" + , "key": "artifact" + , "map": {"type": "var", "name": "link result"} + } + ] + } + , "runfiles": + {"type": "var", "name": "c_hdrs", "default": {"type": "empty_map"}} + , "provides": + { "type": "cond" + , "cond": + [ [ { "type": "==" + , "$1": {"type": "var", "name": "crate_type"} + , "$2": "bin" + } + , {"type": "var", "name": "run-libs-map"} + ] + , [ true + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "run-libs-map"} + , { "type": "singleton_map" + , "key": "rust-compile-artifacts" + , "value": + { "type": "if" + , "cond": + { "type": "==" + , "$1": {"type": "var", "name": "crate_type"} + , "$2": "proc-macro" + } + , "then": + { "type": "map_union" + , "$1": + [ { "type": "lookup" + , "key": "artifact" + , "map": {"type": "var", "name": "link result"} + } + , { "type": "lookup" + , "key": "link-deps" + , "map": {"type": "var", "name": "link result"} + } + ] + } + , "else": + { "type": "map_union" + , "$1": + [ { "type": "lookup" + , "key": "artifact" + , "map": {"type": "var", "name": "rmeta result"} + } + , { "type": "lookup" + , "key": "compile-deps" + , "map": {"type": "var", "name": "rmeta result"} + } + ] + } + } + } + , { "type": "singleton_map" + , "key": "rust-link-artifacts" + , "value": + { "type": "map_union" + , "$1": + [ { "type": "lookup" + , "key": "artifact" + , "map": {"type": "var", "name": "link result"} + } + , { "type": "lookup" + , "key": "link-deps" + , "map": {"type": "var", "name": "link result"} + } + ] + } + } + , { "type": "singleton_map" + , "key": "rustc-compile-args" + , "value": + { "type": "if" + , "cond": + { "type": "==" + , "$1": {"type": "var", "name": "crate_type"} + , "$2": "proc-macro" + } + , "then": + { "type": "++" + , "$1": [{"type": "var", "name": "link_arg_rlib"}] + } + , "else": + { "type": "++" + , "$1": [{"type": "var", "name": "link_arg_rmeta"}] + } + } + } + , { "type": "singleton_map" + , "key": "rustc-link-args" + , "value": + { "type": "++" + , "$1": [{"type": "var", "name": "link_arg_rlib"}] + } + } + , { "type": "singleton_map" + , "key": "stage-args" + , "value": + { "type": "++" + , "$1": + [ ["-L", {"type": "var", "name": "stage"}] + , { "type": "lookup" + , "key": "stage-deps-args" + , "map": {"type": "var", "name": "link result"} + } + ] + } + } + , { "type": "if" + , "cond": + { "type": "==" + , "$1": {"type": "var", "name": "crate_type"} + , "$2": "cdylib" + } + , "then": + { "type": "let*" + , "bindings": + [ [ "basename" + , { "type": "basename" + , "$1": + { "type": "lookup" + , "key": "artifact-name" + , "map": {"type": "var", "name": "link result"} + } + } + ] + , [ "run-libs" + , { "type": "singleton_map" + , "key": "run-libs" + , "value": + { "type": "let*" + , "bindings": + [ [ "artifact" + , { "type": "lookup" + , "key": "artifact" + , "map": + {"type": "var", "name": "link result"} + } + ] + , ["name", {"type": "var", "name": "basename"}] + ] + , "body": + { "type": "CALL_EXPRESSION" + , "name": "stage_unique_artifact" + } + } + } + ] + , [ "run-libs-args" + , { "type": "singleton_map" + , "key": "run-libs-args" + , "value": [{"type": "var", "name": "basename"}] + } + ] + ] + , "body": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "run-libs"} + , {"type": "var", "name": "run-libs-args"} + ] + } + } + , "else": {"type": "empty_map"} + } + , { "type": "if" + , "cond": + { "type": "==" + , "$1": {"type": "var", "name": "crate_type"} + , "$2": "staticlib" + } + , "then": + { "type": "singleton_map" + , "key": "link-args" + , "value": + { "type": "++" + , "$1": + [ [ { "type": "lookup" + , "key": "artifact-name" + , "map": {"type": "var", "name": "link result"} + } + ] + , { "type": "lookup" + , "key": "c-deps-link-args" + , "map": {"type": "var", "name": "link result"} + } + , { "type": "lookup" + , "key": "c-deps-run-libs-args" + , "map": {"type": "var", "name": "link result"} + } + ] + } + } + , "else": {"type": "empty_map"} + } + ] + } + ] + ] + } + } + } + } +, "for host": + { "doc": ["Transition to host required while cross-compiling."] + , "vars": ["ARCH", "HOST_ARCH", "TARGET_ARCH"] + , "expression": + { "type": "let*" + , "bindings": + [ [ "TARGET_ARCH" + , { "type": "var" + , "name": "HOST_ARCH" + , "default": {"type": "var", "name": "ARCH", "default": ""} + } + ] + ] + , "body": {"type": "env", "vars": ["TARGET_ARCH"]} + } + } +, "for host as rlib": + { "vars": ["ARCH", "HOST_ARCH", "TARGET_ARCH"] + , "imports": {"for host": "for host", "to rlib": "to rlib"} + , "expression": + { "type": "disjoint_map_union" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "for host"} + , {"type": "CALL_EXPRESSION", "name": "to rlib"} + ] + } + } +, "to rlib": + { "doc": ["Transition to rlib required for all rust deps."] + , "expression": + { "type": "let*" + , "bindings": [["RLIB", true]] + , "body": {"type": "env", "vars": ["RLIB"]} + } + } +} diff --git a/rules/rust/RULES b/rules/rust/RULES new file mode 100644 index 0000000..ebdf34e --- /dev/null +++ b/rules/rust/RULES @@ -0,0 +1,906 @@ +{ "binary": + { "doc": ["A Rust binary."] + , "string_fields": ["name", "edition", "stage", "version", "pkg_name"] + , "target_fields": + ["crate_root", "srcs", "deps", "cargo_features", "build_script"] + , "field_doc": + { "name": ["The name of the crate being built."] + , "build_script": + [ "The \"build_script\" target required to be built and run before" + , "compiling this binary." + ] + , "cargo_features": + ["List of cargo features this binary requires to be enabled."] + , "crate_root": + [ "The crate to be fed to the Rust compiler. It must evaluate to" + , "a single artifact/file." + ] + , "defaults": ["The Rust toolchain to use."] + , "deps": ["Any other libraries this binary depends upon."] + , "edition": + [ "The edition of the compiler to use during compilation. If" + , "unset, 2015 is used." + ] + , "pkg_name": + [ "The name of the package the crate belongs to. It is" + , "exported to the CARGO_PKG_NAME environment variable." + ] + , "srcs": ["The source files of the binary."] + , "stage": + [ "The logical location of the resulting artifact. Elements are" + , "joined with \"/\"." + ] + , "version": + [ "The crate version. Elements are joined with \".\" and the first" + , "three elements are used for the major, minor, and patch" + , "number respectively." + ] + } + , "config_vars": ["ENV"] + , "config_doc": + { "ENV": + [ "Additional environment variables (besides ones provided by" + , "the \"defaults\" target) to be set for each action. If the" + , "same variable is set here and in the \"defaults\", the former" + , "is taken." + ] + } + , "config_transitions": + { "build_script": [{"type": "CALL_EXPRESSION", "name": "to rlib"}] + , "cargo_features": [{"type": "CALL_EXPRESSION", "name": "to rlib"}] + , "deps": [{"type": "CALL_EXPRESSION", "name": "to rlib"}] + } + , "imports": {"call rustc": "call rustc result", "to rlib": "to rlib"} + , "implicit": {"defaults": ["defaults"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["crate_name", {"type": "FIELD", "name": "name"}] + , ["crate_type", "bin"] + , ["deps-transition", {"type": "CALL_EXPRESSION", "name": "to rlib"}] + , [ "stage" + , { "type": "if" + , "cond": {"type": "FIELD", "name": "stage"} + , "then": + { "type": "join" + , "$1": {"type": "FIELD", "name": "stage"} + , "separator": "/" + } + , "else": "." + } + ] + , ["crate_root", {"type": "FIELD", "name": "crate_root"}] + , ["edition", {"type": "FIELD", "name": "edition"}] + , ["srcs", {"type": "FIELD", "name": "srcs"}] + , ["deps", {"type": "FIELD", "name": "deps"}] + , ["build_script", {"type": "FIELD", "name": "build_script"}] + , ["cargo_features", {"type": "FIELD", "name": "cargo_features"}] + , ["version", {"type": "FIELD", "name": "version"}] + , ["pkg_name", {"type": "FIELD", "name": "pkg_name"}] + , ["defaults", {"type": "FIELD", "name": "defaults"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "call rustc"} + } + } +, "defaults": + { "doc": + [ "A rule to provide defaults." + , "All rust targets take their defaults for RUSTC, TARGET, compile" + , "flags etc." + ] + , "string_fields": + [ "ADD_RUSTC_FLAGS" + , "HOST" + , "LINKER" + , "PATH" + , "RUSTC" + , "RUSTC_FLAGS" + , "TARGET" + , "CARGO_CFG_TARGET_ARCH" + , "CARGO_CFG_TARGET_ENDIAN" + , "CARGO_CFG_TARGET_ENV" + , "CARGO_CFG_TARGET_FAMILY" + , "CARGO_CFG_TARGET_FEATURE" + , "CARGO_CFG_TARGET_HAS_ATOMIC" + , "CARGO_CFG_TARGET_OS" + , "CARGO_CFG_TARGET_POINTER_WIDTH" + , "CARGO_CFG_TARGET_VENDOR" + , "CARGO_CFG_UNIX" + , "CARGO_CFG_WINDOWS" + ] + , "target_fields": ["base"] + , "field_doc": + { "ADD_RUSTC_FLAGS": + [ "Additional flags for rustc. The values are appended to the ones" + , "from \"base\"." + ] + , "CARGO_CFG_TARGET_ARCH": + [ "The CPU target architecture. It overwrites the value from" + , "\"base\"." + ] + , "CARGO_CFG_TARGET_ENDIAN": + ["The CPU target endianness. It overwrites the value from \"base\"."] + , "CARGO_CFG_TARGET_ENV": + ["The target environment ABI. It overwrites the value from", "\"base\"."] + , "CARGO_CFG_TARGET_FAMILY": + ["The target family. It overwrites the value from \"base\"."] + , "CARGO_CFG_TARGET_FEATURE": + [ "List of CPU target features enabled. Elements are joined with" + , "\",\". It overwrites the value from \"base\"." + ] + , "CARGO_CFG_TARGET_HAS_ATOMIC": + [ "List of atomics types (in bits) supported by the target" + , "CPU. Elements are joined with \",\". It overwrites the value from" + , "\"base\"." + ] + , "CARGO_CFG_TARGET_OS": + [ "The target operating system. It overwrites the value from" + , "\"base\"." + ] + , "CARGO_CFG_TARGET_POINTER_WIDTH": + ["The CPU pointer width. It overwrites the value from \"base\"."] + , "CARGO_CFG_TARGET_VENDOR": + ["The target vendor. It overwrites the value from \"base\"."] + , "CARGO_CFG_UNIX": + [ "To be set on unix-like platforms. It overwrites the value from" + , "\"base\"." + ] + , "CARGO_CFG_WINDOWS": + [ "To be set on windows-like platforms. It overwrites the value" + , "from \"base\"." + ] + , "HOST": + [ "The host triple of the Rust compiler (e.g.," + , "\"x86_64-unknown-linux-gnu\"). It overwrites the value from" + , "\"base\"." + ] + , "LINKER": + [ "The value to pass to the \"--linker\" rustc flag. It overwrites" + , "the value from \"base\"." + ] + , "PATH": + [ "Environment variable for looking up compilers and" + , "linkers. Elements are joined with \":\". The values are put in" + , "front of the ones from \"base\"." + ] + , "RUSTC": + ["The Rust compiler to use. It overwrites the value from \"base\"."] + , "RUSTC_FLAGS": + ["The rustc flags to use. It overwrites the value from \"base\"."] + , "TARGET": + [ "The target triple for which the code is compiled (e.g.," + , "\"x86_64-unknown-linux-gnu\"). It overwrites the value from" + , "\"base\"." + ] + , "base": + [ "Other targets of the very same type to inherit values from. If" + , "the same field is defined both targets, depending on the field," + , "the value from \"base\" is extended or overwritten." + ] + } + , "config_vars": ["ARCH", "HOST_ARCH", "TARGET_ARCH"] + , "config_doc": + { "ARCH": + [ "Default value for both HOST_ARCH and TARGET_ARCH. It is user's" + , "responsibility to adapt the \"defaults\" according to the" + , "provided value." + ] + , "HOST_ARCH": + [ "The host CPU architecture. It is user's responsibility to" + , "adapt the \"defaults\" according to the provided value." + ] + , "TARGET_ARCH": + [ "The target CPU architecture. It is user's responsibility to" + , "adapt the \"defaults\" according to the provided value." + ] + } + , "imports": + { "default_from_base": ["./", "..", "default_from_base"] + , "flatten_from_provides": ["./", "..", "flatten_from_provides"] + } + , "expression": + { "type": "let*" + , "bindings": + [ ["base", {"type": "FIELD", "name": "base"}] + , [ "ADD_RUSTC_FLAGS" + , { "type": "++" + , "$1": + [ { "type": "let*" + , "bindings": [["key", "ADD_RUSTC_FLAGS"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + , {"type": "FIELD", "name": "ADD_RUSTC_FLAGS"} + ] + } + ] + , [ "HOST" + , { "type": "let*" + , "bindings": + [["key", "HOST"], ["value", {"type": "FIELD", "name": "HOST"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "LINKER" + , { "type": "let*" + , "bindings": + [["key", "LINKER"], ["value", {"type": "FIELD", "name": "LINKER"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "PATH" + , { "type": "++" + , "$1": + [ {"type": "FIELD", "name": "PATH"} + , { "type": "let*" + , "bindings": [["key", "PATH"]] + , "body": + {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + } + ] + , [ "RUSTC" + , { "type": "let*" + , "bindings": + [["key", "RUSTC"], ["value", {"type": "FIELD", "name": "RUSTC"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "RUSTC_FLAGS" + , { "type": "let*" + , "bindings": + [ ["key", "RUSTC_FLAGS"] + , ["value", {"type": "FIELD", "name": "RUSTC_FLAGS"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "TARGET" + , { "type": "let*" + , "bindings": + [["key", "TARGET"], ["value", {"type": "FIELD", "name": "TARGET"}]] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_TARGET_ARCH" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_TARGET_ARCH"] + , ["value", {"type": "FIELD", "name": "CARGO_CFG_TARGET_ARCH"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_TARGET_ENDIAN" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_TARGET_ENDIAN"] + , ["value", {"type": "FIELD", "name": "CARGO_CFG_TARGET_ENDIAN"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_TARGET_ENV" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_TARGET_ENV"] + , ["value", {"type": "FIELD", "name": "CARGO_CFG_TARGET_ENV"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_TARGET_FAMILY" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_TARGET_FAMILY"] + , ["value", {"type": "FIELD", "name": "CARGO_CFG_TARGET_FAMILY"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_TARGET_FEATURE" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_TARGET_FEATURE"] + , ["value", {"type": "FIELD", "name": "CARGO_CFG_TARGET_FEATURE"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_TARGET_HAS_ATOMIC" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_TARGET_HAS_ATOMIC"] + , [ "value" + , {"type": "FIELD", "name": "CARGO_CFG_TARGET_HAS_ATOMIC"} + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_TARGET_OS" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_TARGET_OS"] + , ["value", {"type": "FIELD", "name": "CARGO_CFG_TARGET_OS"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_TARGET_POINTER_WIDTH" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_TARGET_POINTER_WIDTH"] + , [ "value" + , {"type": "FIELD", "name": "CARGO_CFG_TARGET_POINTER_WIDTH"} + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_TARGET_VENDOR" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_TARGET_VENDOR"] + , ["value", {"type": "FIELD", "name": "CARGO_CFG_TARGET_VENDOR"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_UNIX" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_UNIX"] + , ["value", {"type": "FIELD", "name": "CARGO_CFG_UNIX"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + , [ "CARGO_CFG_WINDOWS" + , { "type": "let*" + , "bindings": + [ ["key", "CARGO_CFG_WINDOWS"] + , ["value", {"type": "FIELD", "name": "CARGO_CFG_WINDOWS"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "default_from_base"} + } + ] + ] + , "body": + { "type": "RESULT" + , "provides": + { "type": "env" + , "vars": + [ "ADD_RUSTC_FLAGS" + , "HOST" + , "LINKER" + , "PATH" + , "RUSTC" + , "RUSTC_FLAGS" + , "TARGET" + , "CARGO_CFG_TARGET_ARCH" + , "CARGO_CFG_TARGET_ENDIAN" + , "CARGO_CFG_TARGET_ENV" + , "CARGO_CFG_TARGET_FAMILY" + , "CARGO_CFG_TARGET_FEATURE" + , "CARGO_CFG_TARGET_HAS_ATOMIC" + , "CARGO_CFG_TARGET_OS" + , "CARGO_CFG_TARGET_POINTER_WIDTH" + , "CARGO_CFG_TARGET_VENDOR" + , "CARGO_CFG_UNIX" + , "CARGO_CFG_WINDOWS" + ] + } + } + } + } +, "library": + { "doc": + [ "A Rust library. Depending on the value of the fields \"shared\"" + , "and \"native\", the `--crate-type` is inferred as follows:" + , "" + , "|shared|native|crate-type|" + , "|------|------|----------|" + , "| null | null | rlib |" + , "| null |\"true\"| staticlib|" + , "|\"true\"| null | dylib |" + , "|\"true\"|\"true\"| cdylib |" + ] + , "string_fields": + ["name", "edition", "stage", "version", "pkg_name", "shared", "native"] + , "target_fields": + ["crate_root", "srcs", "deps", "cargo_features", "build_script", "c_hdrs"] + , "field_doc": + { "name": ["The name of the crate being built."] + , "build_script": + [ "The \"build_script\" target required to be built and run before" + , "compiling this library." + ] + , "c_hdrs": + [ "C headers that define the interface to this library." + , "This field is ignored when this library is consumed by another" + , "Rust target." + , "" + , "If non empty, a native library will be produced." + ] + , "cargo_features": + ["List of cargo features this library requires to be enabled."] + , "crate_root": + [ "The crate to be fed to the Rust compiler. It must evaluate to" + , "a single artifact/file." + ] + , "defaults": ["The Rust toolchain to use."] + , "deps": ["Any other libraries this library depends upon."] + , "edition": + [ "The edition of the compiler to use during compilation." + , "If unset, 2015 is used." + ] + , "native": + [ "If not null, a native library will be produced." + , "" + , "Note that, when this target is consumed by another Rust target," + , "it will be compiled to a Rust static library (.rlib)." + ] + , "pkg_name": + [ "The name of the package the crate belongs to. It is" + , "exported to the CARGO_PKG_NAME environment variable." + ] + , "shared": ["If not null, a shared library will be produced."] + , "srcs": ["The source files of the library."] + , "stage": + [ "The logical location of the resulting artifact." + , "Elements are joined with \"/\"." + ] + , "version": + [ "The crate version. Elements are joined with \".\" and the first" + , "three elements are used for the major, minor, and patch" + , "number respectively." + ] + } + , "config_vars": ["ENV", "RLIB"] + , "config_doc": + { "ENV": + [ "Additional environment variables (besides ones provided by" + , "the \"defaults\" target) to be set for each action. If the" + , "same variable is set here and in the \"defaults\", the former" + , "is taken." + ] + , "RLIB": + [ "If evaluates to true, the \"shared\" and \"native\" fields are" + , "ignored and the crate type will be set to rlib." + ] + } + , "config_transitions": + { "build_script": [{"type": "CALL_EXPRESSION", "name": "to rlib"}] + , "cargo_features": [{"type": "CALL_EXPRESSION", "name": "to rlib"}] + , "deps": [{"type": "CALL_EXPRESSION", "name": "to rlib"}] + } + , "imports": + { "call rustc": "call rustc result" + , "get_artifacts": ["./", "..", "get_artifacts"] + , "to rlib": "to rlib" + } + , "implicit": {"defaults": ["defaults"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["crate_name", {"type": "FIELD", "name": "name"}] + , [ "native" + , { "type": "or" + , "$1": + [ {"type": "FIELD", "name": "c_hdrs"} + , {"type": "FIELD", "name": "native"} + ] + } + ] + , [ "crate_type" + , { "type": "if" + , "cond": {"type": "var", "name": "RLIB"} + , "then": "rlib" + , "else": + { "type": "if" + , "cond": {"type": "FIELD", "name": "shared"} + , "then": + { "type": "if" + , "cond": {"type": "var", "name": "native"} + , "then": "cdylib" + , "else": "dylib" + } + , "else": + { "type": "if" + , "cond": {"type": "var", "name": "native"} + , "then": "staticlib" + , "else": "rlib" + } + } + } + ] + , ["deps-transition", {"type": "CALL_EXPRESSION", "name": "to rlib"}] + , [ "stage" + , { "type": "if" + , "cond": {"type": "FIELD", "name": "stage"} + , "then": + { "type": "join" + , "$1": {"type": "FIELD", "name": "stage"} + , "separator": "/" + } + , "else": "." + } + ] + , [ "c_hdrs" + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "stage"} + , "flat": false + , "$1": + { "type": "let*" + , "bindings": + [ [ "field_content" + , { "type": "if" + , "cond": {"type": "var", "name": "RLIB"} + , "then": [] + , "else": {"type": "FIELD", "name": "c_hdrs"} + } + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "get_artifacts"} + } + } + ] + , ["crate_root", {"type": "FIELD", "name": "crate_root"}] + , ["edition", {"type": "FIELD", "name": "edition"}] + , ["srcs", {"type": "FIELD", "name": "srcs"}] + , ["deps", {"type": "FIELD", "name": "deps"}] + , ["build_script", {"type": "FIELD", "name": "build_script"}] + , ["cargo_features", {"type": "FIELD", "name": "cargo_features"}] + , ["version", {"type": "FIELD", "name": "version"}] + , ["pkg_name", {"type": "FIELD", "name": "pkg_name"}] + , ["defaults", {"type": "FIELD", "name": "defaults"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "call rustc"} + } + } +, "proc-macro": + { "doc": + [ "A Rust procedural macro. As it is executed on the host system" + , "during the compilation, it is always compiled according to the" + , "host configuration." + ] + , "string_fields": ["name", "edition", "stage", "version", "pkg_name"] + , "target_fields": + ["crate_root", "srcs", "deps", "cargo_features", "build_script"] + , "field_doc": + { "name": ["The name of the crate being built."] + , "build_script": + [ "The \"build_script\" target required to be built and run before" + , "compiling this macro." + ] + , "cargo_features": + ["List of cargo features this macro requires to be enabled."] + , "crate_root": + [ "The crate to be fed to the Rust compiler. It must evaluate to" + , "a single artifact/file." + ] + , "defaults": ["The Rust toolchain to use."] + , "deps": ["Any other libraries this macro depends upon."] + , "edition": + [ "The edition of the compiler to use during compilation. If" + , "unset, 2015 is used." + ] + , "pkg_name": + [ "The name of the package the crate belongs to. It is" + , "exported to the CARGO_PKG_NAME environment variable." + ] + , "srcs": ["The source files of the procedural macro."] + , "stage": + [ "The logical location of the resulting artifact. Elements are" + , "joined with \"/\"." + ] + , "version": + [ "The crate version. Elements are joined with \".\" and the first" + , "three elements are used for the major, minor, and patch" + , "number respectively." + ] + } + , "config_vars": ["ARCH", "HOST_ARCH", "ENV"] + , "config_doc": + { "ARCH": + [ "Default value for both HOST_ARCH and TARGET_ARCH. It is user's" + , "responsibility to adapt the \"defaults\" according to the" + , "provided value." + ] + , "ENV": + [ "Additional environment variables (besides ones provided by" + , "the \"defaults\" target) to be set for each action. If the" + , "same variable is set here and in the \"defaults\", the former" + , "is taken." + ] + , "HOST_ARCH": + [ "The host CPU architecture. It is user's responsibility to" + , "adapt the \"defaults\" according to the provided value." + ] + } + , "config_transitions": + { "build_script": [{"type": "CALL_EXPRESSION", "name": "for host as rlib"}] + , "cargo_features": + [{"type": "CALL_EXPRESSION", "name": "for host as rlib"}] + , "crate_root": [{"type": "CALL_EXPRESSION", "name": "for host"}] + , "defaults": [{"type": "CALL_EXPRESSION", "name": "for host"}] + , "deps": [{"type": "CALL_EXPRESSION", "name": "for host as rlib"}] + , "srcs": [{"type": "CALL_EXPRESSION", "name": "for host"}] + } + , "imports": + { "call rustc": "call rustc result" + , "for host": "for host" + , "for host as rlib": ["./", "../rust", "for host as rlib"] + , "to rlib": "to rlib" + } + , "implicit": {"defaults": ["defaults"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["crate_name", {"type": "FIELD", "name": "name"}] + , ["crate_type", "proc-macro"] + , [ "stage" + , { "type": "if" + , "cond": {"type": "FIELD", "name": "stage"} + , "then": + { "type": "join" + , "$1": {"type": "FIELD", "name": "stage"} + , "separator": "/" + } + , "else": "." + } + ] + , ["crate_root", {"type": "FIELD", "name": "crate_root"}] + , ["edition", {"type": "FIELD", "name": "edition"}] + , ["srcs", {"type": "FIELD", "name": "srcs"}] + , ["deps", {"type": "FIELD", "name": "deps"}] + , [ "deps-transition" + , {"type": "CALL_EXPRESSION", "name": "for host as rlib"} + ] + , ["transition", {"type": "CALL_EXPRESSION", "name": "for host"}] + , ["version", {"type": "FIELD", "name": "version"}] + , ["pkg_name", {"type": "FIELD", "name": "pkg_name"}] + , ["build_script", {"type": "FIELD", "name": "build_script"}] + , ["cargo_features", {"type": "FIELD", "name": "cargo_features"}] + , ["defaults", {"type": "FIELD", "name": "defaults"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "call rustc"} + } + } +, "test": + { "doc": ["A Rust test."] + , "string_fields": + ["name", "edition", "stage", "version", "args", "pkg_name"] + , "target_fields": ["crate_root", "srcs", "deps", "cargo_features", "data"] + , "field_doc": + { "name": + [ "The name of the test being built. Note that during execution," + , "the test binary will be restaged to \"test\"." + ] + , "args": ["Additonal arguments to be passed when running the test."] + , "cargo_features": + ["List of cargo features this test requires to be enabled."] + , "crate_root": + [ "The crate to be fed to the Rust compiler. It must evaluate to" + , "a single artifact/file." + ] + , "data": ["Any files and directories the test binary needs when running."] + , "defaults": ["The Rust toolchain to use."] + , "deps": ["Any other libraries this test depends upon."] + , "edition": + [ "The edition of the compiler to use during compilation. If" + , "unset, 2015 is used." + ] + , "pkg_name": + [ "The name of the package the crate belongs to. It is" + , "exported to the CARGO_PKG_NAME environment variable." + ] + , "runner": + [ "The test runner to use, i.e., the binary that will launch the" + , "test binary and collect the output." + ] + , "srcs": ["The source files of the test."] + , "stage": + [ "The logical location of the resulting artifact. Elements are" + , "joined with \"/\"." + ] + , "version": + [ "The crate version. Elements are joined with \".\" and the first" + , "three elements are used for the major, minor, and patch" + , "number respectively." + ] + } + , "config_vars": ["RUST_TEST_LAUNCHER", "ARCH", "HOST_ARCH", "ENV"] + , "config_doc": + { "ARCH": + [ "Default value for both HOST_ARCH and TARGET_ARCH. It is user's" + , "responsibility to adapt the \"defaults\" according to the" + , "provided value." + ] + , "ENV": + [ "Additional environment variables (besides ones provided by" + , "the \"defaults\" target) to be set for each action. If the" + , "same variable is set here and in the \"defaults\", the former" + , "is taken." + ] + , "HOST_ARCH": + [ "The host CPU architecture. It is user's responsibility to" + , "adapt the \"defaults\" according to the provided value." + ] + , "RUST_TEST_LAUNCHER": + [ "List of strings representing the launcher that is prepended to" + , "the command line for running the test binary." + ] + } + , "config_transitions": + { "cargo_features": + [{"type": "CALL_EXPRESSION", "name": "for host as rlib"}] + , "crate_root": [{"type": "CALL_EXPRESSION", "name": "for host"}] + , "data": [{"type": "CALL_EXPRESSION", "name": "for host"}] + , "defaults": [{"type": "CALL_EXPRESSION", "name": "for host"}] + , "deps": [{"type": "CALL_EXPRESSION", "name": "for host as rlib"}] + , "runner": [{"type": "CALL_EXPRESSION", "name": "for host"}] + , "srcs": [{"type": "CALL_EXPRESSION", "name": "for host"}] + } + , "imports": + { "call rustc artifact": "call rustc artifact" + , "for host": "for host" + , "for host as rlib": ["./", "../rust", "for host as rlib"] + , "get_artifacts": ["./", "..", "get_artifacts"] + , "get_runfiles": ["./", "..", "get_runfiles"] + , "get_unique_artifact": ["./", "..", "get_unique_artifact"] + , "stage_unique_artifact": ["./", "..", "stage_unique_artifact"] + } + , "implicit": {"defaults": ["defaults"], "runner": ["runner.py"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["crate_name", {"type": "FIELD", "name": "name"}] + , ["crate_type", "bin"] + , [ "stage" + , { "type": "if" + , "cond": {"type": "FIELD", "name": "stage"} + , "then": + { "type": "join" + , "$1": {"type": "FIELD", "name": "stage"} + , "separator": "/" + } + , "else": "." + } + ] + , ["crate_root", {"type": "FIELD", "name": "crate_root"}] + , ["edition", {"type": "FIELD", "name": "edition"}] + , ["srcs", {"type": "FIELD", "name": "srcs"}] + , ["deps", {"type": "FIELD", "name": "deps"}] + , ["cargo_features", {"type": "FIELD", "name": "cargo_features"}] + , ["emit", "link"] + , [ "deps-transition" + , {"type": "CALL_EXPRESSION", "name": "for host as rlib"} + ] + , ["transition", {"type": "CALL_EXPRESSION", "name": "for host"}] + , ["test", true] + , ["version", {"type": "FIELD", "name": "version"}] + , ["pkg_name", {"type": "FIELD", "name": "pkg_name"}] + , ["defaults", {"type": "FIELD", "name": "defaults"}] + , [ "artifact result" + , {"type": "CALL_EXPRESSION", "name": "call rustc artifact"} + ] + , [ "test" + , { "type": "let*" + , "bindings": + [ [ "artifact" + , { "type": "lookup" + , "key": "artifact" + , "map": {"type": "var", "name": "artifact result"} + } + ] + , ["name", "test"] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "stage_unique_artifact"} + } + ] + , [ "runner" + , { "type": "let*" + , "bindings": + [ [ "artifact" + , { "type": "let*" + , "bindings": + [ ["field_name", "runner"] + , ["field_content", {"type": "FIELD", "name": "runner"}] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "get_unique_artifact"} + } + ] + , ["name", "runner"] + ] + , "body": + {"type": "CALL_EXPRESSION", "name": "stage_unique_artifact"} + } + ] + , ["field_content", {"type": "FIELD", "name": "data"}] + , [ "test-data" + , { "type": "to_subdir" + , "subdir": "work" + , "flat": false + , "$1": + { "type": "disjoint_map_union" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "get_artifacts"} + , {"type": "CALL_EXPRESSION", "name": "get_runfiles"} + ] + } + } + ] + , [ "test-launcher" + , { "type": "singleton_map" + , "key": "test-launcher.json" + , "value": + { "type": "BLOB" + , "data": + { "type": "json_encode" + , "$1": + {"type": "var", "name": "RUST_TEST_LAUNCHER", "default": []} + } + } + } + ] + , [ "test-args" + , { "type": "singleton_map" + , "key": "test-args.json" + , "value": + { "type": "BLOB" + , "data": + {"type": "json_encode", "$1": {"type": "FIELD", "name": "args"}} + } + } + ] + , [ "test-name" + , {"type": "join", "$1": {"type": "var", "name": "crate_name"}} + ] + , [ "test-results" + , { "type": "ACTION" + , "outs": ["result", "stdout", "stderr", "time-start", "time-stop"] + , "inputs": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "test"} + , {"type": "var", "name": "runner"} + , {"type": "var", "name": "test-data"} + , {"type": "var", "name": "test-launcher"} + , {"type": "var", "name": "test-args"} + ] + } + , "cmd": ["./runner"] + , "env": + { "type": "lookup" + , "key": "env" + , "map": {"type": "var", "name": "artifact result"} + } + , "may_fail": ["test"] + , "fail_message": + { "type": "join" + , "$1": + ["rust test", {"type": "var", "name": "test-name"}, "failed"] + , "separator": " " + } + } + ] + ] + , "body": + { "type": "RESULT" + , "artifacts": {"type": "var", "name": "test-results"} + , "runfiles": + { "type": "singleton_map" + , "key": {"type": "var", "name": "test-name"} + , "value": + {"type": "TREE", "$1": {"type": "var", "name": "test-results"}} + } + } + } + , "tainted": ["test"] + } +} diff --git a/rules/rust/TARGETS b/rules/rust/TARGETS new file mode 100644 index 0000000..9a80409 --- /dev/null +++ b/rules/rust/TARGETS @@ -0,0 +1,171 @@ +{ "aarch64-unknown-linux-gnu": + { "type": "defaults" + , "CARGO_CFG_TARGET_ARCH": ["aarch64"] + , "CARGO_CFG_TARGET_ENDIAN": ["little"] + , "CARGO_CFG_TARGET_ENV": ["gnu"] + , "CARGO_CFG_TARGET_FAMILY": ["unix"] + , "CARGO_CFG_TARGET_FEATURE": ["neon"] + , "CARGO_CFG_TARGET_HAS_ATOMIC": ["128,16,32,64,8,ptr"] + , "CARGO_CFG_TARGET_OS": ["linux"] + , "CARGO_CFG_TARGET_POINTER_WIDTH": ["64"] + , "CARGO_CFG_TARGET_VENDOR": ["unkwnown"] + , "CARGO_CFG_UNIX": ["true"] + , "TARGET": ["aarch64-unknown-linux-gnu"] + } +, "defaults": + { "type": "defaults" + , "arguments_config": + ["DEBUG", "ARCH", "TARGET_ARCH", "HOST_ARCH", "TOOLCHAIN_CONFIG", "ENV"] + , "PATH": ["/usr/bin", "/bin"] + , "RUSTC": + [ { "type": "lookup" + , "key": "RUSTC" + , "map": + { "type": "lookup" + , "key": "RUST" + , "map": + { "type": "var" + , "name": "TOOLCHAIN_CONFIG" + , "default": {"type": "empty_map"} + } + , "default": {"type": "empty_map"} + } + , "default": + { "type": "let*" + , "bindings": + [ [ "rustup-home" + , { "type": "lookup" + , "key": "RUSTUP_HOME" + , "map": + { "type": "lookup" + , "key": "RUST" + , "map": + { "type": "var" + , "name": "TOOLCHAIN_CONFIG" + , "default": {"type": "empty_map"} + } + , "default": {"type": "empty_map"} + } + } + ] + , [ "toolchain" + , { "type": "lookup" + , "key": "TOOLCHAIN" + , "map": + { "type": "lookup" + , "key": "RUST" + , "map": + { "type": "var" + , "name": "TOOLCHAIN_CONFIG" + , "default": {"type": "empty_map"} + } + , "default": {"type": "empty_map"} + } + } + ] + , [ "rustc" + , { "type": "if" + , "cond": {"type": "var", "name": "rustup-home"} + , "then": + { "type": "join" + , "$1": + [ {"type": "var", "name": "rustup-home"} + , "toolchains" + , { "type": "join" + , "$1": + [ { "type": "var" + , "name": "toolchain" + , "default": "stable" + } + , { "type": "var" + , "name": "HOST_ARCH" + , "default": + { "type": "var" + , "name": "ARCH" + , "default": + { "type": "fail" + , "msg": + { "type": "join" + , "$1": + [ "To properly select a Rust compiler under the RUSTUP_HOME directory \"" + , {"type": "var", "name": "rustup-home"} + , "\" please provide either ARCH or HOST_ARCH." + ] + , "separator": "" + } + } + } + } + , "unknown" + , "linux" + , "gnu" + ] + , "separator": "-" + } + , "bin" + , "rustc" + ] + , "separator": "/" + } + , "else": "rustc" + } + ] + ] + , "body": {"type": "var", "name": "rustc"} + } + } + ] + , "RUSTC_FLAGS": + { "type": "++" + , "$1": + [ ["--color=always", "--cap-lints=warn"] + , { "type": "if" + , "cond": {"type": "var", "name": "DEBUG"} + , "then": [] + , "else": + ["-Copt-level=2", "--codegen=debuginfo=0", "-Cembed-bitcode=no"] + } + ] + } + , "base": + { "type": "case" + , "case": + { "": [] + , "aarch64": ["aarch64-unknown-linux-gnu"] + , "wasm32": ["wasm32-unknown-unknown"] + , "x86_64": ["x86_64-unknown-linux-gnu"] + } + , "expr": + { "type": "var" + , "name": "TARGET_ARCH" + , "default": {"type": "var", "name": "ARCH", "default": ""} + } + } + } +, "wasm32-unknown-unknown": + { "type": "defaults" + , "CARGO_CFG_TARGET_ARCH": ["wasm32"] + , "CARGO_CFG_TARGET_ENDIAN": ["little"] + , "CARGO_CFG_TARGET_ENV": [""] + , "CARGO_CFG_TARGET_FAMILY": ["wasm"] + , "CARGO_CFG_TARGET_HAS_ATOMIC": ["16,32,64,8,ptr"] + , "CARGO_CFG_TARGET_OS": ["unknown"] + , "CARGO_CFG_TARGET_POINTER_WIDTH": ["32"] + , "CARGO_CFG_TARGET_VENDOR": ["unkwnown"] + , "TARGET": ["wasm32-unknown-unknown"] + } +, "x86_64-unknown-linux-gnu": + { "type": "defaults" + , "CARGO_CFG_TARGET_ARCH": ["x86_64"] + , "CARGO_CFG_TARGET_ENDIAN": ["little"] + , "CARGO_CFG_TARGET_ENV": ["gnu"] + , "CARGO_CFG_TARGET_FAMILY": ["unix"] + , "CARGO_CFG_TARGET_FEATURE": ["fxsr,sse,sse2"] + , "CARGO_CFG_TARGET_HAS_ATOMIC": ["16,32,64,8,ptr"] + , "CARGO_CFG_TARGET_OS": ["linux"] + , "CARGO_CFG_TARGET_POINTER_WIDTH": ["64"] + , "CARGO_CFG_TARGET_VENDOR": ["unkwnown"] + , "CARGO_CFG_UNIX": ["true"] + , "TARGET": ["x86_64-unknown-linux-gnu"] + } +} diff --git a/rules/rust/runner.py b/rules/rust/runner.py new file mode 100755 index 0000000..bfa06ac --- /dev/null +++ b/rules/rust/runner.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +# Copyright 2024 Huawei Cloud Computing Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +import os +import subprocess +import time + +time_start: float = 0 +time_stop: float = 0 +result: str = "UNKNOWN" +stderr: str = None +stdout: str = None + + +def end(x): + return "\n" if x else "" + + +def dump_results() -> None: + global time_start, time_stop, result, stdout, stderr + with open("result", "w") as f: + print(f"{result}", file=f) + with open("time-start", "w") as f: + print(f"{time_start:.3f}", file=f) + with open("time-stop", "w") as f: + print(f"{time_stop:.3f}", file=f) + with open("stdout", "w") as f: + print(f"{stdout}", file=f, end=end(stdout)) + with open("stderr", "w") as f: + print(f"{stderr}", file=f, end=end(stderr)) + + +class dumper: + def __enter__(self): + global time_start + time_start = time.time() + + def __exit__(self, type, value, traceback): + dump_results() + + +with dumper(): + TEMP_DIR = os.path.realpath("scratch") + os.makedirs(TEMP_DIR, exist_ok=True) + + WORK_DIR = os.path.realpath("work") + os.makedirs(WORK_DIR, exist_ok=True) + + ENV = dict(os.environ, TEST_TMPDIR=TEMP_DIR, TMPDIR=TEMP_DIR, TERM="xterm-256color") + + with open("test-launcher.json") as f: + test_launcher = json.load(f) + + with open("test-args.json") as f: + test_args = json.load(f) + + ret = subprocess.run( + test_launcher + ["../test", "--color", "always"] + test_args, + cwd=WORK_DIR, + env=ENV, + capture_output=True, + ) + time_stop = time.time() + result = "PASS" if ret.returncode == 0 else "FAIL" + stdout = ret.stdout.decode("utf-8") + stderr = ret.stderr.decode("utf-8") + + if result != "PASS": + exit(1) |