diff options
-rw-r--r-- | CC/foreign/EXPRESSIONS | 173 | ||||
-rw-r--r-- | CC/foreign/cmake/EXPRESSIONS | 15 | ||||
-rw-r--r-- | CC/foreign/cmake/RULES | 26 | ||||
-rwxr-xr-x | CC/foreign/expand_exec | 133 | ||||
-rw-r--r-- | CC/foreign/expand_exec.c | 99 | ||||
-rw-r--r-- | CC/foreign/make/EXPRESSIONS | 15 | ||||
-rw-r--r-- | CC/foreign/make/RULES | 26 | ||||
-rw-r--r-- | CC/foreign/shell/EXPRESSIONS | 7 | ||||
-rw-r--r-- | CC/foreign/shell/RULES | 18 |
9 files changed, 300 insertions, 212 deletions
diff --git a/CC/foreign/EXPRESSIONS b/CC/foreign/EXPRESSIONS index fe15df3..2988b32 100644 --- a/CC/foreign/EXPRESSIONS +++ b/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/CC/foreign/cmake/EXPRESSIONS b/CC/foreign/cmake/EXPRESSIONS index 6865e7c..5397e9f 100644 --- a/CC/foreign/cmake/EXPRESSIONS +++ b/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/CC/foreign/cmake/RULES b/CC/foreign/cmake/RULES index 5f7c4f8..b36bc73 100644 --- a/CC/foreign/cmake/RULES +++ b/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/CC/foreign/expand_exec b/CC/foreign/expand_exec new file mode 100755 index 0000000..32891ca --- /dev/null +++ b/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/CC/foreign/expand_exec.c b/CC/foreign/expand_exec.c new file mode 100644 index 0000000..a4ff311 --- /dev/null +++ b/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/CC/foreign/make/EXPRESSIONS b/CC/foreign/make/EXPRESSIONS index aeafbfc..ceb5913 100644 --- a/CC/foreign/make/EXPRESSIONS +++ b/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/CC/foreign/make/RULES b/CC/foreign/make/RULES index 08e5414..76fca18 100644 --- a/CC/foreign/make/RULES +++ b/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/CC/foreign/shell/EXPRESSIONS b/CC/foreign/shell/EXPRESSIONS index d5f9527..2f05497 100644 --- a/CC/foreign/shell/EXPRESSIONS +++ b/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/CC/foreign/shell/RULES b/CC/foreign/shell/RULES index fc682d5..ffffc26 100644 --- a/CC/foreign/shell/RULES +++ b/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" |