summaryrefslogtreecommitdiff
path: root/rules/CC/foreign/EXPRESSIONS
diff options
context:
space:
mode:
Diffstat (limited to 'rules/CC/foreign/EXPRESSIONS')
-rw-r--r--rules/CC/foreign/EXPRESSIONS173
1 files changed, 0 insertions, 173 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"}
- }
- }
- }
}