diff options
Diffstat (limited to 'CC')
-rw-r--r-- | CC/EXPRESSIONS | 773 | ||||
-rw-r--r-- | CC/RULES | 386 | ||||
-rw-r--r-- | CC/TARGETS | 1 | ||||
-rw-r--r-- | CC/foreign/EXPRESSIONS | 34 | ||||
-rw-r--r-- | CC/foreign/cmake/EXPRESSIONS | 192 | ||||
-rw-r--r-- | CC/foreign/cmake/RULES | 594 | ||||
-rw-r--r-- | CC/foreign/make/EXPRESSIONS | 284 | ||||
-rw-r--r-- | CC/foreign/make/RULES | 676 | ||||
-rw-r--r-- | CC/prebuilt/EXPRESSIONS | 459 | ||||
-rw-r--r-- | CC/prebuilt/RULES | 147 | ||||
-rwxr-xr-x | CC/prebuilt/read_pkgconfig.py | 75 | ||||
-rw-r--r-- | CC/test/RULES | 27 |
12 files changed, 3637 insertions, 11 deletions
diff --git a/CC/EXPRESSIONS b/CC/EXPRESSIONS index 7beac0a..5a425c7 100644 --- a/CC/EXPRESSIONS +++ b/CC/EXPRESSIONS @@ -82,6 +82,21 @@ , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} } } +, "default-LDFLAGS": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "defaults"] + , ["provider", "LDFLAGS"] + , [ "transition" + , {"type": "var", "name": "defaults-transition", "default": null} + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } , "default-ENV": { "vars": ["defaults-transition"] , "imports": {"provider_list": ["./", "..", "field_provider_list"]} @@ -255,6 +270,316 @@ } } } +, "run-libs-deps": + { "doc": ["Collect runtime libraries from given target_fields"] + , "vars": ["deps-fieldnames", "deps-transition"] + , "vars_doc": + { "deps-fieldnames": + ["List of target_field names to collect dependencies from."] + , "deps-transition": + ["The optional configuration transition for the targets."] + } + , "imports": {"provider_list": ["./", "..", "field_provider_list"]} + , "expression": + { "type": "to_subdir" + , "flat": true + , "$1": + { "type": "disjoint_map_union" + , "$1": + { "type": "++" + , "$1": + { "type": "foreach" + , "var": "fieldname" + , "range": {"type": "var", "name": "deps-fieldnames"} + , "body": + { "type": "let*" + , "bindings": + [ ["provider", "run-libs"] + , ["default", {"type": "empty_map"}] + , ["transition", {"type": "var", "name": "deps-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "provider_list"} + } + } + } + } + } + } +, "run-libs-args-deps": + { "doc": + ["Collect runtime libraries link arguments from given target_fields"] + , "vars": ["deps-fieldnames", "deps-transition"] + , "vars_doc": + { "deps-fieldnames": + ["List of target_field names to collect arguments from."] + , "deps-transition": + ["The optional configuration transition for the targets."] + } + , "imports": {"list_provider": ["./", "..", "field_list_provider"]} + , "expression": + { "type": "++" + , "$1": + { "type": "foreach" + , "var": "fieldname" + , "range": {"type": "var", "name": "deps-fieldnames"} + , "body": + { "type": "let*" + , "bindings": + [ ["provider", "run-libs-args"] + , ["transition", {"type": "var", "name": "deps-transition"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } + } + } +, "pkg-map-provider-deps": + { "doc": ["Collect maps from provider \"package\" for given target_fields"] + , "vars": ["pkg-key", "deps-fieldnames", "deps-transition"] + , "vars_doc": + { "pkg-key": ["Key to lookup in provider \"package\"."] + , "deps-fieldnames": ["List of target_field names to collect maps from."] + , "deps-transition": + ["The optional configuration transition for the targets."] + } + , "imports": {"provider_list": ["./", "..", "field_provider_list"]} + , "expression": + { "type": "disjoint_map_union" + , "$1": + { "type": "++" + , "$1": + { "type": "foreach" + , "var": "fieldname" + , "range": {"type": "var", "name": "deps-fieldnames"} + , "body": + { "type": "let*" + , "bindings": + [ ["provider", "package"] + , ["default", {"type": "empty_map"}] + , ["transition", {"type": "var", "name": "deps-transition"}] + ] + , "body": + { "type": "foreach" + , "range": {"type": "CALL_EXPRESSION", "name": "provider_list"} + , "var": "map" + , "body": + { "type": "lookup" + , "key": {"type": "var", "name": "pkg-key"} + , "map": {"type": "var", "name": "map"} + , "default": {"type": "empty_map"} + } + } + } + } + } + } + } +, "cflags-files-deps": + { "doc": ["Collect cflags files from target_fields"] + , "vars": ["deps-fieldnames", "deps-transition"] + , "vars_doc": + { "deps-fieldnames": ["List of target_field names to collect files from."] + , "deps-transition": + ["The optional configuration transition for the targets."] + } + , "imports": {"pkg-provider": "pkg-map-provider-deps"} + , "expression": + { "type": "let*" + , "bindings": [["pkg-key", "cflags-files"]] + , "body": {"type": "CALL_EXPRESSION", "name": "pkg-provider"} + } + } +, "ldflags-files-deps": + { "doc": ["Collect cflags files from target_fields"] + , "vars": ["deps-fieldnames", "deps-transition"] + , "vars_doc": + { "deps-fieldnames": ["List of target_field names to collect files from."] + , "deps-transition": + ["The optional configuration transition for the targets."] + } + , "imports": {"pkg-provider": "pkg-map-provider-deps"} + , "expression": + { "type": "let*" + , "bindings": [["pkg-key", "ldflags-files"]] + , "body": {"type": "CALL_EXPRESSION", "name": "pkg-provider"} + } + } +, "pkg-prefix-lib-paths": + { "doc": ["Detect ldflags referring to local libs and prefix them."] + , "vars": ["pkg-ldflags", "pkg-libs", "flat-libs", "lib-prefix"] + , "imports": {"contains": ["", "contains"]} + , "expression": + { "type": "let*" + , "bindings": + [["list", {"type": "keys", "$1": {"type": "var", "name": "pkg-libs"}}]] + , "body": + { "type": "foreach" + , "var": "item" + , "range": {"type": "var", "name": "pkg-ldflags"} + , "body": + { "type": "if" + , "cond": {"type": "CALL_EXPRESSION", "name": "contains"} + , "then": + { "type": "join" + , "$1": + { "type": "if" + , "cond": {"type": "var", "name": "flat-libs"} + , "then": + [ "-l:" + , {"type": "basename", "$1": {"type": "var", "name": "item"}} + ] + , "else": + [ {"type": "var", "name": "lib-prefix"} + , "/" + , {"type": "var", "name": "item"} + ] + } + } + , "else": {"type": "var", "name": "item"} + } + } + } + } +, "pkg-prefix-flag-paths": + { "doc": ["Detect flags referring to local flag files and prefix them."] + , "vars": ["flags", "pkg-flag-files", "flag-prefix"] + , "imports": {"contains": ["", "contains"]} + , "expression": + { "type": "let*" + , "bindings": + [ [ "list" + , {"type": "keys", "$1": {"type": "var", "name": "pkg-flag-files"}} + ] + , ["list_prefix", "@"] + ] + , "body": + { "type": "foreach" + , "var": "item" + , "range": {"type": "var", "name": "flags"} + , "body": + { "type": "let*" + , "bindings": + [["flag-file", {"type": "CALL_EXPRESSION", "name": "contains"}]] + , "body": + { "type": "if" + , "cond": {"type": "var", "name": "flag-file"} + , "then": + { "type": "join" + , "$1": + [ "@" + , {"type": "var", "name": "flag-prefix"} + , "/" + , {"type": "var", "name": "flag-file"} + ] + } + , "else": {"type": "var", "name": "item"} + } + } + } + } + } +, "pkg-config": + { "vars": + [ "pkg-name" + , "pkg-prefix" + , "pkg-version" + , "pkg-cflags" + , "pkg-ldflags" + , "pkg-flag-files" + , "pkg-libs" + , "flat-libs" + , "pc-install-dir" + ] + , "imports": + { "pkg-prefix-lib-paths": "pkg-prefix-lib-paths" + , "pkg-prefix-flag-paths": "pkg-prefix-flag-paths" + } + , "expression": + { "type": "let*" + , "bindings": + [ ["lib-prefix", "${libdir}"] + , [ "pkg-ldflags" + , {"type": "CALL_EXPRESSION", "name": "pkg-prefix-lib-paths"} + ] + , [ "flag-prefix" + , { "type": "join" + , "$1": ["${prefix}/", {"type": "var", "name": "pc-install-dir"}] + } + ] + , ["flags", {"type": "var", "name": "pkg-cflags"}] + , [ "pkg-cflags" + , {"type": "CALL_EXPRESSION", "name": "pkg-prefix-flag-paths"} + ] + , ["flags", {"type": "var", "name": "pkg-ldflags"}] + , [ "pkg-ldflags" + , {"type": "CALL_EXPRESSION", "name": "pkg-prefix-flag-paths"} + ] + ] + , "body": + { "type": "singleton_map" + , "key": + {"type": "join", "$1": [{"type": "var", "name": "pkg-name"}, ".pc"]} + , "value": + { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + [ { "type": "join" + , "$1": + [ "prefix=" + , {"type": "var", "name": "pkg-prefix", "default": "/"} + ] + } + , "libdir=${prefix}/lib" + , "includedir=${prefix}/include" + , { "type": "join" + , "$1": ["Name: ", {"type": "var", "name": "pkg-name"}] + } + , { "type": "join" + , "$1": + [ "Version: " + , {"type": "var", "name": "pkg-version", "default": "unknown"} + ] + } + , { "type": "join" + , "$1": + [ "Description: Pkg-config for " + , {"type": "var", "name": "pkg-name"} + , ", generated by JustBuild" + ] + } + , "URL: unknown" + , { "type": "join" + , "separator": " " + , "$1": + { "type": "++" + , "$1": + [ ["Cflags:", "-I${includedir}"] + , {"type": "var", "name": "pkg-cflags"} + ] + } + } + , { "type": "join" + , "separator": " " + , "$1": + { "type": "++" + , "$1": + [ ["Libs:"] + , { "type": "if" + , "cond": {"type": "var", "name": "flat-libs"} + , "then": ["-L${libdir}"] + } + , {"type": "var", "name": "pkg-ldflags"} + ] + } + } + ] + } + } + } + } + } , "objects": { "vars": [ "COMPILER" @@ -264,6 +589,7 @@ , "hdrs" , "private-hdrs" , "compile-deps" + , "cflags-files" ] , "expression": { "type": "let*" @@ -317,6 +643,10 @@ , "key": {"type": "var", "name": "work src_name"} , "value": {"type": "var", "name": "src_val"} } + , { "type": "var" + , "name": "cflags-files" + , "default": {"type": "empty_map"} + } ] } ] @@ -403,12 +733,21 @@ } } , "flags-cc": - { "vars": ["CFLAGS", "ADD_CFLAGS", "defaults-transition"] + { "vars": + [ "CFLAGS" + , "ADD_CFLAGS" + , "BUILD_POSITION_INDEPENDENT" + , "defaults-transition" + ] , "imports": {"default-CFLAGS": "default-CFLAGS"} , "expression": { "type": "++" , "$1": - [ { "type": "var" + [ { "type": "if" + , "cond": {"type": "var", "name": "BUILD_POSITION_INDEPENDENT"} + , "then": ["-fPIC"] + } + , { "type": "var" , "name": "CFLAGS" , "default": {"type": "CALL_EXPRESSION", "name": "default-CFLAGS"} } @@ -417,12 +756,21 @@ } } , "flags-cxx": - { "vars": ["CXXFLAGS", "ADD_CXXFLAGS", "defaults-transition"] + { "vars": + [ "CXXFLAGS" + , "ADD_CXXFLAGS" + , "BUILD_POSITION_INDEPENDENT" + , "defaults-transition" + ] , "imports": {"default-CXXFLAGS": "default-CXXFLAGS"} , "expression": { "type": "++" , "$1": - [ { "type": "var" + [ { "type": "if" + , "cond": {"type": "var", "name": "BUILD_POSITION_INDEPENDENT"} + , "then": ["-fPIC"] + } + , { "type": "var" , "name": "CXXFLAGS" , "default": {"type": "CALL_EXPRESSION", "name": "default-CXXFLAGS"} } @@ -436,6 +784,7 @@ , "CXXFLAGS" , "ADD_CFLAGS" , "ADD_CXXFLAGS" + , "BUILD_POSITION_INDEPENDENT" , "pure C" , "defaults-transition" ] @@ -457,6 +806,7 @@ , "ADD_CXXFLAGS" , "AR" , "ENV" + , "BUILD_POSITION_INDEPENDENT" , "name" , "pure C" , "srcs" @@ -465,6 +815,7 @@ , "stage" , "compile-deps" , "compile-args" + , "cflags-files" , "defaults-transition" ] , "imports": @@ -575,6 +926,7 @@ , "ADD_CXXFLAGS" , "AR" , "ENV" + , "BUILD_POSITION_INDEPENDENT" , "name" , "pure C" , "srcs" @@ -582,8 +934,10 @@ , "private-hdrs" , "cflags" , "private-cflags" + , "ldflags" , "private-ldflags" , "stage" + , "pkg-name" , "extra-provides" , "public-fieldnames" , "private-fieldnames" @@ -593,6 +947,10 @@ , "compile-args-deps": "compile-args-deps" , "link-deps": "link-deps" , "link-args-deps": "link-args-deps" + , "run-libs-deps": "run-libs-deps" + , "run-libs-args-deps": "run-libs-args-deps" + , "cflags-files-deps": "cflags-files-deps" + , "ldflags-files-deps": "ldflags-files-deps" , "lib artifact": "lib artifact" } , "expression": @@ -612,6 +970,9 @@ } } ] + , [ "cflags-files" + , {"type": "CALL_EXPRESSION", "name": "cflags-files-deps"} + ] , ["link-deps", {"type": "CALL_EXPRESSION", "name": "link-deps"}] , ["lib", {"type": "CALL_EXPRESSION", "name": "lib artifact"}] , [ "link-args" @@ -620,12 +981,22 @@ { "type": "++" , "$1": [ {"type": "keys", "$1": {"type": "var", "name": "lib"}} + , {"type": "var", "name": "ldflags", "default": []} , {"type": "var", "name": "private-ldflags", "default": []} , {"type": "CALL_EXPRESSION", "name": "link-args-deps"} ] } } ] + , ["run-libs", {"type": "CALL_EXPRESSION", "name": "run-libs-deps"}] + , [ "run-libs-args" + , { "type": "nub_right" + , "$1": {"type": "CALL_EXPRESSION", "name": "run-libs-args-deps"} + } + ] + , [ "ldflags-files" + , {"type": "CALL_EXPRESSION", "name": "ldflags-files-deps"} + ] , ["deps-fieldnames", {"type": "var", "name": "public-fieldnames"}] , ["compile-deps", {"type": "CALL_EXPRESSION", "name": "compile-deps"}] , [ "compile-args" @@ -639,6 +1010,16 @@ } } ] + , [ "cflags-files" + , {"type": "CALL_EXPRESSION", "name": "cflags-files-deps"} + ] + , [ "package" + , { "type": "let*" + , "bindings": [["name", {"type": "var", "name": "pkg-name"}]] + , "body": + {"type": "env", "vars": ["name", "cflags-files", "ldflags-files"]} + } + ] ] , "body": { "type": "RESULT" @@ -649,7 +1030,337 @@ , "$1": [ { "type": "env" , "vars": - ["compile-deps", "compile-args", "link-deps", "link-args"] + [ "compile-deps" + , "compile-args" + , "link-deps" + , "link-args" + , "run-libs" + , "run-libs-args" + , "package" + ] + } + , { "type": "var" + , "name": "extra-provides" + , "default": {"type": "empty_map"} + } + ] + } + } + } + } +, "shared artifact": + { "vars": + [ "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "ADD_CFLAGS" + , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" + , "ENV" + , "name" + , "pure C" + , "srcs" + , "hdrs" + , "private-hdrs" + , "soversion" + , "compile-deps" + , "compile-args" + , "link-deps" + , "link-args" + , "run-libs" + , "run-libs-args" + , "cflags-files" + , "ldflags-files" + , "defaults-transition" + ] + , "imports": + { "compiler": "compiler" + , "flags": "flags" + , "objects": "objects" + , "default-LDFLAGS": "default-LDFLAGS" + , "default-ENV": "default-ENV" + } + , "expression": + { "type": "let*" + , "bindings": + [ ["BUILD_POSITION_INDEPENDENT", true] + , ["COMPILER", {"type": "CALL_EXPRESSION", "name": "compiler"}] + , [ "COMPILE_FLAGS" + , { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "flags"} + , {"type": "var", "name": "compile-args"} + ] + } + ] + , [ "LDFLAGS" + , { "type": "++" + , "$1": + [ { "type": "var" + , "name": "LDFLAGS" + , "default": + {"type": "CALL_EXPRESSION", "name": "default-LDFLAGS"} + } + , {"type": "var", "name": "ADD_LDFLAGS", "default": []} + ] + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , [ { "type": "var" + , "name": "ENV" + , "default": {"type": "empty_map"} + } + ] + ] + } + } + ] + , ["objects", {"type": "CALL_EXPRESSION", "name": "objects"}] + , [ "base name" + , { "type": "if" + , "cond": {"type": "var", "name": "objects"} + , "then": + { "type": "assert_non_empty" + , "msg": "A name has to be provided for non-header-only libraries" + , "$1": {"type": "var", "name": "name"} + } + , "else": {"type": "var", "name": "name"} + } + ] + , [ "libname" + , { "type": "join" + , "$1": ["lib", {"type": "var", "name": "base name"}, ".so"] + } + ] + , [ "libname" + , { "type": "join" + , "separator": "." + , "$1": + { "type": "++" + , "$1": + [ [{"type": "var", "name": "libname"}] + , {"type": "var", "name": "soversion"} + ] + } + } + ] + , [ "lib" + , { "type": "if" + , "cond": {"type": "var", "name": "objects"} + , "else": {"type": "empty_map"} + , "then": + { "type": "ACTION" + , "outs": [{"type": "var", "name": "libname"}] + , "inputs": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "objects"} + , {"type": "var", "name": "link-deps"} + , {"type": "var", "name": "run-libs"} + , { "type": "var" + , "name": "cflags-files" + , "default": {"type": "empty_map"} + } + , { "type": "var" + , "name": "ldflags-files" + , "default": {"type": "empty_map"} + } + ] + } + , "env": + {"type": "var", "name": "ENV", "default": {"type": "empty_map"}} + , "cmd": + { "type": "++" + , "$1": + [ [ {"type": "var", "name": "COMPILER"} + , "-shared" + , "-Wl,-rpath,$ORIGIN" + , "-Wl,-rpath,$ORIGIN/../lib" + , { "type": "join" + , "$1": + ["-Wl,-soname,", {"type": "var", "name": "libname"}] + } + ] + , {"type": "var", "name": "COMPILE_FLAGS"} + , {"type": "var", "name": "LDFLAGS"} + , ["-o", {"type": "var", "name": "libname"}] + , {"type": "keys", "$1": {"type": "var", "name": "objects"}} + , {"type": "var", "name": "link-args"} + , {"type": "var", "name": "run-libs-args"} + ] + } + } + } + ] + ] + , "body": {"type": "var", "name": "lib"} + } + } +, "shared result": + { "vars": + [ "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "ADD_CXXFLAGS" + , "ADD_CFLAGS" + , "ADD_LDFLAGS" + , "ENV" + , "name" + , "pure C" + , "srcs" + , "hdrs" + , "private-hdrs" + , "cflags" + , "private-cflags" + , "ldflags" + , "private-ldflags" + , "soversion" + , "pkg-name" + , "extra-provides" + , "deps-transition" + , "public-fieldnames" + , "private-fieldnames" + ] + , "imports": + { "compile-deps": "compile-deps" + , "compile-args-deps": "compile-args-deps" + , "link-deps": "link-deps" + , "link-args-deps": "link-args-deps" + , "run-libs-deps": "run-libs-deps" + , "run-libs-args-deps": "run-libs-args-deps" + , "cflags-files-deps": "cflags-files-deps" + , "ldflags-files-deps": "ldflags-files-deps" + , "shared artifact": "shared artifact" + } + , "expression": + { "type": "let*" + , "bindings": + [ ["deps-fieldnames", {"type": "var", "name": "private-fieldnames"}] + , ["compile-deps", {"type": "CALL_EXPRESSION", "name": "compile-deps"}] + , [ "compile-args" + , { "type": "nub_right" + , "$1": + { "type": "++" + , "$1": + [ {"type": "var", "name": "cflags"} + , {"type": "var", "name": "private-cflags"} + , {"type": "CALL_EXPRESSION", "name": "compile-args-deps"} + ] + } + } + ] + , [ "cflags-files" + , {"type": "CALL_EXPRESSION", "name": "cflags-files-deps"} + ] + , ["link-deps", {"type": "CALL_EXPRESSION", "name": "link-deps"}] + , ["link-args", {"type": "CALL_EXPRESSION", "name": "link-args-deps"}] + , ["run-libs", {"type": "CALL_EXPRESSION", "name": "run-libs-deps"}] + , [ "run-libs-args" + , { "type": "nub_right" + , "$1": + { "type": "++" + , "$1": + [ {"type": "var", "name": "ldflags", "default": []} + , {"type": "var", "name": "private-ldflags", "default": []} + , {"type": "CALL_EXPRESSION", "name": "run-libs-args-deps"} + ] + } + } + ] + , [ "ldflags-files" + , {"type": "CALL_EXPRESSION", "name": "ldflags-files-deps"} + ] + , ["lib", {"type": "CALL_EXPRESSION", "name": "shared artifact"}] + , ["deps-fieldnames", {"type": "var", "name": "public-fieldnames"}] + , ["compile-deps", {"type": "CALL_EXPRESSION", "name": "compile-deps"}] + , [ "compile-args" + , { "type": "nub_right" + , "$1": + { "type": "++" + , "$1": + [ {"type": "var", "name": "cflags"} + , {"type": "CALL_EXPRESSION", "name": "compile-args-deps"} + ] + } + } + ] + , [ "cflags-files" + , {"type": "CALL_EXPRESSION", "name": "cflags-files-deps"} + ] + , ["link-deps", {"type": "CALL_EXPRESSION", "name": "link-deps"}] + , ["link-args", {"type": "CALL_EXPRESSION", "name": "link-args-deps"}] + , [ "run-libs" + , { "type": "map_union" + , "$1": + [ {"type": "var", "name": "lib"} + , {"type": "var", "name": "run-libs"} + ] + } + ] + , [ "run-libs-args" + , { "type": "nub_right" + , "$1": + { "type": "++" + , "$1": + [ {"type": "keys", "$1": {"type": "var", "name": "lib"}} + , {"type": "var", "name": "ldflags", "default": []} + , {"type": "CALL_EXPRESSION", "name": "run-libs-args-deps"} + ] + } + } + ] + , [ "ldflags-files" + , {"type": "CALL_EXPRESSION", "name": "ldflags-files-deps"} + ] + , [ "package" + , { "type": "let*" + , "bindings": + [ ["name", {"type": "var", "name": "pkg-name"}] + , [ "version" + , { "type": "if" + , "cond": {"type": "var", "name": "soversion"} + , "then": + { "type": "join" + , "separator": "." + , "$1": {"type": "var", "name": "soversion"} + } + , "else": null + } + ] + ] + , "body": + { "type": "env" + , "vars": ["name", "version", "cflags-files", "ldflags-files"] + } + } + ] + ] + , "body": + { "type": "RESULT" + , "artifacts": {"type": "var", "name": "lib"} + , "runfiles": {"type": "var", "name": "hdrs"} + , "provides": + { "type": "map_union" + , "$1": + [ { "type": "env" + , "vars": + [ "compile-deps" + , "compile-args" + , "link-deps" + , "link-args" + , "run-libs" + , "run-libs-args" + , "package" + ] } , { "type": "var" , "name": "extra-provides" @@ -667,9 +1378,12 @@ , "CXX" , "CFLAGS" , "CXXFLAGS" + , "LDFLAGS" , "ADD_CFLAGS" , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" , "ENV" + , "BUILD_POSITION_INDEPENDENT" , "name" , "pure C" , "srcs" @@ -679,6 +1393,10 @@ , "compile-args" , "link-deps" , "link-args" + , "run-libs" + , "run-libs-args" + , "cflags-files" + , "ldflags-files" , "defaults-transition" ] , "imports": @@ -686,6 +1404,7 @@ , "flags": "flags" , "objects": "objects" , "default-ENV": "default-ENV" + , "default-LDFLAGS": "default-LDFLAGS" } , "expression": { "type": "let*" @@ -699,6 +1418,18 @@ ] } ] + , [ "LDFLAGS" + , { "type": "++" + , "$1": + [ { "type": "var" + , "name": "LDFLAGS" + , "default": + {"type": "CALL_EXPRESSION", "name": "default-LDFLAGS"} + } + , {"type": "var", "name": "ADD_LDFLAGS", "default": []} + ] + } + ] , [ "ENV" , { "type": "map_union" , "$1": @@ -749,17 +1480,30 @@ , "$1": [ {"type": "var", "name": "objects"} , {"type": "var", "name": "link-deps"} + , {"type": "var", "name": "run-libs"} + , { "type": "var" + , "name": "cflags-files" + , "default": {"type": "empty_map"} + } + , { "type": "var" + , "name": "ldflags-files" + , "default": {"type": "empty_map"} + } ] } , "cmd": { "type": "++" , "$1": [ [ {"type": "var", "name": "COMPILER"} + , "-Wl,-rpath,$ORIGIN" + , "-Wl,-rpath,$ORIGIN/../lib" , "-o" , {"type": "var", "name": "binpath"} ] , {"type": "var", "name": "COMPILE_FLAGS"} + , {"type": "var", "name": "LDFLAGS"} , {"type": "var", "name": "link-args"} + , {"type": "var", "name": "run-libs-args"} ] } , "env": {"type": "var", "name": "ENV"} @@ -776,9 +1520,12 @@ , "CXX" , "CFLAGS" , "CXXFLAGS" + , "LDFLAGS" , "ADD_CFLAGS" , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" , "ENV" + , "BUILD_POSITION_INDEPENDENT" , "name" , "pure C" , "srcs" @@ -793,6 +1540,10 @@ , "compile-args-deps": "compile-args-deps" , "link-deps": "link-deps" , "link-args-deps": "link-args-deps" + , "run-libs-deps": "run-libs-deps" + , "run-libs-args-deps": "run-libs-args-deps" + , "cflags-files-deps": "cflags-files-deps" + , "ldflags-files-deps": "ldflags-files-deps" , "binary": "bin artifact" } , "expression": @@ -820,10 +1571,22 @@ } } ] + , ["run-libs", {"type": "CALL_EXPRESSION", "name": "run-libs-deps"}] + , [ "run-libs-args" + , {"type": "CALL_EXPRESSION", "name": "run-libs-args-deps"} + ] + , [ "cflags-files" + , {"type": "CALL_EXPRESSION", "name": "cflags-files-deps"} + ] + , [ "ldflags-files" + , {"type": "CALL_EXPRESSION", "name": "ldflags-files-deps"} + ] + , ["package", {"type": "singleton_map", "key": "to_bin", "value": true}] ] , "body": { "type": "RESULT" , "artifacts": {"type": "CALL_EXPRESSION", "name": "binary"} + , "provides": {"type": "env", "vars": ["run-libs", "package"]} } } } @@ -12,8 +12,10 @@ , "CXX" , "CFLAGS" , "CXXFLAGS" + , "LDFLAGS" , "ADD_CFLAGS" , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" , "AR" , "PATH" ] @@ -25,6 +27,7 @@ , ["CXX", {"type": "FIELD", "name": "CXX"}] , ["CFLAGS", {"type": "FIELD", "name": "CFLAGS"}] , ["CXXFLAGS", {"type": "FIELD", "name": "CXXFLAGS"}] + , ["LDFLAGS", {"type": "FIELD", "name": "LDFLAGS"}] , ["AR", {"type": "FIELD", "name": "AR"}] , ["PATH", {"type": "FIELD", "name": "PATH"}] , ["provider", "CC"] @@ -99,12 +102,20 @@ ] } ] + , [ "LDFLAGS" + , { "type": "++" + , "$1": + [ {"type": "var", "name": "LDFLAGS"} + , {"type": "FIELD", "name": "ADD_LDFLAGS"} + ] + } + ] ] , "body": { "type": "RESULT" , "provides": { "type": "env" - , "vars": ["CC", "CXX", "CFLAGS", "CXXFLAGS", "AR", "ENV"] + , "vars": ["CC", "CXX", "CFLAGS", "CXXFLAGS", "LDFLAGS", "AR", "ENV"] } } } @@ -112,7 +123,14 @@ , "library": { "doc": ["A C++ library"] , "target_fields": - ["srcs", "hdrs", "private-hdrs", "deps", "private-deps", "proto"] + [ "srcs" + , "hdrs" + , "private-hdrs" + , "deps" + , "private-deps" + , "proto" + , "private-proto" + ] , "string_fields": [ "name" , "stage" @@ -121,17 +139,24 @@ , "private-defines" , "cflags" , "private-cflags" + , "ldflags" , "private-ldflags" + , "soversion" + , "pkg-name" ] + , "config_fields": ["shared"] , "config_vars": [ "CC" , "CXX" , "CFLAGS" , "CXXFLAGS" + , "LDFLAGS" , "ADD_CFLAGS" , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" , "AR" , "ENV" + , "BUILD_POSITION_INDEPENDENT" ] , "implicit": {"defaults": ["defaults"]} , "field_doc": @@ -165,6 +190,11 @@ ["List of compile flags set for this target and its consumers."] , "private-cflags": ["List of compile flags set for source files local to this target."] + , "ldflags": + [ "Additional linker flags for linking external libraries for this" + , "target and its consumers (not built by this tool, typically system" + , "libraries)." + ] , "private-ldflags": [ "Additional linker flags for linking external libraries (not built" , "by this tool, typically system libraries)." @@ -181,6 +211,22 @@ , "duplicate work will be carried out, even if the same proto library" , "is used at various places)." ] + , "private-proto": + [ "Any [\"proto\", \"library\"] this target depends upon privately." + , "The creation of C++ bindings for this proto library as well as of" + , "its dependencies will be taken care of (as anonymous targets, so no" + , "duplicate work will be carried out, even if the same proto library" + , "is used at various places)." + ] + , "shared": ["If non-empty, produce a shared instead of a static library."] + , "soversion": + [ "The SOVERSION for shared libraries. Individual version components are" + , "joined with \".\"." + ] + , "pkg-name": + [ "Name to use for pkg-config files. If this field is empty, the field" + , "\"name\" is used instead." + ] } , "config_doc": { "CC": @@ -203,6 +249,12 @@ , "adapting the default target [\"CC\", \"defaults\"] is the better" , "choice." ] + , "LDFLAGS": + [ "The linker flags to be used instead of the default ones." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] , "ADD_CFLAGS": [ "The flags to add to the default ones for CC." , "For libraries that should be built in a non-standard way; usually" @@ -215,11 +267,18 @@ , "adapting the default target [\"CC\", \"defaults\"] is the better" , "choice." ] + , "ADD_LDFLAGS": + [ "The linker flags to add to the default ones." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] , "AR": [ "The archive tool to used for creating the library" , "If None, the respective value from [\"CC\", \"defaults\"] will be taken." ] , "ENV": ["The environment for any action generated."] + , "BUILD_POSITION_INDEPENDENT": ["Build with -fPIC."] } , "artifacts_doc": ["The actual library (libname.a) staged in the specified directory"] @@ -247,9 +306,28 @@ , "service library": ["./", "proto", "service library"] } } + , "private-proto-deps": + { "target": "private-proto" + , "provider": "proto" + , "rule_map": + { "library": ["./", "proto", "library"] + , "service library": ["./", "proto", "service library"] + } + } } , "imports": - {"artifacts": ["./", "..", "field_artifacts"], "result": "lib result"} + { "artifacts": ["./", "..", "field_artifacts"] + , "static result": "lib result" + , "shared result": "shared result" + , "fPIC transition": ["transitions", "with fPIC"] + } + , "config_transitions": + { "deps": [{"type": "CALL_EXPRESSION", "name": "fPIC transition"}] + , "private-deps": [{"type": "CALL_EXPRESSION", "name": "fPIC transition"}] + , "proto-deps": [{"type": "CALL_EXPRESSION", "name": "fPIC transition"}] + , "private-proto-deps": + [{"type": "CALL_EXPRESSION", "name": "fPIC transition"}] + } , "expression": { "type": "let*" , "bindings": @@ -317,11 +395,31 @@ } } ] + , ["ldflags", {"type": "FIELD", "name": "ldflags"}] , ["private-ldflags", {"type": "FIELD", "name": "private-ldflags"}] + , ["soversion", {"type": "FIELD", "name": "soversion"}] + , [ "pkg-name" + , { "type": "if" + , "cond": {"type": "FIELD", "name": "pkg-name"} + , "then": + {"type": "join", "$1": {"type": "FIELD", "name": "pkg-name"}} + , "else": {"type": "var", "name": "name"} + } + ] + , [ "deps-transition" + , {"type": "CALL_EXPRESSION", "name": "fPIC transition"} + ] , ["public-fieldnames", ["deps", "proto-deps"]] - , ["private-fieldnames", ["deps", "private-deps", "proto-deps"]] + , [ "private-fieldnames" + , ["deps", "private-deps", "proto-deps", "private-proto-deps"] + ] ] - , "body": {"type": "CALL_EXPRESSION", "name": "result"} + , "body": + { "type": "if" + , "cond": {"type": "FIELD", "name": "shared"} + , "then": {"type": "CALL_EXPRESSION", "name": "shared result"} + , "else": {"type": "CALL_EXPRESSION", "name": "static result"} + } } } , "binary": @@ -336,7 +434,17 @@ , "private-ldflags" ] , "config_vars": - ["CC", "CXX", "CFLAGS", "CXXFLAGS", "ADD_CFLAGS", "ADD_CXXFLAGS", "ENV"] + [ "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "ADD_CFLAGS" + , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" + , "ENV" + , "BUILD_POSITION_INDEPENDENT" + ] , "implicit": {"defaults": ["defaults"]} , "field_doc": { "name": ["The name of the binary"] @@ -383,6 +491,10 @@ [ "The flags for CXX to be used instead of the default ones" , "taken from the [\"CC\", \"defaults\"] target" ] + , "LDFLAGS": + [ "The linker flags do 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" @@ -391,7 +503,12 @@ [ "The flags to add to the default ones for CXX" , "taken from the [\"CC\", \"defaults\"] target" ] + , "ADD_LDFLAGS": + [ "The linker flags to add to the default ones" + , "taken from the [\"CC\", \"defaults\"] target" + ] , "ENV": ["The environment for any action generated."] + , "BUILD_POSITION_INDEPENDENT": ["Build with -fPIC."] } , "artifacts_doc": ["The final binary, staged to the given directory"] , "runfiles_doc": ["None"] @@ -462,4 +579,261 @@ , "body": {"type": "CALL_EXPRESSION", "name": "bin result"} } } +, "install-with-deps": + { "doc": + [ "Install target's artifacts with transitive dependencies. Depending on" + , "the target, artifacts and dependencies will be installed to" + , "subdirectories \"bin\", \"include\", and \"lib\". For library targets," + , "a pkg-config file is generated and provided in \"share/pkgconfig\"." + ] + , "config_vars": ["PREFIX"] + , "target_fields": ["targets"] + , "string_fields": ["flat-libs", "prefix"] + , "imports": + { "compile-deps": "compile-deps" + , "compile-args-deps": "compile-args-deps" + , "link-deps": "link-deps" + , "link-args-deps": "link-args-deps" + , "run-libs-deps": "run-libs-deps" + , "run-libs-args-deps": "run-libs-args-deps" + , "pkg-config": "pkg-config" + } + , "field_doc": + { "targets": ["Targets to install artifacts from."] + , "flat-libs": + [ "Install libraries flat to the \"lib\" subdirectory. Be aware that" + , "conflicts may occur if any of the (transitive) libraries happen to" + , "have the same base name." + ] + , "prefix": + [ "The prefix used for pkg-config files. The path will be made absolute" + , "and individual directory components are joined with \"/\". If no" + , "prefix is specified, the value from the config variable \"PREFIX\" is" + , "taken, with the default value being \"/\"." + ] + } + , "config_doc": + { "PREFIX": + [ "The absolute path that is used as prefix inside generated pkg-config" + , "files. The default value for this variable is \"/\". This variable" + , "is ignored if the field \"prefix\" is set." + ] + } + , "artifacts_doc": + ["Installed artifacts in subdirectories (\"bin\"/\"include\"/\"lib\")."] + , "expression": + { "type": "let*" + , "bindings": + [ ["pc-install-dir", "share/pkgconfig"] + , [ "install-stage" + , { "type": "disjoint_map_union" + , "msg": "install stages may not overlap" + , "$1": + { "type": "foreach" + , "var": "target" + , "range": {"type": "FIELD", "name": "targets"} + , "body": + { "type": "let*" + , "bindings": + [ [ "artifacts" + , { "type": "DEP_ARTIFACTS" + , "dep": {"type": "var", "name": "target"} + , "default": {"type": "empty_map"} + } + ] + , [ "runfiles" + , { "type": "DEP_RUNFILES" + , "dep": {"type": "var", "name": "target"} + , "default": {"type": "empty_map"} + } + ] + , [ "compile-deps" + , { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "compile-deps" + , "default": {"type": "empty_map"} + } + ] + , [ "link-deps" + , { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "link-deps" + , "default": {"type": "empty_map"} + } + ] + , [ "run-libs" + , { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "run-libs" + , "default": {"type": "empty_map"} + } + ] + , [ "package" + , { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "package" + , "default": {"type": "empty_map"} + } + ] + , [ "to_bin" + , { "type": "lookup" + , "key": "to_bin" + , "map": {"type": "var", "name": "package"} + } + ] + , [ "binaries" + , { "type": "if" + , "cond": {"type": "var", "name": "to_bin"} + , "then": {"type": "var", "name": "artifacts"} + , "else": {"type": "empty_map"} + } + ] + , [ "headers" + , { "type": "disjoint_map_union" + , "msg": "headers may not overlap" + , "$1": + [ {"type": "var", "name": "runfiles"} + , {"type": "var", "name": "compile-deps"} + ] + } + ] + , [ "libraries" + , { "type": "disjoint_map_union" + , "msg": "libraries may not overlap" + , "$1": + { "type": "++" + , "$1": + [ { "type": "if" + , "cond": {"type": "var", "name": "to_bin"} + , "then": [] + , "else": [{"type": "var", "name": "artifacts"}] + } + , [{"type": "var", "name": "link-deps"}] + , [{"type": "var", "name": "run-libs"}] + ] + } + } + ] + , [ "pkg-name" + , { "type": "lookup" + , "key": "name" + , "map": {"type": "var", "name": "package"} + } + ] + , [ "pkg-config" + , { "type": "if" + , "cond": {"type": "var", "name": "pkg-name"} + , "then": + { "type": "let*" + , "bindings": + [ [ "pkg-prefix" + , { "type": "if" + , "cond": {"type": "FIELD", "name": "prefix"} + , "then": + { "type": "join" + , "separator": "/" + , "$1": + { "type": "++" + , "$1": + [[""], {"type": "FIELD", "name": "prefix"}] + } + } + , "else": + {"type": "var", "name": "PREFIX", "default": "/"} + } + ] + , [ "pkg-version" + , { "type": "lookup" + , "key": "version" + , "map": {"type": "var", "name": "package"} + } + ] + , [ "pkg-cflags" + , { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "compile-args" + , "default": [] + } + ] + , [ "pkg-ldflags" + , { "type": "++" + , "$1": + [ { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "link-args" + , "default": [] + } + , { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "target"} + , "provider": "run-libs-args" + , "default": [] + } + ] + } + ] + , [ "pkg-flag-files" + , { "type": "map_union" + , "$1": + [ { "type": "lookup" + , "key": "cflags-files" + , "map": {"type": "var", "name": "package"} + , "default": {"type": "empty_map"} + } + , { "type": "lookup" + , "key": "ldflags-files" + , "map": {"type": "var", "name": "package"} + , "default": {"type": "empty_map"} + } + ] + } + ] + , ["pkg-libs", {"type": "var", "name": "libraries"}] + , ["flat-libs", {"type": "FIELD", "name": "flat-libs"}] + ] + , "body": + { "type": "map_union" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "pkg-config"} + , {"type": "var", "name": "pkg-flag-files"} + ] + } + } + , "else": {"type": "empty_map"} + } + ] + ] + , "body": + { "type": "map_union" + , "$1": + [ { "type": "to_subdir" + , "subdir": "bin" + , "flat": true + , "msg": "install binaries may not overlap" + , "$1": {"type": "var", "name": "binaries"} + } + , { "type": "to_subdir" + , "subdir": "include" + , "$1": {"type": "var", "name": "headers"} + } + , { "type": "to_subdir" + , "subdir": "lib" + , "flat": {"type": "FIELD", "name": "flat-libs"} + , "msg": "install libraries may not overlap" + , "$1": {"type": "var", "name": "libraries"} + } + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "pc-install-dir"} + , "$1": {"type": "var", "name": "pkg-config"} + } + ] + } + } + } + } + ] + ] + , "body": + {"type": "RESULT", "artifacts": {"type": "var", "name": "install-stage"}} + } + } } @@ -4,6 +4,7 @@ , "CXX": ["c++"] , "CFLAGS": [] , "CXXFLAGS": [] + , "LDFLAGS": [] , "AR": ["ar"] , "PATH": ["/bin", "/usr/bin"] } diff --git a/CC/foreign/EXPRESSIONS b/CC/foreign/EXPRESSIONS new file mode 100644 index 0000000..2cc1ac9 --- /dev/null +++ b/CC/foreign/EXPRESSIONS @@ -0,0 +1,34 @@ +{ "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"} + } + } + } + } +} diff --git a/CC/foreign/cmake/EXPRESSIONS b/CC/foreign/cmake/EXPRESSIONS new file mode 100644 index 0000000..4dfcc07 --- /dev/null +++ b/CC/foreign/cmake/EXPRESSIONS @@ -0,0 +1,192 @@ +{ "cmake-build": + { "vars": + [ "source_dir" + , "cmake_options" + , "cmake_defines" + , "cmake_jobs" + , "pre_cmds" + , "post_cmds" + , "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "ADD_CFLAGS" + , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" + , "ENV" + , "AR" + , "BUILD_POSITION_INDEPENDENT" + ] + , "imports": + { "artifacts": ["", "field_artifacts"] + , "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"] + } + , "expression": + { "type": "let*" + , "bindings": + [ [ "CMAKE_FLAGS" + , { "type": "++" + , "$1": + [ { "type": "foreach" + , "var": "define" + , "range": {"type": "var", "name": "cmake_defines"} + , "body": + { "type": "join" + , "$1": ["-D", {"type": "var", "name": "define"}] + } + } + , {"type": "var", "name": "cmake_options"} + , { "type": "if" + , "cond": {"type": "var", "name": "BUILD_POSITION_INDEPENDENT"} + , "then": ["-DCMAKE_POSITION_INDEPENDENT_CODE=ON"] + } + ] + } + ] + , ["BUILD_POSITION_INDEPENDENT", null] + , ["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": + [ { "type": "var" + , "name": "LDFLAGS" + , "default": + {"type": "CALL_EXPRESSION", "name": "default-LDFLAGS"} + } + , {"type": "var", "name": "ldflags", "default": []} + ] + } + } + ] + , [ "CMAKE_BUILD_PARALLEL_LEVEL" + , { "type": "join" + , "$1": {"type": "var", "name": "cmake_jobs", "default": []} + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , [ { "type": "var" + , "name": "ENV" + , "default": {"type": "empty_map"} + } + ] + , [ { "type": "env" + , "vars": + [ "CC" + , "CXX" + , "CXXFLAGS" + , "CFLAGS" + , "LDFLAGS" + , "CMAKE_BUILD_PARALLEL_LEVEL" + ] + } + ] + ] + } + } + ] + , [ "AR" + , { "type": "var" + , "name": "AR" + , "default": {"type": "CALL_EXPRESSION", "name": "default-AR"} + } + ] + , [ "script" + , { "type": "singleton_map" + , "key": "run_cmake.sh" + , "value": + { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + { "type": "++" + , "$1": + [ [ "set -eu" + , "mkdir scratch" + , "readonly TMPDIR=\"$(pwd)/scratch\"" + ] + , { "type": "if" + , "cond": {"type": "var", "name": "pre_cmds"} + , "then": + { "type": "++" + , "$1": + [ ["(", "set --", "cd ./source"] + , {"type": "var", "name": "pre_cmds"} + , [")"] + ] + } + } + , [ "readonly CMAKE_AR=$(which $1)" + , "shift" + , "cmake \"$@\" -Ssource -Bbuild -DCMAKE_AR=${CMAKE_AR} -DCMAKE_INSTALL_PREFIX=./install >configure.log || (cat configure.log && exit 1)" + , "cmake --build build --target install >build.log || (cat configure.log build.log && exit 1)" + , "find ./install -type l -delete" + ] + , { "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": "source_dir"} + , {"type": "var", "name": "script"} + ] + } + , "cmd": + { "type": "++" + , "$1": + [ ["/bin/sh", "run_cmake.sh", {"type": "var", "name": "AR"}] + , {"type": "var", "name": "CMAKE_FLAGS"} + ] + } + , "out_dirs": ["install"] + , "env": {"type": "var", "name": "ENV"} + } + } + } +} diff --git a/CC/foreign/cmake/RULES b/CC/foreign/cmake/RULES new file mode 100644 index 0000000..8e8b934 --- /dev/null +++ b/CC/foreign/cmake/RULES @@ -0,0 +1,594 @@ +{ "data": + { "doc": ["Data produced by CMake configure, build, and install."] + , "target_fields": ["project"] + , "string_fields": + [ "options" + , "defines" + , "jobs" + , "pre_cmds" + , "post_cmds" + , "out_files" + , "out_dirs" + ] + , "config_vars": + [ "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "ADD_CFLAGS" + , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" + , "ENV" + , "AR" + , "BUILD_POSITION_INDEPENDENT" + ] + , "implicit": {"defaults": [["CC", "defaults"]]} + , "field_doc": + { "project": + ["The CMake project directory. It should contain a single tree artifact"] + , "options": + [ "CMake options for the configuration phase." + , "(e.g., [\"-GNinja\", \"-Ax64\"])" + ] + , "defines": + [ "CMake defines for the configuration phase." + , "(e.g., [\"CMAKE_BUILD_TYPE=Release\"])" + ] + , "jobs": + [ "Number of jobs to run simultaneously. If omitted, CMake's default" + , "number is used." + ] + , "pre_cmds": + [ "List of commands executed in the project directory before calling" + , "CMake. Useful for renaming files or directories. Note that data" + , "between \"pre_cmds\" and \"post_cmds\" can be exchanged via $TMPDIR," + , "which is uniquely reserved for this action." + ] + , "post_cmds": + [ "List of commands executed in the install directory after successful" + , "installation but before the output files are collected. Useful for" + , "renaming files or directories. Note that data between \"pre_cmds\" and" + , "\"post_cmds\" can be exchanged via $TMPDIR, which is uniquely reserved" + , "for this action." + ] + , "out_files": + [ "Paths to the produced output files. The paths are considered relative" + , "to the install directory." + , "Note that \"out_files\" and \"out_dirs\" may not overlap." + ] + , "out_dirs": + [ "Paths to the produced output directories. The paths are considered" + , "relative to the install directory." + , "Note that \"out_files\" and \"out_dirs\" may not overlap." + ] + } + , "config_doc": + { "CC": + [ "The name of the C compiler to be used." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "CXX": + [ "The name of the C++ compiler to be used." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "CFLAGS": + [ "The flags for CC to be used instead of the default ones." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice" + ] + , "CXXFLAGS": + [ "The flags for CXX to be used instead of the default ones." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "LDFLAGS": + [ "The linker flags to be used instead of the default ones." + , "For libraries that should be linked in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice" + ] + , "ADD_CFLAGS": + [ "The flags to add to the default ones for CC." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ADD_CXXFLAGS": + [ "The flags to add to the default ones for CXX." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ADD_LDFLAGS": + [ "The linker flags to add to the default ones." + , "For libraries that should be linked in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ENV": + [ "The environment for any action generated." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "AR": + [ "The archive tool to used for creating the library." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "BUILD_POSITION_INDEPENDENT": ["Build position independent code."] + } + , "imports": + { "stage_field": ["", "stage_singleton_field"] + , "cmake-build": "cmake-build" + , "strip-prefix": ["./", "..", "strip-prefix"] + } + , "expression": + { "type": "let*" + , "bindings": + [ ["install_prefix", "install"] + , [ "source_dir" + , { "type": "let*" + , "bindings": [["fieldname", "project"], ["location", "source"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} + } + ] + , [ "installed_out_files" + , { "type": "foreach" + , "var": "file_path" + , "range": {"type": "FIELD", "name": "out_files"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "install_prefix"} + , {"type": "var", "name": "file_path"} + ] + } + } + ] + , [ "installed_out_dirs" + , { "type": "foreach" + , "var": "dir_path" + , "range": {"type": "FIELD", "name": "out_dirs"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "install_prefix"} + , {"type": "var", "name": "dir_path"} + ] + } + } + ] + , ["cmake_options", {"type": "FIELD", "name": "options"}] + , ["cmake_defines", {"type": "FIELD", "name": "defines"}] + , ["cmake_jobs", {"type": "FIELD", "name": "jobs"}] + , ["pre_cmds", {"type": "FIELD", "name": "pre_cmds"}] + , ["post_cmds", {"type": "FIELD", "name": "post_cmds"}] + , [ "full_install_dir" + , {"type": "CALL_EXPRESSION", "name": "cmake-build"} + ] + , [ "install_dir" + , { "type": "ACTION" + , "inputs": {"type": "var", "name": "full_install_dir"} + , "cmd": ["/bin/sh", "-c", ":"] + , "outs": {"type": "var", "name": "installed_out_files"} + , "out_dirs": {"type": "var", "name": "installed_out_dirs"} + } + ] + , [ "out_files" + , { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "out_files"}] + , ["prefix", {"type": "var", "name": "install_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + ] + , [ "out_dirs" + , { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "out_dirs"}] + , ["prefix", {"type": "var", "name": "install_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + ] + ] + , "body": + { "type": "RESULT" + , "artifacts": + { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ {"type": "var", "name": "out_files"} + , {"type": "var", "name": "out_dirs"} + ] + } + } + } + } + } +, "library": + { "doc": ["Library produced by CMake configure, build, and install."] + , "target_fields": ["project", "deps"] + , "string_fields": + [ "name" + , "version" + , "stage" + , "options" + , "defines" + , "jobs" + , "pre_cmds" + , "post_cmds" + , "out_hdrs" + , "out_hdr_dirs" + , "out_libs" + , "cflags" + , "ldflags" + , "pkg-config" + , "hdr_prefix" + , "lib_prefix" + , "pc_prefix" + ] + , "config_vars": + [ "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "ADD_CFLAGS" + , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" + , "ENV" + , "AR" + , "BUILD_POSITION_INDEPENDENT" + ] + , "implicit": + { "defaults": [["CC", "defaults"]] + , "config_reader": [["CC", "prebuilt/read_pkgconfig.py"]] + } + , "field_doc": + { "project": + ["The CMake project directory. It should contain a single tree artifact"] + , "name": + [ "The name of the library (without leading \"lib\" or trailing file name" + , "extension), also used as name for pkg-config files." + ] + , "version": + [ "The library version, used for pkg-config files. Individual version" + , "components are joined with \".\"." + ] + , "options": + [ "CMake options for the configuration phase." + , "(e.g., [\"-GNinja\", \"-Ax64\"])" + ] + , "defines": + [ "CMake defines for the configuration phase." + , "(e.g., [\"CMAKE_BUILD_TYPE=Release\"])" + ] + , "jobs": + [ "Number of jobs to run simultaneously. If omitted, CMake's default" + , "number is used." + ] + , "pre_cmds": + [ "List of commands executed in the project directory before calling" + , "CMake. Useful for renaming files or directories. Note that data" + , "between \"pre_cmds\" and \"post_cmds\" can be exchanged via $TMPDIR," + , "which is uniquely reserved for this action." + ] + , "post_cmds": + [ "List of commands executed in the install directory after successful" + , "installation but before the output files are collected. Useful for" + , "renaming files or directories (e.g., in case of SONAME mismatch). Note" + , "that data between \"pre_cmds\" and \"post_cmds\" can be exchanged via" + , "$TMPDIR, which is uniquely reserved for this action." + ] + , "out_hdrs": + [ "Paths to produced public header files. The path is considered" + , "relative to the include directory, which be set via \"hdr_prefix\"." + , "Note that \"out_hdrs\" and \"out_hdr_dirs\" may not overlap." + ] + , "out_hdr_dirs": + [ "Paths to produced public header directories. The path is considered" + , "relative to the include directory, which be set via \"hdr_prefix\"." + , "Note that \"out_hdrs\" and \"out_hdr_dirs\" may not overlap." + ] + , "out_libs": + [ "Paths to produced library files. The path is considered relative" + , "to the library directory, which be set via \"lib_prefix\"." + , "Order matters in the case of one library depending on another." + ] + , "cflags": + ["List of compile flags set for this target and its consumers."] + , "ldflags": + [ "Additional linker flags that are required for the consumer of the" + , "produced libraries." + ] + , "stage": + [ "The logical location of the public headers and library files." + , "Individual directory components are joined with \"/\"." + ] + , "deps": ["Public dependency on other CC libraries."] + , "pkg-config": + [ "Pkg-config file for optional infer of public cflags and ldflags. If" + , "multiple files are specified (e.g., one depends on the other), the" + , "first one is used as entry. Note that if this field is non-empty the" + , "tool \"pkg-config\" must be available in \"PATH\", which is taken" + , "from [\"CC\", \"defaults\"] or the \"ENV\" variable." + ] + , "hdr_prefix": + [ "Prefix where headers will be installed by CMake. Individual directory" + , "components are joined with \"/\". Defaults to \"include\" if not set." + ] + , "lib_prefix": + [ "Prefix where libraries will be installed by CMake. Individual" + , "directory components are joined with \"/\". Defaults to \"lib\" if" + , "not set." + ] + , "pc_prefix": + [ "Prefix where pkg-config files will be installed by CMake. Individual" + , "directory components are joined with \"/\". Defaults to" + , "\"lib/pkgconfig\" if not set." + ] + } + , "config_doc": + { "CC": + [ "The name of the C compiler to be used." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "CXX": + [ "The name of the C++ compiler to be used." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "CFLAGS": + [ "The flags for CC to be used instead of the default ones." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice" + ] + , "CXXFLAGS": + [ "The flags for CXX to be used instead of the default ones." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "LDFLAGS": + ["Global ld flags, for common link args,such as -Wl,-z,noexecstack"] + , "ADD_CFLAGS": + [ "The flags to add to the default ones for CC." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ADD_CXXFLAGS": + [ "The flags to add to the default ones for CXX." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ADD_LDFLAGS": + [ "The linker flags to add to the default ones." + , "For libraries that should be linked in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ENV": + [ "The environment for any action generated." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "AR": + [ "The archive tool to used for creating the library" + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "BUILD_POSITION_INDEPENDENT": ["Build position independent code."] + } + , "imports": + { "stage_field": ["", "stage_singleton_field"] + , "cmake-build": "cmake-build" + , "strip-prefix": ["./", "..", "strip-prefix"] + , "prebuilt result": ["CC/prebuilt", "prebuilt result"] + } + , "expression": + { "type": "let*" + , "bindings": + [ [ "hdr_prefix" + , { "type": "join" + , "separator": "/" + , "$1": + { "type": "++" + , "$1": + [ ["install"] + , { "type": "if" + , "cond": {"type": "FIELD", "name": "hdr_prefix"} + , "then": {"type": "FIELD", "name": "hdr_prefix"} + , "else": ["include"] + } + ] + } + } + ] + , [ "lib_prefix" + , { "type": "join" + , "separator": "/" + , "$1": + { "type": "++" + , "$1": + [ ["install"] + , { "type": "if" + , "cond": {"type": "FIELD", "name": "lib_prefix"} + , "then": {"type": "FIELD", "name": "lib_prefix"} + , "else": ["lib"] + } + ] + } + } + ] + , [ "pc_prefix" + , { "type": "join" + , "separator": "/" + , "$1": + { "type": "++" + , "$1": + [ ["install"] + , { "type": "if" + , "cond": {"type": "FIELD", "name": "pc_prefix"} + , "then": {"type": "FIELD", "name": "pc_prefix"} + , "else": ["lib", "pkgconfig"] + } + ] + } + } + ] + , [ "source_dir" + , { "type": "let*" + , "bindings": [["fieldname", "project"], ["location", "source"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} + } + ] + , [ "installed_dirs" + , { "type": "foreach" + , "var": "dir_path" + , "range": {"type": "FIELD", "name": "out_hdr_dirs"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "hdr_prefix"} + , {"type": "var", "name": "dir_path"} + ] + } + } + ] + , [ "installed_files" + , { "type": "++" + , "$1": + [ { "type": "foreach" + , "var": "lib_path" + , "range": {"type": "FIELD", "name": "out_libs"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "lib_prefix"} + , {"type": "var", "name": "lib_path"} + ] + } + } + , { "type": "foreach" + , "var": "hdr_path" + , "range": {"type": "FIELD", "name": "out_hdrs"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "hdr_prefix"} + , {"type": "var", "name": "hdr_path"} + ] + } + } + , { "type": "foreach" + , "var": "pc_path" + , "range": {"type": "FIELD", "name": "pkg-config"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "pc_prefix"} + , {"type": "var", "name": "pc_path"} + ] + } + } + ] + } + ] + , ["cmake_options", {"type": "FIELD", "name": "options"}] + , ["cmake_defines", {"type": "FIELD", "name": "defines"}] + , ["cmake_jobs", {"type": "FIELD", "name": "jobs"}] + , ["pre_cmds", {"type": "FIELD", "name": "pre_cmds"}] + , ["post_cmds", {"type": "FIELD", "name": "post_cmds"}] + , [ "full_install_dir" + , {"type": "CALL_EXPRESSION", "name": "cmake-build"} + ] + , [ "install_dir" + , { "type": "ACTION" + , "inputs": {"type": "var", "name": "full_install_dir"} + , "cmd": ["/bin/sh", "-c", ":"] + , "outs": {"type": "var", "name": "installed_files"} + , "out_dirs": {"type": "var", "name": "installed_dirs"} + } + ] + , [ "hdrs" + , { "type": "++" + , "$1": + [ { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "out_hdrs"}] + , ["prefix", {"type": "var", "name": "hdr_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + , { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "out_hdr_dirs"}] + , ["prefix", {"type": "var", "name": "hdr_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + ] + } + ] + , [ "libs" + , { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "out_libs"}] + , ["prefix", {"type": "var", "name": "lib_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + ] + , [ "config_reader" + , { "type": "let*" + , "bindings": + [["fieldname", "config_reader"], ["location", "config_reader"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} + } + ] + , [ "pkg-configs" + , { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "pkg-config"}] + , ["prefix", {"type": "var", "name": "pc_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + ] + , [ "name" + , { "type": "assert_non_empty" + , "msg": "name is required for cmake library" + , "$1": {"type": "join", "$1": {"type": "FIELD", "name": "name"}} + } + ] + , ["version", {"type": "FIELD", "name": "version"}] + , ["cflags", {"type": "FIELD", "name": "cflags"}] + , ["ldflags", {"type": "FIELD", "name": "ldflags"}] + , [ "stage" + , { "type": "join" + , "separator": "/" + , "$1": {"type": "FIELD", "name": "stage"} + } + ] + , ["deps-fieldnames", ["deps"]] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "prebuilt result"} + } + } +} diff --git a/CC/foreign/make/EXPRESSIONS b/CC/foreign/make/EXPRESSIONS new file mode 100644 index 0000000..e853b29 --- /dev/null +++ b/CC/foreign/make/EXPRESSIONS @@ -0,0 +1,284 @@ +{ "make-build": + { "vars": + [ "source_dir" + , "make_target" + , "make_prefix" + , "make_options" + , "make_jobs" + , "pre_cmds" + , "post_cmds" + , "var_cc" + , "var_cxx" + , "var_ccflags" + , "var_cxxflags" + , "var_ldflags" + , "var_ar" + , "var_prefix" + , "var_destdir" + , "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "ADD_CFLAGS" + , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" + , "ENV" + , "AR" + , "PREFIX" + , "BUILD_POSITION_INDEPENDENT" + ] + , "imports": + { "artifacts": ["", "field_artifacts"] + , "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"] + } + , "expression": + { "type": "let*" + , "bindings": + [ ["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": + [ { "type": "var" + , "name": "LDFLAGS" + , "default": + {"type": "CALL_EXPRESSION", "name": "default-LDFLAGS"} + } + , {"type": "var", "name": "ldflags", "default": []} + ] + } + } + ] + , [ "AR" + , { "type": "var" + , "name": "AR" + , "default": {"type": "CALL_EXPRESSION", "name": "default-AR"} + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , [ { "type": "var" + , "name": "ENV" + , "default": {"type": "empty_map"} + } + ] + , [ { "type": "singleton_map" + , "key": + { "type": "if" + , "cond": {"type": "var", "name": "var_cc"} + , "then": + {"type": "join", "$1": {"type": "var", "name": "var_cc"}} + , "else": "CC" + } + , "value": {"type": "var", "name": "CC"} + } + ] + , [ { "type": "singleton_map" + , "key": + { "type": "if" + , "cond": {"type": "var", "name": "var_cxx"} + , "then": + { "type": "join" + , "$1": {"type": "var", "name": "var_cxx"} + } + , "else": "CXX" + } + , "value": {"type": "var", "name": "CXX"} + } + ] + , [ { "type": "singleton_map" + , "key": + { "type": "if" + , "cond": {"type": "var", "name": "var_ccflags"} + , "then": + { "type": "join" + , "$1": {"type": "var", "name": "var_ccflags"} + } + , "else": "CFLAGS" + } + , "value": {"type": "var", "name": "CFLAGS"} + } + ] + , [ { "type": "singleton_map" + , "key": + { "type": "if" + , "cond": {"type": "var", "name": "var_cxxflags"} + , "then": + { "type": "join" + , "$1": {"type": "var", "name": "var_cxxflags"} + } + , "else": "CXXFLAGS" + } + , "value": {"type": "var", "name": "CXXFLAGS"} + } + ] + , [ { "type": "singleton_map" + , "key": + { "type": "if" + , "cond": {"type": "var", "name": "var_ldflags"} + , "then": + { "type": "join" + , "$1": {"type": "var", "name": "var_ldflags"} + } + , "else": "LDFLAGS" + } + , "value": {"type": "var", "name": "LDFLAGS"} + } + ] + , [ { "type": "singleton_map" + , "key": + { "type": "if" + , "cond": {"type": "var", "name": "var_ar"} + , "then": + {"type": "join", "$1": {"type": "var", "name": "var_ar"}} + , "else": "AR" + } + , "value": {"type": "var", "name": "AR"} + } + ] + , [ { "type": "singleton_map" + , "key": + { "type": "if" + , "cond": {"type": "var", "name": "var_prefix"} + , "then": + { "type": "join" + , "$1": {"type": "var", "name": "var_prefix"} + } + , "else": "PREFIX" + } + , "value": + { "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": "/"} + } + } + ] + ] + } + } + ] + , [ "script" + , { "type": "singleton_map" + , "key": "run_make.sh" + , "value": + { "type": "BLOB" + , "data": + { "type": "join" + , "separator": "\n" + , "$1": + { "type": "++" + , "$1": + [ [ "set -eu" + , "mkdir scratch" + , "readonly TMPDIR=\"$(pwd)/scratch\"" + ] + , { "type": "if" + , "cond": {"type": "var", "name": "pre_cmds"} + , "then": + { "type": "++" + , "$1": + [ ["(", "set --", "cd ./source"] + , {"type": "var", "name": "pre_cmds"} + , [")"] + ] + } + } + , [ "readonly VAR_DESTDIR=$1" + , "shift" + , "make \"$@\" -C source ${VAR_DESTDIR}=$(pwd)/install >build.log || (cat build.log && exit 1)" + , "find ./install -type l -delete" + ] + , { "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": "source_dir"} + , {"type": "var", "name": "script"} + ] + } + , "cmd": + { "type": "++" + , "$1": + [ ["/bin/sh", "run_make.sh"] + , { "type": "if" + , "cond": {"type": "var", "name": "var_destdir"} + , "then": + [{"type": "join", "$1": {"type": "var", "name": "var_destdir"}}] + , "else": ["DESTDIR"] + } + , {"type": "var", "name": "make_options"} + , { "type": "if" + , "cond": {"type": "var", "name": "make_target"} + , "then": + [{"type": "join", "$1": {"type": "var", "name": "make_target"}}] + , "else": ["install"] + } + , [ { "type": "join" + , "$1": + { "type": "++" + , "$1": + [["-j"], {"type": "var", "name": "make_jobs", "default": []}] + } + } + ] + ] + } + , "out_dirs": ["install"] + , "env": {"type": "var", "name": "ENV"} + } + } + } +} diff --git a/CC/foreign/make/RULES b/CC/foreign/make/RULES new file mode 100644 index 0000000..9c8c738 --- /dev/null +++ b/CC/foreign/make/RULES @@ -0,0 +1,676 @@ +{ "data": + { "doc": ["Data produced by Make build and install."] + , "target_fields": ["project"] + , "string_fields": + [ "target" + , "prefix" + , "options" + , "jobs" + , "pre_cmds" + , "post_cmds" + , "out_files" + , "out_dirs" + , "var_cc" + , "var_cxx" + , "var_ccflags" + , "var_cxxflags" + , "var_ldflags" + , "var_ar" + , "var_prefix" + , "var_destdir" + ] + , "config_vars": + [ "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "ADD_CFLAGS" + , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" + , "ENV" + , "AR" + , "PREFIX" + , "BUILD_POSITION_INDEPENDENT" + ] + , "implicit": {"defaults": [["CC", "defaults"]]} + , "field_doc": + { "project": + ["The Make project directory. It should contain a single tree artifact"] + , "target": ["The Make target to build (default: [\"install\"])."] + , "prefix": + [ "The prefix used for the Make target. The path will be made absolute" + , "and individual directory components are joined with \"/\". If no" + , "prefix is specified, the value from the config variable \"PREFIX\" is" + , "taken, with the default value being \"/\"." + ] + , "options": + [ "Make options for the configuration phase." + , "(e.g., [\"-f\", \"Makefile\", \"ARCH=x86\"])" + ] + , "jobs": + [ "Number of jobs to run simultaneously. If omitted, Make's default" + , "number is used." + ] + , "pre_cmds": + [ "List of commands executed in the project directory before calling" + , "Make. Useful for renaming files or directories. Note that data" + , "between \"pre_cmds\" and \"post_cmds\" can be exchanged via $TMPDIR," + , "which is uniquely reserved for this action." + ] + , "post_cmds": + [ "List of commands executed in the install directory after successful" + , "installation but before the output files are collected. Useful for" + , "renaming files or directories. Note that data between \"pre_cmds\" and" + , "\"post_cmds\" can be exchanged via $TMPDIR, which is uniquely reserved" + , "for this action." + ] + , "out_files": + [ "Paths to the produced output files. The paths are considered relative" + , "to the install directory." + , "Note that \"out_files\" and \"out_dirs\" may not overlap." + ] + , "out_dirs": + [ "Paths to the produced output directories. The paths are considered" + , "relative to the install directory." + , "Note that \"out_files\" and \"out_dirs\" may not overlap." + ] + , "var_cc": + ["Variable name used to specify the C compiler (default: \"CC\")."] + , "var_cxx": + ["Variable name used to specify the C++ compiler (default: \"CXX\")."] + , "var_ccflags": + ["Variable name used to specify the C flags (default: \"CFLAGS\")."] + , "var_cxxflags": + ["Variable name used to specify the C++ flags (default: \"CXXFLAGS\")."] + , "var_ldflags": + ["Variable name used to specify the link flags (default: \"LDFLAGS\")."] + , "var_ar": + ["Variable name used to specify the archiver (default: \"AR\")."] + , "var_prefix": + ["Variable name used to specify the prefix (default: \"PREFIX\")."] + , "var_destdir": + ["Variable name used to specify the destdir (default: \"DESTDIR\")."] + } + , "config_doc": + { "CC": + [ "The name of the C compiler to be used." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "CXX": + [ "The name of the C++ compiler to be used." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "CFLAGS": + [ "The flags for CC to be used instead of the default ones." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice" + ] + , "CXXFLAGS": + [ "The flags for CXX to be used instead of the default ones." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "LDFLAGS": + [ "The linker flags to be used instead of the default ones." + , "For libraries that should be linked in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice" + ] + , "ADD_CFLAGS": + [ "The flags to add to the default ones for CC." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ADD_CXXFLAGS": + [ "The flags to add to the default ones for CXX." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ADD_LDFLAGS": + [ "The linker flags to add to the default ones." + , "For libraries that should be linked in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ENV": + [ "The environment for any action generated." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "AR": + [ "The archive tool to used for creating the library." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "PREFIX": + [ "The absolute path that is used as prefix inside generated pkg-config" + , "files. The default value for this variable is \"/\". This variable" + , "is ignored if the field \"prefix\" is set." + ] + , "BUILD_POSITION_INDEPENDENT": ["Build position independent code."] + } + , "imports": + { "stage_field": ["", "stage_singleton_field"] + , "make-build": "make-build" + , "strip-prefix": ["./", "..", "strip-prefix"] + } + , "expression": + { "type": "let*" + , "bindings": + [ ["install_prefix", "install"] + , [ "source_dir" + , { "type": "let*" + , "bindings": [["fieldname", "project"], ["location", "source"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} + } + ] + , [ "installed_out_files" + , { "type": "foreach" + , "var": "file_path" + , "range": {"type": "FIELD", "name": "out_files"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "install_prefix"} + , {"type": "var", "name": "file_path"} + ] + } + } + ] + , [ "installed_out_dirs" + , { "type": "foreach" + , "var": "dir_path" + , "range": {"type": "FIELD", "name": "out_dirs"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "install_prefix"} + , {"type": "var", "name": "dir_path"} + ] + } + } + ] + , ["make_target", {"type": "FIELD", "name": "target"}] + , ["make_prefix", {"type": "FIELD", "name": "prefix"}] + , ["make_options", {"type": "FIELD", "name": "options"}] + , ["make_jobs", {"type": "FIELD", "name": "jobs"}] + , ["pre_cmds", {"type": "FIELD", "name": "pre_cmds"}] + , ["post_cmds", {"type": "FIELD", "name": "post_cmds"}] + , ["var_cc", {"type": "FIELD", "name": "var_cc"}] + , ["var_cxx", {"type": "FIELD", "name": "var_cxx"}] + , ["var_ccflags", {"type": "FIELD", "name": "var_ccflags"}] + , ["var_cxxflags", {"type": "FIELD", "name": "var_cxxflags"}] + , ["var_ldflags", {"type": "FIELD", "name": "var_ldflags"}] + , ["var_ar", {"type": "FIELD", "name": "var_ar"}] + , ["var_prefix", {"type": "FIELD", "name": "var_prefix"}] + , ["var_destdir", {"type": "FIELD", "name": "var_destdir"}] + , ["full_install_dir", {"type": "CALL_EXPRESSION", "name": "make-build"}] + , [ "install_dir" + , { "type": "ACTION" + , "inputs": {"type": "var", "name": "full_install_dir"} + , "cmd": ["/bin/sh", "-c", ":"] + , "outs": {"type": "var", "name": "installed_out_files"} + , "out_dirs": {"type": "var", "name": "installed_out_dirs"} + } + ] + , [ "out_files" + , { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "out_files"}] + , ["prefix", {"type": "var", "name": "install_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + ] + , [ "out_dirs" + , { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "out_dirs"}] + , ["prefix", {"type": "var", "name": "install_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + ] + ] + , "body": + { "type": "RESULT" + , "artifacts": + { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ {"type": "var", "name": "out_files"} + , {"type": "var", "name": "out_dirs"} + ] + } + } + } + } + } +, "library": + { "doc": ["Library produced by Make build and install."] + , "target_fields": ["project", "deps"] + , "string_fields": + [ "name" + , "version" + , "stage" + , "target" + , "prefix" + , "options" + , "jobs" + , "pre_cmds" + , "post_cmds" + , "out_hdrs" + , "out_hdr_dirs" + , "out_libs" + , "cflags" + , "ldflags" + , "pkg-config" + , "hdr_prefix" + , "lib_prefix" + , "pc_prefix" + , "var_cc" + , "var_cxx" + , "var_ccflags" + , "var_cxxflags" + , "var_ldflags" + , "var_ar" + , "var_prefix" + , "var_destdir" + ] + , "config_vars": + [ "CC" + , "CXX" + , "CFLAGS" + , "CXXFLAGS" + , "LDFLAGS" + , "ADD_CFLAGS" + , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" + , "ENV" + , "AR" + , "PREFIX" + , "BUILD_POSITION_INDEPENDENT" + ] + , "implicit": + { "defaults": [["CC", "defaults"]] + , "config_reader": [["CC", "prebuilt/read_pkgconfig.py"]] + } + , "field_doc": + { "project": + ["The Make project directory. It should contain a single tree artifact"] + , "name": + [ "The name of the library (without leading \"lib\" or trailing file name" + , "extension), also used as name for pkg-config files." + ] + , "version": + [ "The library version, used for pkg-config files. Individual version" + , "components are joined with \".\"." + ] + , "target": ["The Make target to build (default: [\"install\"])."] + , "prefix": + [ "The prefix used for the Make target. The path will be made absolute" + , "and individual directory components are joined with \"/\". If no" + , "prefix is specified, the value from the config variable \"PREFIX\" is" + , "taken, with the default value being \"/\"." + ] + , "options": + [ "Make options for the configuration phase." + , "(e.g., [\"-f\", \"Makefile\", \"ARCH=x86\"])" + ] + , "jobs": + [ "Number of jobs to run simultaneously. If omitted, Make's default" + , "number is used." + ] + , "pre_cmds": + [ "List of commands executed in the project directory before calling" + , "Make. Useful for renaming files or directories. Note that data" + , "between \"pre_cmds\" and \"post_cmds\" can be exchanged via $TMPDIR," + , "which is uniquely reserved for this action." + ] + , "post_cmds": + [ "List of commands executed in the install directory after successful" + , "installation but before the output files are collected. Useful for" + , "renaming files or directories (e.g., in case of SONAME mismatch). Note" + , "that data between \"pre_cmds\" and \"post_cmds\" can be exchanged via" + , "$TMPDIR, which is uniquely reserved for this action." + ] + , "out_hdrs": + [ "Paths to produced public header files. The path is considered" + , "relative to the include directory, which be set via \"hdr_prefix\"." + , "Note that \"out_hdrs\" and \"out_hdr_dirs\" may not overlap." + ] + , "out_hdr_dirs": + [ "Paths to produced public header directories. The path is considered" + , "relative to the include directory, which be set via \"hdr_prefix\"." + , "Note that \"out_hdrs\" and \"out_hdr_dirs\" may not overlap." + ] + , "out_libs": + [ "Paths to produced library files. The path is considered relative" + , "to the library directory, which be set via \"lib_prefix\"." + , "Order matters in the case of one library depending on another." + ] + , "cflags": + ["List of compile flags set for this target and its consumers."] + , "ldflags": + [ "Additional linker flags that are required for the consumer of the" + , "produced libraries." + ] + , "stage": + [ "The logical location of the public headers and library files." + , "Individual directory components are joined with \"/\"." + ] + , "deps": ["Public dependency on other CC libraries."] + , "pkg-config": + [ "Pkg-config file for optional infer of public cflags and ldflags. If" + , "multiple files are specified (e.g., one depends on the other), the" + , "first one is used as entry. Note that if this field is non-empty the" + , "tool \"pkg-config\" must be available in \"PATH\", which is taken" + , "from [\"CC\", \"defaults\"] or the \"ENV\" variable." + ] + , "hdr_prefix": + [ "Prefix where headers will be installed by Make. Individual directory" + , "components are joined with \"/\". Defaults to \"include\" if not set." + ] + , "lib_prefix": + [ "Prefix where libraries will be installed by Make. Individual" + , "directory components are joined with \"/\". Defaults to \"lib\" if" + , "not set." + ] + , "pc_prefix": + [ "Prefix where pkg-config files will be installed by Make. Individual" + , "directory components are joined with \"/\". Defaults to" + , "\"lib/pkgconfig\" if not set." + ] + , "var_cc": + ["Variable name used to specify the C compiler (default: \"CC\")."] + , "var_cxx": + ["Variable name used to specify the C++ compiler (default: \"CXX\")."] + , "var_ccflags": + ["Variable name used to specify the C flags (default: \"CFLAGS\")."] + , "var_cxxflags": + ["Variable name used to specify the C++ flags (default: \"CXXFLAGS\")."] + , "var_ldflags": + ["Variable name used to specify the link flags (default: \"LDFLAGS\")."] + , "var_ar": + ["Variable name used to specify the archiver (default: \"AR\")."] + , "var_prefix": + ["Variable name used to specify the prefix (default: \"PREFIX\")."] + , "var_destdir": + ["Variable name used to specify the destdir (default: \"DESTDIR\")."] + } + , "config_doc": + { "CC": + [ "The name of the C compiler to be used." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "CXX": + [ "The name of the C++ compiler to be used." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "CFLAGS": + [ "The flags for CC to be used instead of the default ones." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice" + ] + , "CXXFLAGS": + [ "The flags for CXX to be used instead of the default ones." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "LDFLAGS": + ["Global ld flags, for common link args,such as -Wl,-z,noexecstack"] + , "ADD_CFLAGS": + [ "The flags to add to the default ones for CC." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ADD_CXXFLAGS": + [ "The flags to add to the default ones for CXX." + , "For libraries that should be built in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ADD_LDFLAGS": + [ "The linker flags to add to the default ones." + , "For libraries that should be linked in a non-standard way; usually" + , "adapting the default target [\"CC\", \"defaults\"] is the better" + , "choice." + ] + , "ENV": + [ "The environment for any action generated." + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "AR": + [ "The archive tool to used for creating the library" + , "If null, the respective value from [\"CC\", \"defaults\"] will be taken." + ] + , "PREFIX": + [ "The absolute path that is used as prefix inside generated pkg-config" + , "files. The default value for this variable is \"/\". This variable" + , "is ignored if the field \"prefix\" is set." + ] + , "BUILD_POSITION_INDEPENDENT": ["Build position independent code."] + } + , "imports": + { "stage_field": ["", "stage_singleton_field"] + , "make-build": "make-build" + , "strip-prefix": ["./", "..", "strip-prefix"] + , "prebuilt result": ["CC/prebuilt", "prebuilt result"] + } + , "expression": + { "type": "let*" + , "bindings": + [ [ "hdr_prefix" + , { "type": "join" + , "separator": "/" + , "$1": + { "type": "++" + , "$1": + [ ["install"] + , { "type": "if" + , "cond": {"type": "FIELD", "name": "hdr_prefix"} + , "then": {"type": "FIELD", "name": "hdr_prefix"} + , "else": ["include"] + } + ] + } + } + ] + , [ "lib_prefix" + , { "type": "join" + , "separator": "/" + , "$1": + { "type": "++" + , "$1": + [ ["install"] + , { "type": "if" + , "cond": {"type": "FIELD", "name": "lib_prefix"} + , "then": {"type": "FIELD", "name": "lib_prefix"} + , "else": ["lib"] + } + ] + } + } + ] + , [ "pc_prefix" + , { "type": "join" + , "separator": "/" + , "$1": + { "type": "++" + , "$1": + [ ["install"] + , { "type": "if" + , "cond": {"type": "FIELD", "name": "pc_prefix"} + , "then": {"type": "FIELD", "name": "pc_prefix"} + , "else": ["lib", "pkgconfig"] + } + ] + } + } + ] + , [ "source_dir" + , { "type": "let*" + , "bindings": [["fieldname", "project"], ["location", "source"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} + } + ] + , [ "installed_dirs" + , { "type": "foreach" + , "var": "dir_path" + , "range": {"type": "FIELD", "name": "out_hdr_dirs"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "hdr_prefix"} + , {"type": "var", "name": "dir_path"} + ] + } + } + ] + , [ "installed_files" + , { "type": "++" + , "$1": + [ { "type": "foreach" + , "var": "lib_path" + , "range": {"type": "FIELD", "name": "out_libs"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "lib_prefix"} + , {"type": "var", "name": "lib_path"} + ] + } + } + , { "type": "foreach" + , "var": "hdr_path" + , "range": {"type": "FIELD", "name": "out_hdrs"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "hdr_prefix"} + , {"type": "var", "name": "hdr_path"} + ] + } + } + , { "type": "foreach" + , "var": "pc_path" + , "range": {"type": "FIELD", "name": "pkg-config"} + , "body": + { "type": "join" + , "separator": "/" + , "$1": + [ {"type": "var", "name": "pc_prefix"} + , {"type": "var", "name": "pc_path"} + ] + } + } + ] + } + ] + , ["make_target", {"type": "FIELD", "name": "target"}] + , ["make_prefix", {"type": "FIELD", "name": "prefix"}] + , ["make_options", {"type": "FIELD", "name": "options"}] + , ["make_jobs", {"type": "FIELD", "name": "jobs"}] + , ["pre_cmds", {"type": "FIELD", "name": "pre_cmds"}] + , ["post_cmds", {"type": "FIELD", "name": "post_cmds"}] + , ["var_cc", {"type": "FIELD", "name": "var_cc"}] + , ["var_cxx", {"type": "FIELD", "name": "var_cxx"}] + , ["var_ccflags", {"type": "FIELD", "name": "var_ccflags"}] + , ["var_cxxflags", {"type": "FIELD", "name": "var_cxxflags"}] + , ["var_ldflags", {"type": "FIELD", "name": "var_ldflags"}] + , ["var_ar", {"type": "FIELD", "name": "var_ar"}] + , ["var_prefix", {"type": "FIELD", "name": "var_prefix"}] + , ["var_destdir", {"type": "FIELD", "name": "var_destdir"}] + , ["full_install_dir", {"type": "CALL_EXPRESSION", "name": "make-build"}] + , [ "install_dir" + , { "type": "ACTION" + , "inputs": {"type": "var", "name": "full_install_dir"} + , "cmd": ["/bin/sh", "-c", ":"] + , "outs": {"type": "var", "name": "installed_files"} + , "out_dirs": {"type": "var", "name": "installed_dirs"} + } + ] + , [ "hdrs" + , { "type": "++" + , "$1": + [ { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "out_hdrs"}] + , ["prefix", {"type": "var", "name": "hdr_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + , { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "out_hdr_dirs"}] + , ["prefix", {"type": "var", "name": "hdr_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + ] + } + ] + , [ "libs" + , { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "out_libs"}] + , ["prefix", {"type": "var", "name": "lib_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + ] + , [ "config_reader" + , { "type": "let*" + , "bindings": + [["fieldname", "config_reader"], ["location", "config_reader"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} + } + ] + , [ "pkg-configs" + , { "type": "let*" + , "bindings": + [ ["artifacts", {"type": "var", "name": "install_dir"}] + , ["paths", {"type": "FIELD", "name": "pkg-config"}] + , ["prefix", {"type": "var", "name": "pc_prefix"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "strip-prefix"} + } + ] + , [ "name" + , { "type": "assert_non_empty" + , "msg": "name is required for make library" + , "$1": {"type": "join", "$1": {"type": "FIELD", "name": "name"}} + } + ] + , ["version", {"type": "FIELD", "name": "version"}] + , ["cflags", {"type": "FIELD", "name": "cflags"}] + , ["ldflags", {"type": "FIELD", "name": "ldflags"}] + , [ "stage" + , { "type": "join" + , "separator": "/" + , "$1": {"type": "FIELD", "name": "stage"} + } + ] + , ["deps-fieldnames", ["deps"]] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "prebuilt result"} + } + } +} diff --git a/CC/prebuilt/EXPRESSIONS b/CC/prebuilt/EXPRESSIONS new file mode 100644 index 0000000..6bfd874 --- /dev/null +++ b/CC/prebuilt/EXPRESSIONS @@ -0,0 +1,459 @@ +{ "check-file-ending": + { "doc": ["Returns true if all file names end with the given ending."] + , "vars": ["files", "ending", "invert"] + , "vars_doc": + { "files": ["Artifact map that contains the files."] + , "ending": ["The ending to check for (without \".\")."] + , "invert": ["Invert condition to file name not ending with \"ending\"."] + } + , "expression": + { "type": "and" + , "$1": + { "type": "foreach" + , "var": "file" + , "range": {"type": "keys", "$1": {"type": "var", "name": "files"}} + , "body": + { "type": "let*" + , "bindings": + [ [ "is-equal" + , { "type": "==" + , "$1": {"type": "var", "name": "file"} + , "$2": + { "type": "change_ending" + , "$1": {"type": "var", "name": "file"} + , "ending": + { "type": "join" + , "$1": [".", {"type": "var", "name": "ending"}] + } + } + } + ] + ] + , "body": + { "type": "if" + , "cond": {"type": "var", "name": "invert", "default": false} + , "then": + { "type": "if" + , "cond": {"type": "var", "name": "is-equal"} + , "then": false + , "else": true + } + , "else": {"type": "var", "name": "is-equal"} + } + } + } + } + } +, "check-libs-non-static": + { "doc": + [ "Returns true if all libs are non-static libraries or false otherwise." + , "Throws if static and non-static libraries are mixed." + ] + , "vars": ["libs"] + , "vars_doc": {"libs": ["List of artifact maps that contain the libraries."]} + , "imports": {"check-file-ending": "check-file-ending"} + , "expression": + { "type": "let*" + , "bindings": + [ ["files", {"type": "map_union", "$1": {"type": "var", "name": "libs"}}] + , [ "static" + , { "type": "let*" + , "bindings": [["ending", "a"]] + , "body": {"type": "CALL_EXPRESSION", "name": "check-file-ending"} + } + ] + , [ "shared" + , { "type": "let*" + , "bindings": [["ending", "a"], ["invert", true]] + , "body": {"type": "CALL_EXPRESSION", "name": "check-file-ending"} + } + ] + ] + , "body": + { "type": "if" + , "cond": + { "type": "or" + , "$1": + [ {"type": "var", "name": "static"} + , {"type": "var", "name": "shared"} + ] + } + , "then": {"type": "var", "name": "shared"} + , "else": + { "type": "fail" + , "msg": "Prebuilt library types (static/shared) may not be mixed." + } + } + } + } +, "prebuilt result": + { "vars": + [ "ENV" + , "name" + , "version" + , "stage" + , "cflags" + , "ldflags" + , "libs" + , "hdrs" + , "config_reader" + , "pkg-configs" + , "deps-fieldnames" + ] + , "imports": + { "check-libs-non-static": "check-libs-non-static" + , "compile-deps": ["./", "..", "compile-deps"] + , "compile-args-deps": ["./", "..", "compile-args-deps"] + , "link-deps": ["./", "..", "link-deps"] + , "link-args-deps": ["./", "..", "link-args-deps"] + , "run-libs-deps": ["./", "..", "run-libs-deps"] + , "run-libs-args-deps": ["./", "..", "run-libs-args-deps"] + , "cflags-files-deps": ["./", "..", "cflags-files-deps"] + , "ldflags-files-deps": ["./", "..", "ldflags-files-deps"] + , "default-ENV": ["./", "..", "default-ENV"] + } + , "expression": + { "type": "let*" + , "bindings": + [ [ "shared" + , {"type": "CALL_EXPRESSION", "name": "check-libs-non-static"} + ] + , [ "lib-stage" + , { "type": "if" + , "cond": {"type": "var", "name": "shared"} + , "then": "." + , "else": {"type": "var", "name": "stage"} + } + ] + , [ "staged-libs" + , { "type": "foreach" + , "var": "lib" + , "range": {"type": "var", "name": "libs"} + , "body": + { "type": "to_subdir" + , "subdir": {"type": "var", "name": "lib-stage"} + , "flat": true + , "msg": "prebuilt libraries may not overlap" + , "$1": {"type": "var", "name": "lib"} + } + } + ] + , [ "link-args" + , { "type": "if" + , "cond": {"type": "var", "name": "shared"} + , "then": [] + , "else": + { "type": "++" + , "$1": + { "type": "foreach" + , "var": "libs" + , "range": {"type": "var", "name": "staged-libs"} + , "body": {"type": "keys", "$1": {"type": "var", "name": "libs"}} + } + } + } + ] + , [ "run-libs-args" + , { "type": "if" + , "cond": {"type": "var", "name": "shared"} + , "then": + { "type": "++" + , "$1": + { "type": "foreach" + , "var": "libs" + , "range": {"type": "var", "name": "staged-libs"} + , "body": {"type": "keys", "$1": {"type": "var", "name": "libs"}} + } + } + } + ] + , [ "libs" + , { "type": "disjoint_map_union" + , "msg": "prebuilt libraries may not overlap" + , "$1": {"type": "var", "name": "staged-libs"} + } + ] + , [ "hdrs" + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "stage"} + , "$1": + { "type": "disjoint_map_union" + , "msg": "prebuilt headers may not overlap" + , "$1": {"type": "var", "name": "hdrs"} + } + } + ] + , ["compile-deps", {"type": "CALL_EXPRESSION", "name": "compile-deps"}] + , [ "compile-args" + , { "type": "nub_right" + , "$1": + { "type": "++" + , "$1": + [ {"type": "var", "name": "cflags"} + , {"type": "CALL_EXPRESSION", "name": "compile-args-deps"} + ] + } + } + ] + , ["link-deps", {"type": "CALL_EXPRESSION", "name": "link-deps"}] + , [ "link-args" + , { "type": "nub_right" + , "$1": + { "type": "++" + , "$1": + [ {"type": "var", "name": "link-args"} + , {"type": "CALL_EXPRESSION", "name": "link-args-deps"} + ] + } + } + ] + , [ "run-libs" + , { "type": "map_union" + , "$1": + [ { "type": "if" + , "cond": {"type": "var", "name": "shared"} + , "then": {"type": "var", "name": "libs"} + , "else": {"type": "empty_map"} + } + , {"type": "CALL_EXPRESSION", "name": "run-libs-deps"} + ] + } + ] + , [ "run-libs-args" + , { "type": "nub_right" + , "$1": + { "type": "++" + , "$1": + [ {"type": "var", "name": "run-libs-args"} + , {"type": "var", "name": "ldflags"} + , {"type": "CALL_EXPRESSION", "name": "run-libs-args-deps"} + ] + } + } + ] + , [ "ENV" + , { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , [ { "type": "var" + , "name": "ENV" + , "default": {"type": "empty_map"} + } + ] + ] + } + } + ] + , [ "main-pkg-config" + , { "type": "foldl" + , "range": + { "type": "++" + , "$1": + { "type": "foreach" + , "var": "configs" + , "range": {"type": "var", "name": "pkg-configs", "default": []} + , "body": + {"type": "keys", "$1": {"type": "var", "name": "configs"}} + } + } + , "start": null + , "accum_var": "name" + , "var": "config" + , "body": + { "type": "if" + , "cond": {"type": "var", "name": "name"} + , "then": {"type": "var", "name": "name"} + , "else": {"type": "var", "name": "config"} + } + } + ] + , [ "reader-inputs" + , { "type": "to_subdir" + , "subdir": "lib" + , "$1": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "libs"} + , { "type": "to_subdir" + , "subdir": "pkgconfig" + , "flat": true + , "$1": + { "type": "map_union" + , "$1": {"type": "var", "name": "pkg-configs", "default": []} + } + } + ] + } + } + ] + , [ "cflags-filename" + , {"type": "join", "$1": [{"type": "var", "name": "name"}, ".cflags"]} + ] + , [ "cflags-file" + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "stage"} + , "$1": + { "type": "if" + , "cond": {"type": "var", "name": "pkg-configs"} + , "then": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "config_reader"} + , {"type": "var", "name": "reader-inputs"} + ] + } + , "cmd": + [ "./config_reader" + , {"type": "var", "name": "cflags-filename"} + , {"type": "var", "name": "main-pkg-config"} + ] + , "env": {"type": "var", "name": "ENV"} + , "outs": [{"type": "var", "name": "cflags-filename"}] + } + , "else": {"type": "empty_map"} + } + } + ] + , [ "cflags-files" + , { "type": "map_union" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "cflags-files-deps"} + , {"type": "var", "name": "cflags-file"} + ] + } + ] + , [ "compile-args" + , { "type": "++" + , "$1": + [ {"type": "var", "name": "compile-args"} + , { "type": "if" + , "cond": {"type": "var", "name": "cflags-file"} + , "then": + [ { "type": "join" + , "$1": + { "type": "++" + , "$1": + [ ["@"] + , { "type": "keys" + , "$1": {"type": "var", "name": "cflags-file"} + } + ] + } + } + ] + } + ] + } + ] + , [ "ldflags-filename" + , {"type": "join", "$1": [{"type": "var", "name": "name"}, ".ldflags"]} + ] + , [ "ldflags-file" + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "stage"} + , "$1": + { "type": "if" + , "cond": {"type": "var", "name": "pkg-configs"} + , "then": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "config_reader"} + , {"type": "var", "name": "reader-inputs"} + ] + } + , "cmd": + [ "./config_reader" + , {"type": "var", "name": "ldflags-filename"} + , {"type": "var", "name": "main-pkg-config"} + ] + , "env": {"type": "var", "name": "ENV"} + , "outs": [{"type": "var", "name": "ldflags-filename"}] + } + , "else": {"type": "empty_map"} + } + } + ] + , [ "ldflags-files" + , { "type": "map_union" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "ldflags-files-deps"} + , {"type": "var", "name": "ldflags-file"} + ] + } + ] + , [ "run-libs-args" + , { "type": "++" + , "$1": + [ {"type": "var", "name": "run-libs-args"} + , { "type": "if" + , "cond": {"type": "var", "name": "ldflags-file"} + , "then": + [ { "type": "join" + , "$1": + { "type": "++" + , "$1": + [ ["@"] + , { "type": "keys" + , "$1": {"type": "var", "name": "ldflags-file"} + } + ] + } + } + ] + } + ] + } + ] + , [ "package" + , { "type": "let*" + , "bindings": + [ ["name", {"type": "var", "name": "name"}] + , [ "version" + , { "type": "if" + , "cond": {"type": "var", "name": "version"} + , "then": + { "type": "join" + , "separator": "." + , "$1": {"type": "var", "name": "version"} + } + , "else": null + } + ] + ] + , "body": + { "type": "env" + , "vars": ["name", "version", "cflags-files", "ldflags-files"] + } + } + ] + ] + , "body": + { "type": "RESULT" + , "artifacts": {"type": "var", "name": "libs"} + , "runfiles": {"type": "var", "name": "hdrs"} + , "provides": + { "type": "map_union" + , "$1": + [ { "type": "env" + , "vars": + [ "compile-deps" + , "compile-args" + , "link-deps" + , "link-args" + , "run-libs" + , "run-libs-args" + , "package" + ] + } + ] + } + } + } + } +} diff --git a/CC/prebuilt/RULES b/CC/prebuilt/RULES new file mode 100644 index 0000000..16f9f26 --- /dev/null +++ b/CC/prebuilt/RULES @@ -0,0 +1,147 @@ +{ "library": + { "doc": ["A prebuilt C++ library"] + , "target_fields": ["lib", "hdrs", "deps", "pkg-config"] + , "string_fields": + ["name", "version", "stage", "defines", "cflags", "ldflags"] + , "implicit": + { "defaults": [["./", "..", "defaults"]] + , "config_reader": [["CC", "prebuilt/read_pkgconfig.py"]] + } + , "config_vars": ["ENV"] + , "field_doc": + { "name": + [ "The name of the library (without leading \"lib\" or trailing file name" + , "extension), also used as name for pkg-config files." + ] + , "version": + [ "The library version, used for pkg-config files. Individual version" + , "components are joined with \".\"." + ] + , "lib": + [ "The actual prebuilt library. If multiple libraries are specified" + , "(e.g., one depends on the other), the order matters. Library types" + , "cannot be mixed. All of them have to be either static or shared." + ] + , "hdrs": ["Any public header files of the library."] + , "deps": ["Any other libraries this library depends upon."] + , "stage": + [ "The logical location of all header and source files, as well as the" + , "resulting library file. Individual directory components are joined" + , "with \"/\"." + ] + , "defines": + [ "List of defines set for this target and its consumers." + , "Each list entry will be prepended by \"-D\"." + ] + , "cflags": + ["List of compile flags set for this target and its consumers."] + , "ldflags": + ["Additional linker flags (typically for linking system libraries)."] + , "pkg-config": + [ "Pkg-config file for optional infer of public cflags and ldflags. If" + , "multiple files are specified (e.g., one depends on the other), the" + , "first one is used as entry. Note that if this field is non-empty the" + , "tool \"pkg-config\" must be available in \"PATH\", which is taken" + , "from [\"CC\", \"defaults\"] or the \"ENV\" variable." + ] + } + , "artifacts_doc": + [ "The actual library (libname.a or libname.so). Only static libraries are" + , "staged in the specified directory." + ] + , "runfiles_doc": ["The public headers staged to the specified directory."] + , "provides_doc": + { "compile-deps": + [ "Map of artifacts specifying any additional files that, besides the" + , "runfiles have to be present in compile actions of targets depending on" + , "this library." + ] + , "link-deps": + [ "Map of artifacts specifying any additional files that, besides the artifacts," + , "have to be present in a link actions of targets depending on this library" + ] + , "run-libs": + [ "Map of artifacts specifying all files, including the artifacts of this" + , "library if shared, that have to be present in link actions of targets" + , "depending on this library." + ] + , "link-args": + [ "List of strings that have to be added to the command line for linking" + , "actions in targets depending on this library." + ] + , "run-libs-args": + [ "List of strings that have to be added to the command line for linking" + , "runtime libraries in targets depending on this library." + ] + , "compile-args": + [ "List of strings that have to be added to the command line for compile" + , "actions in targets depending on this library." + ] + } + , "imports": + { "artifacts": ["./", "../..", "field_artifacts"] + , "artifacts_list": ["./", "../..", "field_artifacts_list"] + , "stage_field": ["", "stage_singleton_field"] + , "prebuilt result": "prebuilt result" + } + , "expression": + { "type": "let*" + , "bindings": + [ [ "name" + , { "type": "assert_non_empty" + , "msg": "name is required for prebuilt library" + , "$1": {"type": "join", "$1": {"type": "FIELD", "name": "name"}} + } + ] + , ["version", {"type": "FIELD", "name": "version"}] + , [ "stage" + , { "type": "join" + , "separator": "/" + , "$1": {"type": "FIELD", "name": "stage"} + } + ] + , [ "cflags" + , { "type": "++" + , "$1": + [ {"type": "FIELD", "name": "cflags"} + , { "type": "foreach" + , "var": "def" + , "range": {"type": "FIELD", "name": "defines"} + , "body": + {"type": "join", "$1": ["-D", {"type": "var", "name": "def"}]} + } + ] + } + ] + , ["ldflags", {"type": "FIELD", "name": "ldflags"}] + , [ "libs" + , { "type": "let*" + , "bindings": [["fieldname", "lib"]] + , "body": {"type": "CALL_EXPRESSION", "name": "artifacts_list"} + } + ] + , [ "hdrs" + , { "type": "let*" + , "bindings": [["fieldname", "hdrs"]] + , "body": {"type": "CALL_EXPRESSION", "name": "artifacts_list"} + } + ] + , [ "config_reader" + , { "type": "let*" + , "bindings": + [["fieldname", "config_reader"], ["location", "config_reader"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage_field"} + } + ] + , [ "pkg-configs" + , { "type": "let*" + , "bindings": [["fieldname", "pkg-config"]] + , "body": {"type": "CALL_EXPRESSION", "name": "artifacts_list"} + } + ] + , ["deps-fieldnames", ["deps"]] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "prebuilt result"} + } + } +} diff --git a/CC/prebuilt/read_pkgconfig.py b/CC/prebuilt/read_pkgconfig.py new file mode 100755 index 0000000..cb4154f --- /dev/null +++ b/CC/prebuilt/read_pkgconfig.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +# 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. + +import os +import subprocess +import sys +from pathlib import Path + + +def run_pkgconfig(args: list[str], env: dict[str, str]) -> str: + result = subprocess.run(["pkg-config"] + args, env=env, capture_output=True) + if result.returncode != 0: + print(result.stderr.decode("utf-8"), file=sys.stderr) + exit(1) + return result.stdout.decode("utf-8").strip() + + +def read_ldflags(pkg: str, env: dict[str, str]) -> str: + def libname(filename: str) -> str: + return filename.split(".")[0] + + local_libs = { + libname(f) + for it in os.walk(".") for f in it[2] if f.startswith("lib") + } + + link_flags = run_pkgconfig(["--libs-only-l", pkg], env).split(" ") + + # deduplicate, keep right-most + seen: set[str] = set() + link_flags = [ + f for f in link_flags[::-1] if f not in seen and not seen.add(f) + ][::-1] + + def is_local(flag: str) -> bool: + if not flag.startswith("-l"): + return False + lib = libname(flag[3:]) if flag.startswith("-l:") else f"lib{flag[2:]}" + return lib in local_libs + + return " ".join([f for f in link_flags if not is_local(f)]) + + +def read_pkgconfig(): + if len(sys.argv) < 3: + print(f"usage: read_pkgconfig OUT_NAME PC_FILE") + exit(1) + + name = sys.argv[1] + pkg = Path(sys.argv[2]).stem + env = dict(os.environ, PKG_CONFIG_PATH="./lib/pkgconfig") + + if name.endswith(".cflags"): + data = run_pkgconfig(["--cflags-only-other", pkg], env) + else: + data = read_ldflags(pkg, env) + + with open(f"{name}", 'w') as f: + f.write(data) + + +if __name__ == "__main__": + read_pkgconfig() diff --git a/CC/test/RULES b/CC/test/RULES index 3821339..b46d6b0 100644 --- a/CC/test/RULES +++ b/CC/test/RULES @@ -18,9 +18,12 @@ , "CXX" , "CFLAGS" , "CXXFLAGS" + , "LDFLAGS" , "ADD_CFLAGS" , "ADD_CXXFLAGS" + , "ADD_LDFLAGS" , "ENV" + , "BUILD_POSITION_INDEPENDENT" , "TEST_ENV" , "CC_TEST_LAUNCHER" ] @@ -65,6 +68,10 @@ [ "The flags for CXX to be used instead of the default ones" , "taken from the [\"CC\", \"defaults\"] target" ] + , "LDFLAGS": + [ "The linker flags do 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" @@ -73,7 +80,12 @@ [ "The flags to add to the default ones for CXX" , "taken from the [\"CC\", \"defaults\"] target" ] + , "ADD_LDFLAGS": + [ "The linker flags to add to the default ones" + , "taken from the [\"CC\", \"defaults\"] target" + ] , "ENV": ["The environment for any action generated."] + , "BUILD_POSITION_INDEPENDENT": ["Build with -fPIC."] , "TEST_ENV": ["The environment for executing the test runner."] , "CC_TEST_LAUNCHER": [ "List of strings representing the launcher that is prepend to the" @@ -101,6 +113,10 @@ , "compile-args-deps": ["./", "..", "compile-args-deps"] , "link-deps": ["./", "..", "link-deps"] , "link-args-deps": ["./", "..", "link-args-deps"] + , "run-libs-deps": ["./", "..", "run-libs-deps"] + , "run-libs-args-deps": ["./", "..", "run-libs-args-deps"] + , "cflags-files-deps": ["./", "..", "cflags-files-deps"] + , "ldflags-files-deps": ["./", "..", "ldflags-files-deps"] , "binary": ["./", "..", "bin artifact"] , "host transition": ["transitions", "for host"] } @@ -149,6 +165,9 @@ , ["defaults-transition", {"type": "var", "name": "host-trans"}] , ["deps-transition", {"type": "var", "name": "host-trans"}] , ["deps-fieldnames", ["private-deps"]] + , [ "cflags-files" + , {"type": "CALL_EXPRESSION", "name": "cflags-files-deps"} + ] , ["compile-deps", {"type": "CALL_EXPRESSION", "name": "compile-deps"}] , [ "compile-args" , { "type": "++" @@ -164,6 +183,9 @@ ] } ] + , [ "ldflags-files" + , {"type": "CALL_EXPRESSION", "name": "ldflags-files-deps"} + ] , ["link-deps", {"type": "CALL_EXPRESSION", "name": "link-deps"}] , [ "link-args" , { "type": "++" @@ -173,6 +195,10 @@ ] } ] + , ["run-libs", {"type": "CALL_EXPRESSION", "name": "run-libs-deps"}] + , [ "run-libs-args" + , {"type": "CALL_EXPRESSION", "name": "run-libs-args-deps"} + ] , ["binary", {"type": "CALL_EXPRESSION", "name": "binary"}] , [ "staged test binary" , { "type": "map_union" @@ -277,6 +303,7 @@ , {"type": "var", "name": "test-args"} , {"type": "var", "name": "test-launcher"} , {"type": "var", "name": "staged test binary"} + , {"type": "var", "name": "run-libs"} ] } , "cmd": ["./runner"] |