diff options
Diffstat (limited to 'CC/foreign/EXPRESSIONS')
-rw-r--r-- | CC/foreign/EXPRESSIONS | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/CC/foreign/EXPRESSIONS b/CC/foreign/EXPRESSIONS new file mode 100644 index 0000000..fe15df3 --- /dev/null +++ b/CC/foreign/EXPRESSIONS @@ -0,0 +1,296 @@ +{ "default-MAKE": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "../..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "foreign-defaults"] + , ["provider", "MAKE"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } +, "default-CMAKE": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "../..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "foreign-defaults"] + , ["provider", "CMAKE"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } +, "default-ENV": + { "vars": ["defaults-transition"] + , "imports": {"map_provider": ["", "field_map_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "foreign-defaults"] + , ["provider", "ENV"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + , ["default", {"type": "empty_map"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} + } + } +, "default-PATH": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "../..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "foreign-defaults"] + , ["provider", "PATH"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } +, "default-TOOLCHAIN": + { "vars": ["defaults-transition"] + , "imports": {"map_provider": ["", "field_map_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "foreign-defaults"] + , ["provider", "TOOLCHAIN"] + , ["transition", {"type": "var", "name": "defaults-transition"}] + , ["default", {"type": "empty_map"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} + } + } +, "default-NON_SYSTEM_TOOLS": + { "vars": ["defaults-transition"] + , "expression": + { "type": "map_union" + , "$1": + { "type": "foreach" + , "var": "x" + , "range": {"type": "FIELD", "name": "foreign-defaults"} + , "body": + { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "x"} + , "provider": "NON_SYSTEM_TOOLS" + , "transition": + { "type": "var" + , "name": "defaults-transition" + , "default": {"type": "empty_map"} + } + , "default": {"type": "empty_map"} + } + } + } + } +, "strip-prefix": + { "doc": + [ "Returns list of artifact maps (each map contains a single artifact)" + , "with the given prefix being stripped from their path." + ] + , "vars": ["artifacts", "paths", "prefix"] + , "vars_doc": + { "artifacts": ["A single map containing all artifacts."] + , "paths": ["List of (unprefixed) artifacts paths to consider."] + , "prefix": ["Prefix to strip from the artifact's path."] + } + , "expression": + { "type": "foreach" + , "var": "path" + , "range": {"type": "var", "name": "paths"} + , "body": + { "type": "singleton_map" + , "key": {"type": "var", "name": "path"} + , "value": + { "type": "lookup" + , "key": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "prefix"} + , {"type": "var", "name": "path"} + ] + } + , "map": {"type": "var", "name": "artifacts"} + } + } + } + } +, "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"} + } + } + } +} |