diff options
-rw-r--r-- | rules/CC/auto/EXPRESSIONS | 32 | ||||
-rw-r--r-- | rules/CC/auto/RULES | 874 |
2 files changed, 906 insertions, 0 deletions
diff --git a/rules/CC/auto/EXPRESSIONS b/rules/CC/auto/EXPRESSIONS new file mode 100644 index 00000000..ac19f7a0 --- /dev/null +++ b/rules/CC/auto/EXPRESSIONS @@ -0,0 +1,32 @@ +{ "last_list_entry": + { "vars": ["list"] + , "expression": + { "type": "foldl" + , "range": {"type": "var", "name": "list"} + , "start": null + , "body": {"type": "var", "name": "_"} + } + } +, "first_list_entry": + { "vars": ["list"] + , "imports": {"last": "last_list_entry"} + , "expression": + { "type": "let*" + , "bindings": + [ [ "list" + , { "type": "foldl" + , "range": {"type": "var", "name": "list", "default": []} + , "start": null + , "body": + { "type": "if" + , "cond": {"type": "var", "name": "$1"} + , "then": {"type": "var", "name": "$1"} + , "else": [{"type": "var", "name": "_"}] + } + } + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "last"} + } + } +} diff --git a/rules/CC/auto/RULES b/rules/CC/auto/RULES new file mode 100644 index 00000000..37353818 --- /dev/null +++ b/rules/CC/auto/RULES @@ -0,0 +1,874 @@ +{ "config": + { "doc": + [ "Generate a C/C++ config header" + , "" + , "Generate a C/C++ configuration header using defines specified via the" + , "target configuration. In the usual case, a target using this rule is" + , "configured by depending on it from a target that uses the built-in" + , "\"configure\" rule." + ] + , "field_doc": + { "name": ["Name of the header file to generate (incl. file name ext)."] + , "guard": ["The include guard. Multiple segments are joined with \"_\"."] + , "stage": + ["The location of the header. Path segments are joined with \"/\"."] + , "hdrs": + [ "Additional header files to be available in the include path. Useful" + , "for providing additional header files to values given in" + , "\"have_{cfile,cxxfile,ctype,cxxtype,csymbol,cxxsymbol}\"." + ] + , "deps": + [ "Additional public header files from targets to be available in the" + , "include path. Useful for providing additional header files to values" + , "given in \"have_{cfile,cxxfile,ctype,cxxtype,csymbol,cxxsymbol}\"." + ] + } + , "config_doc": + { "CXX": + [ "The name of the C++ compiler to be used by checks. If None, the" + , "respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "CC": + [ "The name of the C compiler to be used by checks. If None, the" + , "respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "CFLAGS": + [ "The flags for CXX to be used instead of the default ones" + , "taken from the [\"CC\", \"defaults\"] target" + ] + , "CXXFLAGS": + [ "The flags for CXX to be used instead of the default ones" + , "taken from the [\"CC\", \"defaults\"] target" + ] + , "ADD_CFLAGS": + [ "The flags to add to the default ones for CC" + , "taken from the [\"CC\", \"defaults\"] target" + ] + , "ADD_CXXFLAGS": + [ "The flags to add to the default ones for CXX" + , "taken from the [\"CC\", \"defaults\"] target" + ] + , "ENV": ["The environment for running file/symbol/type checks."] + , "defines": + [ "Set a define to a specific value unless its value is \"null\". Must" + , "contain a list of pairs. The first element of each pair is the define" + , "name and the second argument is the value to set. Strings must be" + , "properly escaped. Defines generated from this field are added last," + , "so that they can refer to defines from other \"defines*\" and" + , "\"have_*\" values." + ] + , "defines1": + [ "Set a define to \"1\" unless its value is untrue. Must contain a list" + , "of pairs. The first element of each pair is the define name and the" + , "second argument is the value." + ] + , "defines01": + [ "Set a define to \"0\" or \"1\" depending on its value being true." + , "Must contain a list of pairs. The first element of each pair is the" + , "define name and the second argument is the value." + ] + , "have_cfile": + [ "Set a define to \"1\" if the specified C header is in the include" + , "path. Must contain a list of pairs. The first element of each pair is" + , "the define name and the second argument is the C header file name." + ] + , "have_cxxfile": + [ "Set a define to \"1\" if the specified C++ header is in the include" + , "path. Must contain a list of pairs. The first element of each pair is" + , "the define name and the second argument is the C++ header file name." + ] + , "have_ctype": + [ "Set a define to \"1\" if the specified C type is defined. Must" + , "contain a list of pairs. The first element of each pair is the define" + , "name and the second argument is name of the C type. If the specified" + , "C type is not a built-in type, additionally the headers" + , "\"sys/types.h\", \"stdint.h\", and \"stddef.h\" are checked as well." + ] + , "have_cxxtype": + [ "Set a define to \"1\" if the specified C++ type is defined. Must" + , "contain a list of pairs. The first element of each pair is the define" + , "name and the second argument is name of the C++ type. If the specified" + , "C++ type is not a built-in type, additionally the headers" + , "\"sys/types.h\", \"stdint.h\", and \"stddef.h\" are checked as well." + ] + , "have_csymbol": + [ "Set a define to \"1\" if the specified C symbol is defined by one of" + , "the specified headers in the include path. Must contain a list of" + , "pairs. The first element of each pair is the define name and the" + , "second argument is another pair. This pair's first value is the C" + , "symbol to search for and the second value is a list with the header" + , "file names to consider for searching." + ] + , "have_cxxsymbol": + [ "Set a define to \"1\" if the specified C++ symbol is defined by one of" + , "the specified headers in the include path. Must contain a list of" + , "pairs. The first element of each pair is the define name and the" + , "second argument is another pair. This pair's first value is the C++" + , "symbol to search for and the second value is a list with the header" + , "file names to consider for searching." + ] + } + , "string_fields": ["name", "stage", "guard"] + , "target_fields": ["hdrs", "deps"] + , "config_vars": + [ "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "ADD_CFLAGS" + , "ADD_CXXFLAGS" + , "ENV" + , "defines" + , "defines1" + , "defines01" + , "have_cfile" + , "have_cxxfile" + , "have_ctype" + , "have_cxxtype" + , "have_csymbol" + , "have_cxxsymbol" + ] + , "imports": + { "first": "first_list_entry" + , "last": "last_list_entry" + , "artifacts": ["./", "../..", "field_artifacts"] + , "compile-deps": ["./", "..", "compile-deps"] + , "default-CC": ["./", "..", "default-CC"] + , "default-CXX": ["./", "..", "default-CXX"] + , "default-CFLAGS": ["./", "..", "default-CFLAGS"] + , "default-CXXFLAGS": ["./", "..", "default-CXXFLAGS"] + , "default-ENV": ["./", "..", "default-ENV"] + } + , "implicit": {"defaults": [["./", "..", "defaults"]]} + , "expression": + { "type": "let*" + , "bindings": + [ ["name", {"type": "join", "$1": {"type": "FIELD", "name": "name"}}] + , [ "stage" + , { "type": "join" + , "separator": "/" + , "$1": {"type": "FIELD", "name": "stage"} + } + ] + , [ "guard" + , { "type": "assert_non_empty" + , "msg": "Config header include guard may not be empty" + , "$1": + { "type": "join" + , "separator": "_" + , "$1": {"type": "FIELD", "name": "guard"} + } + } + ] + , [ "includes" + , { "type": "to_subdir" + , "subdir": "include" + , "$1": + { "type": "disjoint_map_union" + , "msg": "Includes may not overlap" + , "$1": + [ { "type": "let*" + , "bindings": [["fieldname", "hdrs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"} + } + , { "type": "let*" + , "bindings": [["deps-fieldnames", ["deps"]]] + , "body": {"type": "CALL_EXPRESSION", "name": "compile-deps"} + } + ] + } + } + ] + , [ "CC" + , { "type": "var" + , "name": "CC" + , "default": {"type": "CALL_EXPRESSION", "name": "default-CC"} + } + ] + , [ "CXX" + , { "type": "var" + , "name": "CXX" + , "default": {"type": "CALL_EXPRESSION", "name": "default-CXX"} + } + ] + , [ "CFLAGS" + , { "type": "++" + , "$1": + [ { "type": "var" + , "name": "CFLAGS" + , "default": + {"type": "CALL_EXPRESSION", "name": "default-CFLAGS"} + } + , {"type": "var", "name": "ADD_CFLAGS", "default": []} + ] + } + ] + , [ "CXXFLAGS" + , { "type": "++" + , "$1": + [ { "type": "var" + , "name": "CXXFLAGS" + , "default": + {"type": "CALL_EXPRESSION", "name": "default-CXXFLAGS"} + } + , {"type": "var", "name": "ADD_CXXFLAGS", "default": []} + ] + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , [ { "type": "var" + , "name": "ENV" + , "default": {"type": "empty_map"} + } + ] + ] + } + } + ] + , [ "c.flags" + , { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": {"type": "var", "name": "CFLAGS"} + } + } + ] + , [ "cxx.flags" + , { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": {"type": "var", "name": "CXXFLAGS"} + } + } + ] + , [ "file_check.sh" + , { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + [ "set -eu" + , "[ $# -ge 4 ]" + , "CC=$1" + , "LANG=$2" + , "DEF=$3" + , "HDR=$4" + , "DEFINE=\"/* #undef $DEF */\"" + , "echo \"#include \\\"$HDR\\\"\" > test.$LANG" + , "if $CC @$LANG.flags -c test.$LANG -I ./include 2>/dev/null; then DEFINE=\"#define $DEF 1\"; fi" + , "if [ -f in/${LANG}files.def ]; then cat in/${LANG}files.def > ${LANG}files.def; fi" + , "echo \"$DEFINE\n\" >> ${LANG}files.def" + ] + } + } + ] + , [ "type_check.sh" + , { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + [ "set -eu" + , "[ $# -ge 4 ]" + , "CC=$1" + , "LANG=$2" + , "DEF=$3" + , "TYPE=$4" + , "INC=\"\"" + , "DEFINE=\"/* #undef $DEF */\"" + , "for HDR in \"\" \"sys/types.h\" \"stdint.h\" \"stddef.h\"; do" + , " if [ -n \"$HDR\" ]; then INC=\"#include \\\"$HDR\\\"\"; fi" + , " cat > test.$LANG << EOF" + , "$INC" + , "$TYPE* __test;" + , "EOF" + , " if $CC @$LANG.flags -c test.$LANG -I ./include 2>/dev/null; then" + , " DEFINE=\"#define $DEF 1\"" + , " break" + , " fi" + , "done" + , "if [ -f in/${LANG}types.def ]; then cat in/${LANG}types.def > ${LANG}types.def; fi" + , "echo \"$DEFINE\n\" >> ${LANG}types.def" + ] + } + } + ] + , [ "symbol_check.sh" + , { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + [ "set -eu" + , "[ $# -ge 4 ]" + , "CC=$1" + , "shift" + , "LANG=$1" + , "shift" + , "DEF=$1" + , "shift" + , "SYMBOL=$1" + , "shift" + , "DEFINE=\"/* #undef $DEF */\"" + , "for INC in \"$@\"; do" + , " cat > test.$LANG << EOF" + , "#include \"$INC\"" + , "#ifndef $SYMBOL" + , "void* __test = &$SYMBOL;" + , "#endif" + , "EOF" + , " if $CC @$LANG.flags -c test.$LANG -I ./include 2>/dev/null; then" + , " DEFINE=\"#define $DEF 1\"" + , " break" + , " fi" + , "done" + , "if [ -f in/${LANG}symbols.def ]; then cat in/${LANG}symbols.def > ${LANG}symbols.def; fi" + , "echo \"$DEFINE\n\" >> ${LANG}symbols.def" + ] + } + } + ] + , [ "guard.def" + , { "type": "singleton_map" + , "key": "guard.def" + , "value": + { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + [ { "type": "join" + , "separator": " " + , "$1": ["#ifndef", {"type": "var", "name": "guard"}] + } + , { "type": "join" + , "separator": " " + , "$1": ["#define", {"type": "var", "name": "guard"}] + } + , "\n\n" + ] + } + } + } + ] + , [ "plain.def" + , { "type": "singleton_map" + , "key": "plain.def" + , "value": + { "type": "BLOB" + , "data": + { "type": "join" + , "$1": + { "type": "foreach" + , "range": {"type": "var", "name": "defines", "default": []} + , "var": "pair" + , "body": + { "type": "let*" + , "bindings": + [ ["list", {"type": "var", "name": "pair"}] + , [ "def" + , { "type": "assert_non_empty" + , "msg": "Define name in 'defines' may not be empty" + , "$1": {"type": "CALL_EXPRESSION", "name": "first"} + } + ] + , ["val", {"type": "CALL_EXPRESSION", "name": "last"}] + ] + , "body": + { "type": "join" + , "separator": " " + , "$1": + { "type": "case*" + , "expr": {"type": "var", "name": "val"} + , "case": + [ [ null + , [ "/* #undef" + , {"type": "var", "name": "def"} + , "*/\n\n" + ] + ] + ] + , "default": + [ "#define" + , {"type": "var", "name": "def"} + , { "type": "join" + , "$1": [{"type": "var", "name": "val"}, "\n\n"] + } + ] + } + } + } + } + } + } + } + ] + , [ "int1.def" + , { "type": "singleton_map" + , "key": "int1.def" + , "value": + { "type": "BLOB" + , "data": + { "type": "join" + , "$1": + { "type": "foreach" + , "range": {"type": "var", "name": "defines1", "default": []} + , "var": "pair" + , "body": + { "type": "let*" + , "bindings": + [ ["list", {"type": "var", "name": "pair"}] + , [ "def" + , { "type": "assert_non_empty" + , "msg": "Define name in 'defines1' may not be empty" + , "$1": {"type": "CALL_EXPRESSION", "name": "first"} + } + ] + , ["val", {"type": "CALL_EXPRESSION", "name": "last"}] + ] + , "body": + { "type": "join" + , "separator": " " + , "$1": + { "type": "if" + , "cond": {"type": "var", "name": "val"} + , "then": + ["#define", {"type": "var", "name": "def"}, "1\n\n"] + , "else": + ["/* #undef", {"type": "var", "name": "def"}, "*/\n\n"] + } + } + } + } + } + } + } + ] + , [ "int01.def" + , { "type": "singleton_map" + , "key": "int01.def" + , "value": + { "type": "BLOB" + , "data": + { "type": "join" + , "$1": + { "type": "foreach" + , "range": {"type": "var", "name": "defines01", "default": []} + , "var": "pair" + , "body": + { "type": "let*" + , "bindings": + [ ["list", {"type": "var", "name": "pair"}] + , [ "def" + , { "type": "assert_non_empty" + , "msg": "Define name in 'defines01' may not be empty" + , "$1": {"type": "CALL_EXPRESSION", "name": "first"} + } + ] + , ["val", {"type": "CALL_EXPRESSION", "name": "last"}] + ] + , "body": + { "type": "join" + , "separator": " " + , "$1": + [ "#define" + , {"type": "var", "name": "def"} + , { "type": "if" + , "cond": {"type": "var", "name": "val"} + , "then": "1\n\n" + , "else": "0\n\n" + } + ] + } + } + } + } + } + } + ] + , [ "cfiles.def" + , { "type": "foldl" + , "range": {"type": "var", "name": "have_cfile", "default": []} + , "start": + { "type": "singleton_map" + , "key": "cfiles.def" + , "value": {"type": "BLOB", "data": ""} + } + , "accum_var": "cfiles.def" + , "var": "pair" + , "body": + { "type": "let*" + , "bindings": + [ ["list", {"type": "var", "name": "pair"}] + , [ "def" + , { "type": "assert_non_empty" + , "msg": "Define name in 'have_cfile' may not be empty" + , "$1": {"type": "CALL_EXPRESSION", "name": "first"} + } + ] + , ["val", {"type": "CALL_EXPRESSION", "name": "last"}] + ] + , "body": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ { "type": "to_subdir" + , "subdir": "in" + , "$1": {"type": "var", "name": "cfiles.def"} + } + , {"type": "env", "vars": ["file_check.sh", "c.flags"]} + , {"type": "var", "name": "includes"} + ] + } + , "cmd": + [ "sh" + , "./file_check.sh" + , {"type": "var", "name": "CC"} + , "c" + , {"type": "var", "name": "def"} + , {"type": "var", "name": "val"} + ] + , "env": {"type": "var", "name": "ENV"} + , "outs": ["cfiles.def"] + } + } + } + ] + , [ "cxxfiles.def" + , { "type": "foldl" + , "range": {"type": "var", "name": "have_cxxfile", "default": []} + , "start": + { "type": "singleton_map" + , "key": "cxxfiles.def" + , "value": {"type": "BLOB", "data": ""} + } + , "accum_var": "cxxfiles.def" + , "var": "pair" + , "body": + { "type": "let*" + , "bindings": + [ ["list", {"type": "var", "name": "pair"}] + , [ "def" + , { "type": "assert_non_empty" + , "msg": "Define name in 'have_cxxfile' may not be empty" + , "$1": {"type": "CALL_EXPRESSION", "name": "first"} + } + ] + , ["val", {"type": "CALL_EXPRESSION", "name": "last"}] + ] + , "body": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ { "type": "to_subdir" + , "subdir": "in" + , "$1": {"type": "var", "name": "cxxfiles.def"} + } + , {"type": "env", "vars": ["file_check.sh", "cxx.flags"]} + , {"type": "var", "name": "includes"} + ] + } + , "cmd": + [ "sh" + , "./file_check.sh" + , {"type": "var", "name": "CXX"} + , "cxx" + , {"type": "var", "name": "def"} + , {"type": "var", "name": "val"} + ] + , "env": {"type": "var", "name": "ENV"} + , "outs": ["cxxfiles.def"] + } + } + } + ] + , [ "ctypes.def" + , { "type": "foldl" + , "range": {"type": "var", "name": "have_ctype", "default": []} + , "start": + { "type": "singleton_map" + , "key": "ctypes.def" + , "value": {"type": "BLOB", "data": ""} + } + , "accum_var": "ctypes.def" + , "var": "pair" + , "body": + { "type": "let*" + , "bindings": + [ ["list", {"type": "var", "name": "pair"}] + , [ "def" + , { "type": "assert_non_empty" + , "msg": "Define name in 'have_ctype' may not be empty" + , "$1": {"type": "CALL_EXPRESSION", "name": "first"} + } + ] + , ["type", {"type": "CALL_EXPRESSION", "name": "last"}] + ] + , "body": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ { "type": "to_subdir" + , "subdir": "in" + , "$1": {"type": "var", "name": "ctypes.def"} + } + , {"type": "env", "vars": ["type_check.sh", "c.flags"]} + , {"type": "var", "name": "includes"} + ] + } + , "cmd": + [ "sh" + , "./type_check.sh" + , {"type": "var", "name": "CC"} + , "c" + , {"type": "var", "name": "def"} + , {"type": "var", "name": "type"} + ] + , "env": {"type": "var", "name": "ENV"} + , "outs": ["ctypes.def"] + } + } + } + ] + , [ "cxxtypes.def" + , { "type": "foldl" + , "range": {"type": "var", "name": "have_cxxtype", "default": []} + , "start": + { "type": "singleton_map" + , "key": "cxxtypes.def" + , "value": {"type": "BLOB", "data": ""} + } + , "accum_var": "cxxtypes.def" + , "var": "pair" + , "body": + { "type": "let*" + , "bindings": + [ ["list", {"type": "var", "name": "pair"}] + , [ "def" + , { "type": "assert_non_empty" + , "msg": "Define name in 'have_cxxtype' may not be empty" + , "$1": {"type": "CALL_EXPRESSION", "name": "first"} + } + ] + , ["type", {"type": "CALL_EXPRESSION", "name": "last"}] + ] + , "body": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ { "type": "to_subdir" + , "subdir": "in" + , "$1": {"type": "var", "name": "cxxtypes.def"} + } + , {"type": "env", "vars": ["type_check.sh", "cxx.flags"]} + , {"type": "var", "name": "includes"} + ] + } + , "cmd": + [ "sh" + , "./type_check.sh" + , {"type": "var", "name": "CXX"} + , "cxx" + , {"type": "var", "name": "def"} + , {"type": "var", "name": "type"} + ] + , "env": {"type": "var", "name": "ENV"} + , "outs": ["cxxtypes.def"] + } + } + } + ] + , [ "csymbols.def" + , { "type": "foldl" + , "range": {"type": "var", "name": "have_csymbol", "default": []} + , "start": + { "type": "singleton_map" + , "key": "csymbols.def" + , "value": {"type": "BLOB", "data": ""} + } + , "accum_var": "csymbols.def" + , "var": "pair" + , "body": + { "type": "let*" + , "bindings": + [ ["list", {"type": "var", "name": "pair"}] + , [ "def" + , { "type": "assert_non_empty" + , "msg": "Define name in 'have_csymbol' may not be empty" + , "$1": {"type": "CALL_EXPRESSION", "name": "first"} + } + ] + , ["list", {"type": "CALL_EXPRESSION", "name": "last"}] + , ["sym", {"type": "CALL_EXPRESSION", "name": "first"}] + , ["hdrs", {"type": "CALL_EXPRESSION", "name": "last"}] + ] + , "body": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ { "type": "to_subdir" + , "subdir": "in" + , "$1": {"type": "var", "name": "csymbols.def"} + } + , {"type": "env", "vars": ["symbol_check.sh", "c.flags"]} + , {"type": "var", "name": "includes"} + ] + } + , "cmd": + { "type": "++" + , "$1": + [ [ "sh" + , "./symbol_check.sh" + , {"type": "var", "name": "CC"} + , "c" + , {"type": "var", "name": "def"} + , {"type": "var", "name": "sym"} + ] + , {"type": "var", "name": "hdrs"} + ] + } + , "env": {"type": "var", "name": "ENV"} + , "outs": ["csymbols.def"] + } + } + } + ] + , [ "cxxsymbols.def" + , { "type": "foldl" + , "range": {"type": "var", "name": "have_cxxsymbol", "default": []} + , "start": + { "type": "singleton_map" + , "key": "cxxsymbols.def" + , "value": {"type": "BLOB", "data": ""} + } + , "accum_var": "cxxsymbols.def" + , "var": "pair" + , "body": + { "type": "let*" + , "bindings": + [ ["list", {"type": "var", "name": "pair"}] + , [ "def" + , { "type": "assert_non_empty" + , "msg": "Define name in 'have_cxxsymbol' may not be empty" + , "$1": {"type": "CALL_EXPRESSION", "name": "first"} + } + ] + , ["list", {"type": "CALL_EXPRESSION", "name": "last"}] + , ["sym", {"type": "CALL_EXPRESSION", "name": "first"}] + , ["hdrs", {"type": "CALL_EXPRESSION", "name": "last"}] + ] + , "body": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ { "type": "to_subdir" + , "subdir": "in" + , "$1": {"type": "var", "name": "cxxsymbols.def"} + } + , {"type": "env", "vars": ["symbol_check.sh", "cxx.flags"]} + , {"type": "var", "name": "includes"} + ] + } + , "cmd": + { "type": "++" + , "$1": + [ [ "sh" + , "./symbol_check.sh" + , {"type": "var", "name": "CXX"} + , "cxx" + , {"type": "var", "name": "def"} + , {"type": "var", "name": "sym"} + ] + , {"type": "var", "name": "hdrs"} + ] + } + , "env": {"type": "var", "name": "ENV"} + , "outs": ["cxxsymbols.def"] + } + } + } + ] + , [ "end.def" + , { "type": "singleton_map" + , "key": "end.def" + , "value": {"type": "BLOB", "data": "\n#endif\n"} + } + ] + , [ "outname" + , {"type": "join", "$1": ["out/", {"type": "var", "name": "name"}]} + ] + , [ "outfile" + , { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "guard.def"} + , {"type": "var", "name": "plain.def"} + , {"type": "var", "name": "int1.def"} + , {"type": "var", "name": "int01.def"} + , {"type": "var", "name": "cfiles.def"} + , {"type": "var", "name": "cxxfiles.def"} + , {"type": "var", "name": "ctypes.def"} + , {"type": "var", "name": "cxxtypes.def"} + , {"type": "var", "name": "csymbols.def"} + , {"type": "var", "name": "cxxsymbols.def"} + , {"type": "var", "name": "end.def"} + ] + } + , "cmd": + [ "sh" + , "-c" + , { "type": "join" + , "separator": " " + , "$1": + [ "cat" + , "guard.def" + , "int1.def" + , "int01.def" + , "cfiles.def" + , "cxxfiles.def" + , "ctypes.def" + , "cxxtypes.def" + , "csymbols.def" + , "cxxsymbols.def" + , "plain.def" + , "end.def" + , ">" + , { "type": "join_cmd" + , "$1": [{"type": "var", "name": "outname"}] + } + ] + } + ] + , "outs": [{"type": "var", "name": "outname"}] + } + ] + , [ "outfile" + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "stage"} + , "flat": true + , "$1": {"type": "var", "name": "outfile"} + } + ] + ] + , "body": + { "type": "RESULT" + , "artifacts": {"type": "var", "name": "outfile"} + , "runfiles": {"type": "var", "name": "outfile"} + } + } + } +} |