diff options
Diffstat (limited to 'rules/CC/foreign/make/EXPRESSIONS')
-rw-r--r-- | rules/CC/foreign/make/EXPRESSIONS | 369 |
1 files changed, 369 insertions, 0 deletions
diff --git a/rules/CC/foreign/make/EXPRESSIONS b/rules/CC/foreign/make/EXPRESSIONS new file mode 100644 index 0000000..d31a2bb --- /dev/null +++ b/rules/CC/foreign/make/EXPRESSIONS @@ -0,0 +1,369 @@ +{ "make-build": + { "vars": + [ "source_dir" + , "subdir" + , "localbase_dir" + , "configure" + , "configure_options" + , "make_targets" + , "make_prefix" + , "make_options" + , "make_jobs" + , "pre_cmds" + , "post_cmds" + , "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "ADD_CFLAGS" + , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" + , "ENV" + , "AR" + , "PREFIX" + , "BUILD_POSITION_INDEPENDENT" + , "TIMEOUT_SCALE" + , "defaults-transition" + , "expand_exec" + ] + , "imports": + { "artifacts": ["", "field_artifacts"] + , "nub_left": ["", "nub_left"] + , "flags-cc": ["CC", "flags-cc"] + , "flags-cxx": ["CC", "flags-cxx"] + , "compiler-cc": ["CC", "compiler-cc"] + , "compiler-cxx": ["CC", "compiler-cxx"] + , "default-LDFLAGS": ["CC", "default-LDFLAGS"] + , "default-AR": ["CC", "default-AR"] + , "default-ENV": ["CC", "default-ENV"] + , "default-PATH": ["CC", "default-PATH"] + , "default-TOOLCHAIN": ["CC", "default-TOOLCHAIN"] + , "default-NON_SYSTEM_TOOLS": ["CC", "default-NON_SYSTEM_TOOLS"] + , "foreign-MAKE": ["CC/foreign", "default-MAKE"] + , "foreign-ENV": ["CC/foreign", "default-ENV"] + , "foreign-PATH": ["CC/foreign", "default-PATH"] + , "foreign-TOOLCHAIN": ["CC/foreign", "default-TOOLCHAIN"] + , "foreign-NON_SYSTEM_TOOLS": ["CC/foreign", "default-NON_SYSTEM_TOOLS"] + } + , "expression": + { "type": "let*" + , "bindings": + [ ["TOOLCHAIN_DIR", "toolchain"] + , [ "TOOLCHAIN" + , { "type": "disjoint_map_union" + , "msg": "Toolchain trees may not overlap" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "foreign-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": "map_union" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "foreign-NON_SYSTEM_TOOLS"} + , {"type": "CALL_EXPRESSION", "name": "default-NON_SYSTEM_TOOLS"} + ] + } + ] + , [ "MAKE" + , { "type": "join" + , "$1": + { "type": "++" + , "$1": + [ { "type": "if" + , "cond": + { "type": "lookup" + , "key": "MAKE" + , "map": {"type": "var", "name": "NON_SYSTEM_TOOLS"} + } + , "then": ["./", {"type": "var", "name": "TOOLCHAIN_DIR"}, "/"] + } + , {"type": "CALL_EXPRESSION", "name": "foreign-MAKE"} + ] + } + } + ] + , ["CC", {"type": "CALL_EXPRESSION", "name": "compiler-cc"}] + , ["CXX", {"type": "CALL_EXPRESSION", "name": "compiler-cxx"}] + , [ "CFLAGS" + , { "type": "join" + , "separator": " " + , "$1": {"type": "CALL_EXPRESSION", "name": "flags-cc"} + } + ] + , [ "CXXFLAGS" + , { "type": "join" + , "separator": " " + , "$1": {"type": "CALL_EXPRESSION", "name": "flags-cxx"} + } + ] + , [ "LDFLAGS" + , { "type": "join" + , "separator": " " + , "$1": + { "type": "++" + , "$1": + [ ["-Wl,-rpath,$ORIGIN", "-Wl,-rpath,$ORIGIN/../lib"] + , { "type": "var" + , "name": "LDFLAGS" + , "default": + {"type": "CALL_EXPRESSION", "name": "default-LDFLAGS"} + } + , {"type": "var", "name": "ldflags", "default": []} + ] + } + } + ] + , [ "AR" + , { "type": "var" + , "name": "AR" + , "default": + { "type": "join" + , "$1": + { "type": "++" + , "$1": + [ { "type": "if" + , "cond": + { "type": "lookup" + , "key": "AR" + , "map": {"type": "var", "name": "NON_SYSTEM_TOOLS"} + } + , "then": + ["./", {"type": "var", "name": "TOOLCHAIN_DIR"}, "/"] + } + , {"type": "CALL_EXPRESSION", "name": "default-AR"} + ] + } + } + } + ] + , [ "PREFIX" + , { "type": "if" + , "cond": {"type": "var", "name": "make_prefix"} + , "then": + { "type": "join" + , "separator": "/" + , "$1": + { "type": "++" + , "$1": [[""], {"type": "var", "name": "make_prefix"}] + } + } + , "else": {"type": "var", "name": "PREFIX", "default": "/"} + } + ] + , [ "PATH" + , { "type": "join" + , "separator": ":" + , "$1": + { "type": "let*" + , "bindings": + [ [ "list" + , { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "foreign-PATH"} + , {"type": "CALL_EXPRESSION", "name": "default-PATH"} + ] + } + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "nub_left"} + } + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + [ { "type": "env" + , "vars": + [ "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "AR" + , "MAKE" + , "PREFIX" + ] + } + , {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , {"type": "CALL_EXPRESSION", "name": "foreign-ENV"} + , {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} + ] + } + ] + , [ "SUBDIR" + , { "type": "join" + , "separator": "/" + , "$1": {"type": "var", "name": "subdir", "default": []} + } + ] + , [ "configure_args" + , { "type": "if" + , "cond": {"type": "var", "name": "configure"} + , "then": + { "type": "++" + , "$1": + [ {"type": "var", "name": "configure_options", "default": []} + , [ { "type": "join" + , "$1": ["--prefix=", {"type": "var", "name": "PREFIX"}] + } + ] + ] + } + } + ] + , [ "make_targets" + , { "type": "if" + , "cond": {"type": "var", "name": "make_targets"} + , "then": {"type": "var", "name": "make_targets"} + , "else": ["install"] + } + ] + , [ "script" + , { "type": "singleton_map" + , "key": "run_make.sh" + , "value": + { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + { "type": "++" + , "$1": + [ [ "set -eu" + , "mkdir scratch" + , "readonly ROOT=\"$(pwd)\"" + , "export TMPDIR=\"$(pwd)/scratch\"" + , "export DESTDIR=\"$(pwd)/install\"" + , "export TOOLCHAIN=\"$(pwd)/toolchain\"" + , "export LOCALBASE=\"$(pwd)/localbase\"" + , "export CC=$([ -x \"${CC}\" ] && realpath ${CC} || echo ${CC})" + , "export CXX=$([ -x \"${CXX}\" ] && realpath ${CXX} || echo ${CXX})" + , "export AR=$([ -x \"${AR}\" ] && realpath ${AR} || echo ${AR})" + , "export MAKE=$([ -x \"${MAKE}\" ] && realpath ${MAKE} || echo ${MAKE})" + , { "type": "join" + , "$1": + [ "export PATH=\"$(./expand_exec TOOLCHAIN -- echo " + , { "type": "join_cmd" + , "$1": [{"type": "var", "name": "PATH"}] + } + , ")\":$PATH" + ] + } + ] + , { "type": "if" + , "cond": {"type": "var", "name": "pre_cmds"} + , "then": + { "type": "++" + , "$1": + [ ["(", "set --", "cd ./source"] + , {"type": "var", "name": "pre_cmds"} + , [")"] + ] + } + } + , ["readonly SUBDIR=\"$1\"", "shift"] + , { "type": "if" + , "cond": {"type": "var", "name": "configure_args"} + , "then": + [ "( cd \"source/${SUBDIR}\"" + , { "type": "join" + , "$1": + [ "${ROOT}/expand_exec TMPDIR DESTDIR LOCALBASE CC CXX CFLAGS CXXFLAGS LDFLAGS AR PREFIX -- ./configure " + , { "type": "join_cmd" + , "$1": {"type": "var", "name": "configure_args"} + } + , " >\"${ROOT}/configure.log\" 2>&1 || (cat \"${ROOT}/configure.log\" && exit 1)" + ] + } + , ")" + ] + } + , { "type": "foreach" + , "range": {"type": "var", "name": "make_targets"} + , "var": "target" + , "body": + { "type": "join" + , "separator": " " + , "$1": + [ "${ROOT}/expand_exec TMPDIR DESTDIR LOCALBASE CC CXX CFLAGS CXXFLAGS LDFLAGS AR PREFIX" + , "--" + , "${MAKE} -C \"source/${SUBDIR}\" DESTDIR=${DESTDIR} \"$@\"" + , { "type": "join_cmd" + , "$1": [{"type": "var", "name": "target"}] + } + , ">>build.log 2>&1 || (cat build.log && exit 1)" + ] + } + } + , [ "mv install install_with_symlinks" + , "cp -rL install_with_symlinks install" + ] + , { "type": "if" + , "cond": {"type": "var", "name": "post_cmds"} + , "then": + { "type": "++" + , "$1": + [ ["(", "set --", "cd ./install"] + , {"type": "var", "name": "post_cmds"} + , [")"] + ] + } + } + ] + } + } + } + } + ] + ] + , "body": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "TOOLCHAIN"} + , {"type": "var", "name": "source_dir"} + , {"type": "var", "name": "expand_exec"} + , { "type": "var" + , "name": "localbase_dir" + , "default": {"type": "empty_map"} + } + , {"type": "var", "name": "script"} + ] + } + , "cmd": + { "type": "++" + , "$1": + [ ["sh", "run_make.sh"] + , [{"type": "var", "name": "SUBDIR"}] + , {"type": "var", "name": "make_options"} + , { "type": "if" + , "cond": {"type": "var", "name": "make_jobs"} + , "then": + [ { "type": "join" + , "$1": + { "type": "++" + , "$1": [["-j"], {"type": "var", "name": "make_jobs"}] + } + } + ] + } + ] + } + , "out_dirs": ["install"] + , "env": {"type": "var", "name": "ENV"} + , "timeout scaling": + {"type": "var", "name": "TIMEOUT_SCALE", "default": 10.0} + } + } + } +} |