summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rules/CC/foreign/EXPRESSIONS173
-rw-r--r--rules/CC/foreign/cmake/EXPRESSIONS15
-rw-r--r--rules/CC/foreign/cmake/RULES26
-rwxr-xr-xrules/CC/foreign/expand_exec133
-rw-r--r--rules/CC/foreign/expand_exec.c99
-rw-r--r--rules/CC/foreign/make/EXPRESSIONS15
-rw-r--r--rules/CC/foreign/make/RULES26
-rw-r--r--rules/CC/foreign/shell/EXPRESSIONS7
-rw-r--r--rules/CC/foreign/shell/RULES18
9 files changed, 300 insertions, 212 deletions
diff --git a/rules/CC/foreign/EXPRESSIONS b/rules/CC/foreign/EXPRESSIONS
index fe15df3..2988b32 100644
--- a/rules/CC/foreign/EXPRESSIONS
+++ b/rules/CC/foreign/EXPRESSIONS
@@ -120,177 +120,4 @@
}
}
}
-, "expand_exec_tool":
- { "doc":
- [ "Binary that expands specified env variables in argv and runs exec(2)."
- , "The syntax for accessing variable \"VAR\" is \"$(VAR)\"."
- , "Usage: expand_exec [VARS...] -- ARGV"
- , ""
- , "Requires a working C compiler for host from \"defaults\"."
- ]
- , "vars": ["CC", "ENV", "defaults-transition"]
- , "imports":
- { "compiler-cc": ["CC", "compiler-cc"]
- , "default-ENV": ["CC", "default-ENV"]
- , "default-PATH": ["CC", "default-PATH"]
- , "default-TOOLCHAIN": ["CC", "default-TOOLCHAIN"]
- , "default-NON_SYSTEM_TOOLS": ["CC", "default-NON_SYSTEM_TOOLS"]
- }
- , "expression":
- { "type": "let*"
- , "bindings":
- [ ["TOOLCHAIN_DIR", "toolchain"]
- , ["TOOLCHAIN", {"type": "CALL_EXPRESSION", "name": "default-TOOLCHAIN"}]
- , [ "TOOLCHAIN"
- , { "type": "to_subdir"
- , "subdir": {"type": "var", "name": "TOOLCHAIN_DIR"}
- , "$1": {"type": "var", "name": "TOOLCHAIN"}
- }
- ]
- , [ "NON_SYSTEM_TOOLS"
- , {"type": "CALL_EXPRESSION", "name": "default-NON_SYSTEM_TOOLS"}
- ]
- , ["CC", {"type": "CALL_EXPRESSION", "name": "compiler-cc"}]
- , [ "ENV"
- , { "type": "map_union"
- , "$1":
- [ {"type": "CALL_EXPRESSION", "name": "default-ENV"}
- , {"type": "var", "name": "ENV", "default": {"type": "empty_map"}}
- ]
- }
- ]
- , [ "ENV_PATH"
- , { "type": "lookup"
- , "map": {"type": "var", "name": "ENV"}
- , "key": "PATH"
- }
- ]
- , [ "ENV"
- , { "type": "map_union"
- , "$1":
- [ {"type": "var", "name": "ENV"}
- , { "type": "singleton_map"
- , "key": "PATH"
- , "value":
- { "type": "join"
- , "separator": ":"
- , "$1":
- { "type": "++"
- , "$1":
- [ {"type": "CALL_EXPRESSION", "name": "default-PATH"}
- , { "type": "if"
- , "cond": {"type": "var", "name": "ENV_PATH"}
- , "then": [{"type": "var", "name": "ENV_PATH"}]
- }
- ]
- }
- }
- }
- ]
- }
- ]
- , [ "expand_exec.c"
- , { "type": "singleton_map"
- , "key": "expand_exec.c"
- , "value":
- { "type": "BLOB"
- , "data":
- { "type": "join"
- , "separator": "\n"
- , "$1":
- [ "#include <stdlib.h>"
- , "#include <string.h>"
- , "#include <unistd.h>"
- , ""
- , "/* usage: ./expand_exec [VARS...] -- ARGS... */"
- , "int main(int argc, const char *argv[]) {"
- , " char** outv;"
- , " const char** varv;"
- , " int i, j, varc, sep = 0, retval = 0;"
- , " for (i = 1; i < argc; ++i) if (strcmp(argv[i], \"--\") == 0) { sep=i; break; }"
- , " varc = sep-1;"
- , " argc -= sep+1;"
- , " if (sep == 0 || argc < 1) return 1; /* error: missing sep or args */"
- , " varv = &argv[1];"
- , " argv = &argv[sep+1];"
- , " outv = (char**)calloc((size_t)(argc+1), sizeof(char*));"
- , " for (i = 0; i < argc; ++i) { /* iterate ARGS */"
- , " const char* arg = argv[i];"
- , " size_t arg_pos = 0, arg_len = strlen(arg);"
- , " size_t out_pos = 0, out_len = arg_len;"
- , " size_t str_pos = 0, str_len = 0;"
- , " char* out = (char*)calloc((size_t)(out_len+1), sizeof(char));"
- , " for (; arg_pos < arg_len; ++arg_pos) {"
- , " if (strncmp(&arg[arg_pos], \"$(\", 2) == 0) {"
- , " const char* start = &arg[arg_pos+2];"
- , " const char* end = strchr(start, ')');"
- , " if (end == NULL) {"
- , " retval = 2; /* error: unterminated $(VAR) expression */"
- , " free(out);"
- , " goto cleanup;"
- , " }"
- , " for (j = 0; j < varc; ++j) { /* lookup VAR */"
- , " const char* var = varv[j];"
- , " size_t len_var = strlen(var);"
- , " if ((size_t)(end - start) != len_var) continue;"
- , " if (strncmp(&arg[arg_pos+2], var, len_var) == 0) {"
- , " size_t val_len, out_len_new;"
- , " const char* val = getenv(var);"
- , " if (val == NULL) val = \"\";"
- , " val_len = strlen(val);"
- , " out_len_new = out_pos + str_len + val_len;"
- , " if (out_len_new > out_len) {"
- , " out = (char*)realloc(out, out_len_new+1);"
- , " out_len = out_len_new;"
- , " }"
- , " strncat(out, &arg[str_pos], str_len); /* concat preceding substr */"
- , " strncat(out, val, val_len); /* concat variable value */"
- , " arg_pos += len_var + 2;"
- , " out_pos += str_len + val_len;"
- , " str_pos = arg_pos + 1;"
- , " str_len = 0;"
- , " break;"
- , " }"
- , " }"
- , " if (j != varc) continue; /* success */"
- , " }"
- , " ++str_len;"
- , " }"
- , " if (str_len > 0) {"
- , " if (out_pos + str_len > out_len) {"
- , " out = (char*)realloc(out, out_pos + str_len + 1);"
- , " }"
- , " strncat(out, &arg[str_pos], str_len);"
- , " }"
- , " outv[i] = out;"
- , " }"
- , " execvp(outv[0], outv);"
- , " retval = 3; /* error: exec failed */"
- , "cleanup:"
- , " for (i = 0; i < argc; ++i) if (outv[i] != NULL) free(outv[i]);"
- , " free(outv);"
- , " return retval;"
- , "}"
- ]
- }
- }
- }
- ]
- ]
- , "body":
- { "type": "ACTION"
- , "inputs":
- { "type": "map_union"
- , "$1":
- [ {"type": "var", "name": "TOOLCHAIN"}
- , {"type": "var", "name": "expand_exec.c"}
- ]
- }
- , "cmd":
- [{"type": "var", "name": "CC"}, "expand_exec.c", "-o", "expand_exec"]
- , "outs": ["expand_exec"]
- , "env": {"type": "var", "name": "ENV"}
- }
- }
- }
}
diff --git a/rules/CC/foreign/cmake/EXPRESSIONS b/rules/CC/foreign/cmake/EXPRESSIONS
index 6865e7c..5397e9f 100644
--- a/rules/CC/foreign/cmake/EXPRESSIONS
+++ b/rules/CC/foreign/cmake/EXPRESSIONS
@@ -23,7 +23,7 @@
, "AR"
, "BUILD_POSITION_INDEPENDENT"
, "defaults-transition"
- , "host-defaults-transition"
+ , "expand_exec"
]
, "imports":
{ "artifacts": ["", "field_artifacts"]
@@ -38,7 +38,6 @@
, "default-PATH": ["CC", "default-PATH"]
, "default-TOOLCHAIN": ["CC", "default-TOOLCHAIN"]
, "default-NON_SYSTEM_TOOLS": ["CC", "default-NON_SYSTEM_TOOLS"]
- , "expand_exec_tool": ["./", "..", "expand_exec_tool"]
, "foreign-MAKE": ["CC/foreign", "default-MAKE"]
, "foreign-CMAKE": ["CC/foreign", "default-CMAKE"]
, "foreign-ENV": ["CC/foreign", "default-ENV"]
@@ -49,17 +48,7 @@
, "expression":
{ "type": "let*"
, "bindings":
- [ [ "expand_exec"
- , { "type": "let*"
- , "bindings":
- [ [ "defaults-transition"
- , {"type": "var", "name": "host-defaults-transition"}
- ]
- ]
- , "body": {"type": "CALL_EXPRESSION", "name": "expand_exec_tool"}
- }
- ]
- , ["TOOLCHAIN_DIR", "toolchain"]
+ [ ["TOOLCHAIN_DIR", "toolchain"]
, [ "TOOLCHAIN"
, { "type": "disjoint_map_union"
, "msg": "Toolchain trees may not overlap"
diff --git a/rules/CC/foreign/cmake/RULES b/rules/CC/foreign/cmake/RULES
index 5f7c4f8..b36bc73 100644
--- a/rules/CC/foreign/cmake/RULES
+++ b/rules/CC/foreign/cmake/RULES
@@ -38,6 +38,7 @@
, "implicit":
{ "defaults": [["CC", "defaults"]]
, "foreign-defaults": [["CC/foreign", "defaults"]]
+ , "expand_exec": [["./", "..", "expand_exec"]]
}
, "field_doc":
{ "project":
@@ -156,6 +157,7 @@
, "config_transitions":
{ "defaults":
[{"type": "empty_map"}, {"type": "CALL_EXPRESSION", "name": "for host"}]
+ , "expand_exec": [{"type": "CALL_EXPRESSION", "name": "for host"}]
}
, "expression":
{ "type": "let*"
@@ -203,8 +205,15 @@
, ["pre_cmds", {"type": "FIELD", "name": "pre_cmds"}]
, ["post_cmds", {"type": "FIELD", "name": "post_cmds"}]
, ["defaults-transition", {"type": "empty_map"}]
- , [ "host-defaults-transition"
- , {"type": "CALL_EXPRESSION", "name": "for host"}
+ , [ "expand_exec"
+ , { "type": "let*"
+ , "bindings":
+ [ ["fieldname", "expand_exec"]
+ , ["location", "expand_exec"]
+ , ["transition", {"type": "CALL_EXPRESSION", "name": "for host"}]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"}
+ }
]
, [ "full_install_dir"
, {"type": "CALL_EXPRESSION", "name": "cmake-build"}
@@ -303,6 +312,7 @@
{ "defaults": [["CC", "defaults"]]
, "foreign-defaults": [["CC/foreign", "defaults"]]
, "config_reader": [["CC", "prebuilt/read_pkgconfig.py"]]
+ , "expand_exec": [["./", "..", "expand_exec"]]
}
, "field_doc":
{ "project":
@@ -462,6 +472,7 @@
, "config_transitions":
{ "defaults":
[{"type": "empty_map"}, {"type": "CALL_EXPRESSION", "name": "for host"}]
+ , "expand_exec": [{"type": "CALL_EXPRESSION", "name": "for host"}]
}
, "expression":
{ "type": "let*"
@@ -597,8 +608,15 @@
, ["pre_cmds", {"type": "FIELD", "name": "pre_cmds"}]
, ["post_cmds", {"type": "FIELD", "name": "post_cmds"}]
, ["defaults-transition", {"type": "empty_map"}]
- , [ "host-defaults-transition"
- , {"type": "CALL_EXPRESSION", "name": "for host"}
+ , [ "expand_exec"
+ , { "type": "let*"
+ , "bindings":
+ [ ["fieldname", "expand_exec"]
+ , ["location", "expand_exec"]
+ , ["transition", {"type": "CALL_EXPRESSION", "name": "for host"}]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"}
+ }
]
, [ "full_install_dir"
, {"type": "CALL_EXPRESSION", "name": "cmake-build"}
diff --git a/rules/CC/foreign/expand_exec b/rules/CC/foreign/expand_exec
new file mode 100755
index 0000000..32891ca
--- /dev/null
+++ b/rules/CC/foreign/expand_exec
@@ -0,0 +1,133 @@
+#!/bin/sh
+# Copyright 2023 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.
+
+set -e
+
+check_var_name() {
+ local NAME="$1"
+ if ! expr match "${NAME}" "[A-Z_a-z][0-9A-Z_a-z]*$" >/dev/null; then
+ echo "expand_exec error: invalid variable name '${NAME}'"
+ return 1
+ fi
+ return 0
+}
+
+in_list() {
+ local NAME="$1"
+ local VAR_LIST="$2"
+ check_var_name "${NAME}" && expr match "${NAME}" "\(${VAR_LIST}\)$" >/dev/null
+}
+
+EXPANDED_VAR=
+expand_var() {
+ local NAME="$1"
+ check_var_name "${NAME}" && EXPANDED_VAR="$(eval "printf \"%s\" \"\${$NAME}\"")"
+}
+
+PARSED_ARG=
+parse_arg() {
+ local ARG="$1"
+ local VAR_LIST="$2"
+ local RESULT=""
+ local VAR_NAME=""
+ local PARSE_EXPR=false
+ local PARSE_VAR_NAME=false
+
+ while [ ${#ARG} -gt 0 ]; do
+ local NEXT=${ARG#?}
+ c="${ARG%$NEXT}"
+ ARG=$NEXT
+
+ if $PARSE_VAR_NAME; then
+ # parse <var> from $(<var>)
+ if [ "$c" = ")" ]; then
+ # expand var if in cases list
+ if in_list "${VAR_NAME}" "${VAR_LIST}" && expand_var "${VAR_NAME}"; then
+ RESULT="${RESULT}${EXPANDED_VAR}"
+ else
+ RESULT="${RESULT}\$(${VAR_NAME})"
+ fi
+ VAR_NAME=""
+ PARSE_VAR_NAME=false
+ else
+ # accumulate VAR_NAME
+ VAR_NAME="${VAR_NAME}$c"
+ if [ ${#ARG} -eq 0 ]; then
+ # flush unterminated var name
+ RESULT="${RESULT}\$(${VAR_NAME}"
+ fi
+ fi
+ else
+ # parse single char
+ if $PARSE_EXPR; then
+ if [ "$c" = "(" ]; then
+ # found "$("
+ PARSE_VAR_NAME=true
+ else
+ RESULT="${RESULT}\$$c"
+ fi
+ PARSE_EXPR=false
+ elif [ "$c" = "$" ]; then
+ # found "$"
+ PARSE_EXPR=true
+ else
+ # append char
+ RESULT="${RESULT}$c"
+ fi
+ fi
+ done
+
+ PARSED_ARG="'"
+ while [ ${#RESULT} -gt 0 ]; do
+ local NEXT=${RESULT#?}
+ c="${RESULT%$NEXT}"
+ RESULT=$NEXT
+ if [ "$c" = "'" ]; then
+ PARSED_ARG="${PARSED_ARG}'\\''"
+ else
+ PARSED_ARG="${PARSED_ARG}$c"
+ fi
+ done
+ PARSED_ARG="${PARSED_ARG}'"
+}
+
+# usage: ./expand_exec [VARS...] -- ARGS...
+expand_exec() {
+ local VAR_LIST=""
+ local VAR_SEP=""
+ local EXEC_VEC=""
+ local EXEC_SEP=""
+ local READ_ARGS=false
+
+ while [ "$#" -ge 1 ]; do
+ local ARG="$1";shift
+ if $READ_ARGS; then
+ parse_arg "${ARG}" "${VAR_LIST}"
+ EXEC_VEC="${EXEC_VEC}${EXEC_SEP}${PARSED_ARG}"
+ EXEC_SEP=" "
+ else
+ if [ "${ARG}" = "--" ]; then
+ READ_ARGS=true
+ elif check_var_name "${ARG}"; then
+ VAR_LIST="${VAR_LIST}${VAR_SEP}${ARG}"
+ VAR_SEP="\|"
+ fi
+ fi
+ done
+
+ exec /bin/sh -c "${EXEC_VEC}"
+}
+
+expand_exec "$@"
diff --git a/rules/CC/foreign/expand_exec.c b/rules/CC/foreign/expand_exec.c
new file mode 100644
index 0000000..a4ff311
--- /dev/null
+++ b/rules/CC/foreign/expand_exec.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2023 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.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/* usage: ./expand_exec [VARS...] -- ARGS... */
+int main(int argc, const char *argv[]) {
+ char **outv;
+ const char **varv;
+ int i, j, varc, sep = 0, retval = 0;
+ for (i = 1; i < argc; ++i)
+ if (strcmp(argv[i], "--") == 0) {
+ sep = i;
+ break;
+ }
+ varc = sep - 1;
+ argc -= sep + 1;
+ if (sep == 0 || argc < 1)
+ return 1; /* error: missing sep or args */
+ varv = &argv[1];
+ argv = &argv[sep + 1];
+ outv = (char **)calloc((size_t)(argc + 1), sizeof(char *));
+ for (i = 0; i < argc; ++i) { /* iterate ARGS */
+ const char *arg = argv[i];
+ size_t arg_pos = 0, arg_len = strlen(arg);
+ size_t out_pos = 0, out_len = arg_len;
+ size_t str_pos = 0, str_len = 0;
+ char *out = (char *)calloc((size_t)(out_len + 1), sizeof(char));
+ for (; arg_pos < arg_len; ++arg_pos) {
+ if (strncmp(&arg[arg_pos], "$(", 2) == 0) {
+ const char *start = &arg[arg_pos + 2];
+ const char *end = strchr(start, ')');
+ if (end == NULL) {
+ retval = 2; /* error: unterminated $(VAR) expression */
+ free(out);
+ goto cleanup;
+ }
+ for (j = 0; j < varc; ++j) { /* lookup VAR */
+ const char *var = varv[j];
+ size_t len_var = strlen(var);
+ if ((size_t)(end - start) != len_var)
+ continue;
+ if (strncmp(&arg[arg_pos + 2], var, len_var) == 0) {
+ size_t val_len, out_len_new;
+ const char *val = getenv(var);
+ if (val == NULL)
+ val = "";
+ val_len = strlen(val);
+ out_len_new = out_pos + str_len + val_len;
+ if (out_len_new > out_len) {
+ out = (char *)realloc(out, out_len_new + 1);
+ out_len = out_len_new;
+ }
+ strncat(out, &arg[str_pos], str_len); /* concat preceding substr */
+ strncat(out, val, val_len); /* concat variable value */
+ arg_pos += len_var + 2;
+ out_pos += str_len + val_len;
+ str_pos = arg_pos + 1;
+ str_len = 0;
+ break;
+ }
+ }
+ if (j != varc)
+ continue; /* success */
+ }
+ ++str_len;
+ }
+ if (str_len > 0) {
+ if (out_pos + str_len > out_len) {
+ out = (char *)realloc(out, out_pos + str_len + 1);
+ }
+ strncat(out, &arg[str_pos], str_len);
+ }
+ outv[i] = out;
+ }
+ execvp(outv[0], outv);
+ retval = 3; /* error: exec failed */
+cleanup:
+ for (i = 0; i < argc; ++i)
+ if (outv[i] != NULL)
+ free(outv[i]);
+ free(outv);
+ return retval;
+}
diff --git a/rules/CC/foreign/make/EXPRESSIONS b/rules/CC/foreign/make/EXPRESSIONS
index aeafbfc..ceb5913 100644
--- a/rules/CC/foreign/make/EXPRESSIONS
+++ b/rules/CC/foreign/make/EXPRESSIONS
@@ -25,7 +25,7 @@
, "BUILD_POSITION_INDEPENDENT"
, "TIMEOUT_SCALE"
, "defaults-transition"
- , "host-defaults-transition"
+ , "expand_exec"
]
, "imports":
{ "artifacts": ["", "field_artifacts"]
@@ -40,7 +40,6 @@
, "default-PATH": ["CC", "default-PATH"]
, "default-TOOLCHAIN": ["CC", "default-TOOLCHAIN"]
, "default-NON_SYSTEM_TOOLS": ["CC", "default-NON_SYSTEM_TOOLS"]
- , "expand_exec_tool": ["./", "..", "expand_exec_tool"]
, "foreign-MAKE": ["CC/foreign", "default-MAKE"]
, "foreign-ENV": ["CC/foreign", "default-ENV"]
, "foreign-PATH": ["CC/foreign", "default-PATH"]
@@ -50,17 +49,7 @@
, "expression":
{ "type": "let*"
, "bindings":
- [ [ "expand_exec"
- , { "type": "let*"
- , "bindings":
- [ [ "defaults-transition"
- , {"type": "var", "name": "host-defaults-transition"}
- ]
- ]
- , "body": {"type": "CALL_EXPRESSION", "name": "expand_exec_tool"}
- }
- ]
- , ["TOOLCHAIN_DIR", "toolchain"]
+ [ ["TOOLCHAIN_DIR", "toolchain"]
, [ "TOOLCHAIN"
, { "type": "disjoint_map_union"
, "msg": "Toolchain trees may not overlap"
diff --git a/rules/CC/foreign/make/RULES b/rules/CC/foreign/make/RULES
index 08e5414..76fca18 100644
--- a/rules/CC/foreign/make/RULES
+++ b/rules/CC/foreign/make/RULES
@@ -41,6 +41,7 @@
, "implicit":
{ "defaults": [["CC", "defaults"]]
, "foreign-defaults": [["CC/foreign", "defaults"]]
+ , "expand_exec": [["./", "..", "expand_exec"]]
}
, "field_doc":
{ "project":
@@ -172,6 +173,7 @@
, "config_transitions":
{ "defaults":
[{"type": "empty_map"}, {"type": "CALL_EXPRESSION", "name": "for host"}]
+ , "expand_exec": [{"type": "CALL_EXPRESSION", "name": "for host"}]
}
, "expression":
{ "type": "let*"
@@ -221,8 +223,15 @@
, ["pre_cmds", {"type": "FIELD", "name": "pre_cmds"}]
, ["post_cmds", {"type": "FIELD", "name": "post_cmds"}]
, ["defaults-transition", {"type": "empty_map"}]
- , [ "host-defaults-transition"
- , {"type": "CALL_EXPRESSION", "name": "for host"}
+ , [ "expand_exec"
+ , { "type": "let*"
+ , "bindings":
+ [ ["fieldname", "expand_exec"]
+ , ["location", "expand_exec"]
+ , ["transition", {"type": "CALL_EXPRESSION", "name": "for host"}]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"}
+ }
]
, ["full_install_dir", {"type": "CALL_EXPRESSION", "name": "make-build"}]
, [ "install_dir"
@@ -323,6 +332,7 @@
{ "defaults": [["CC", "defaults"]]
, "foreign-defaults": [["CC/foreign", "defaults"]]
, "config_reader": [["CC", "prebuilt/read_pkgconfig.py"]]
+ , "expand_exec": [["./", "..", "expand_exec"]]
}
, "field_doc":
{ "project":
@@ -492,6 +502,7 @@
, "config_transitions":
{ "defaults":
[{"type": "empty_map"}, {"type": "CALL_EXPRESSION", "name": "for host"}]
+ , "expand_exec": [{"type": "CALL_EXPRESSION", "name": "for host"}]
}
, "expression":
{ "type": "let*"
@@ -630,8 +641,15 @@
, ["pre_cmds", {"type": "FIELD", "name": "pre_cmds"}]
, ["post_cmds", {"type": "FIELD", "name": "post_cmds"}]
, ["defaults-transition", {"type": "empty_map"}]
- , [ "host-defaults-transition"
- , {"type": "CALL_EXPRESSION", "name": "for host"}
+ , [ "expand_exec"
+ , { "type": "let*"
+ , "bindings":
+ [ ["fieldname", "expand_exec"]
+ , ["location", "expand_exec"]
+ , ["transition", {"type": "CALL_EXPRESSION", "name": "for host"}]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"}
+ }
]
, ["full_install_dir", {"type": "CALL_EXPRESSION", "name": "make-build"}]
, [ "install_dir"
diff --git a/rules/CC/foreign/shell/EXPRESSIONS b/rules/CC/foreign/shell/EXPRESSIONS
index d5f9527..2f05497 100644
--- a/rules/CC/foreign/shell/EXPRESSIONS
+++ b/rules/CC/foreign/shell/EXPRESSIONS
@@ -18,6 +18,7 @@
, "PREFIX"
, "BUILD_POSITION_INDEPENDENT"
, "TIMEOUT_SCALE"
+ , "expand_exec"
]
, "imports":
{ "artifacts": ["", "field_artifacts"]
@@ -31,7 +32,6 @@
, "default-PATH": ["CC", "default-PATH"]
, "default-TOOLCHAIN": ["CC", "default-TOOLCHAIN"]
, "default-NON_SYSTEM_TOOLS": ["CC", "default-NON_SYSTEM_TOOLS"]
- , "expand_exec_tool": ["./", "..", "expand_exec_tool"]
, "foreign-MAKE": ["CC/foreign", "default-MAKE"]
, "foreign-CMAKE": ["CC/foreign", "default-CMAKE"]
, "foreign-PATH": ["CC/foreign", "default-PATH"]
@@ -42,10 +42,7 @@
, "expression":
{ "type": "let*"
, "bindings":
- [ [ "expand_exec"
- , {"type": "CALL_EXPRESSION", "name": "expand_exec_tool"}
- ]
- , ["TOOLCHAIN_DIR", "toolchain"]
+ [ ["TOOLCHAIN_DIR", "toolchain"]
, [ "TOOLCHAIN"
, { "type": "disjoint_map_union"
, "msg": "Toolchain trees may not overlap"
diff --git a/rules/CC/foreign/shell/RULES b/rules/CC/foreign/shell/RULES
index fc682d5..ffffc26 100644
--- a/rules/CC/foreign/shell/RULES
+++ b/rules/CC/foreign/shell/RULES
@@ -29,6 +29,7 @@
, "implicit":
{ "defaults": [["CC", "defaults"]]
, "foreign-defaults": [["CC/foreign", "defaults"]]
+ , "expand_exec": [["./", "..", "expand_exec"]]
}
, "field_doc":
{ "project":
@@ -110,8 +111,15 @@
}
, "imports":
{ "artifacts": ["", "field_artifacts"]
+ , "stage_field": ["", "stage_singleton_field"]
, "shell-build": "shell-build"
, "install-deps": ["CC", "install-with-deps stage"]
+ , "for host": ["transitions", "for host"]
+ }
+ , "config_transitions":
+ { "defaults":
+ [{"type": "empty_map"}, {"type": "CALL_EXPRESSION", "name": "for host"}]
+ , "expand_exec": [{"type": "CALL_EXPRESSION", "name": "for host"}]
}
, "expression":
{ "type": "let*"
@@ -143,6 +151,16 @@
]
, ["outs", {"type": "FIELD", "name": "outs"}]
, ["out_dirs", {"type": "FIELD", "name": "out_dirs"}]
+ , [ "expand_exec"
+ , { "type": "let*"
+ , "bindings":
+ [ ["fieldname", "expand_exec"]
+ , ["location", "expand_exec"]
+ , ["transition", {"type": "CALL_EXPRESSION", "name": "for host"}]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"}
+ }
+ ]
]
, "body":
{ "type": "RESULT"