summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CC/EXPRESSIONS491
-rw-r--r--CC/RULES116
-rw-r--r--CC/TARGETS1
-rw-r--r--CC/foreign/EXPRESSIONS34
-rw-r--r--CC/foreign/cmake/EXPRESSIONS192
-rw-r--r--CC/foreign/cmake/RULES594
-rw-r--r--CC/foreign/make/EXPRESSIONS284
-rw-r--r--CC/foreign/make/RULES676
-rw-r--r--CC/prebuilt/EXPRESSIONS459
-rw-r--r--CC/prebuilt/RULES147
-rwxr-xr-xCC/prebuilt/read_pkgconfig.py75
-rw-r--r--CC/test/RULES19
-rw-r--r--shell/test/EXPRESSIONS40
-rw-r--r--shell/test/RULES6
-rwxr-xr-xshell/test/test_runner.sh1
-rw-r--r--transitions/EXPRESSIONS16
16 files changed, 3138 insertions, 13 deletions
diff --git a/CC/EXPRESSIONS b/CC/EXPRESSIONS
index c3541cd..a520cde 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"]}
@@ -256,6 +271,69 @@
}
}
}
+, "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"]
@@ -656,12 +734,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"}
}
@@ -670,12 +757,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"}
}
@@ -689,6 +785,7 @@
, "CXXFLAGS"
, "ADD_CFLAGS"
, "ADD_CXXFLAGS"
+ , "BUILD_POSITION_INDEPENDENT"
, "pure C"
, "defaults-transition"
]
@@ -710,6 +807,7 @@
, "ADD_CXXFLAGS"
, "AR"
, "ENV"
+ , "BUILD_POSITION_INDEPENDENT"
, "name"
, "pure C"
, "srcs"
@@ -829,6 +927,7 @@
, "ADD_CXXFLAGS"
, "AR"
, "ENV"
+ , "BUILD_POSITION_INDEPENDENT"
, "name"
, "pure C"
, "srcs"
@@ -836,6 +935,7 @@
, "private-hdrs"
, "cflags"
, "private-cflags"
+ , "ldflags"
, "private-ldflags"
, "stage"
, "pkg-name"
@@ -848,6 +948,8 @@
, "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"
@@ -880,12 +982,19 @@
{ "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"}
]
@@ -926,6 +1035,331 @@
, "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"
]
}
@@ -945,9 +1379,12 @@
, "CXX"
, "CFLAGS"
, "CXXFLAGS"
+ , "LDFLAGS"
, "ADD_CFLAGS"
, "ADD_CXXFLAGS"
+ , "ADD_LDFLAGS"
, "ENV"
+ , "BUILD_POSITION_INDEPENDENT"
, "name"
, "pure C"
, "srcs"
@@ -957,6 +1394,8 @@
, "compile-args"
, "link-deps"
, "link-args"
+ , "run-libs"
+ , "run-libs-args"
, "cflags-files"
, "ldflags-files"
, "defaults-transition"
@@ -966,6 +1405,7 @@
, "flags": "flags"
, "objects": "objects"
, "default-ENV": "default-ENV"
+ , "default-LDFLAGS": "default-LDFLAGS"
}
, "expression":
{ "type": "let*"
@@ -979,6 +1419,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":
@@ -1029,6 +1481,7 @@
, "$1":
[ {"type": "var", "name": "objects"}
, {"type": "var", "name": "link-deps"}
+ , {"type": "var", "name": "run-libs"}
, { "type": "var"
, "name": "cflags-files"
, "default": {"type": "empty_map"}
@@ -1043,11 +1496,15 @@
{ "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"}
@@ -1064,9 +1521,12 @@
, "CXX"
, "CFLAGS"
, "CXXFLAGS"
+ , "LDFLAGS"
, "ADD_CFLAGS"
, "ADD_CXXFLAGS"
+ , "ADD_LDFLAGS"
, "ENV"
+ , "BUILD_POSITION_INDEPENDENT"
, "name"
, "pure C"
, "srcs"
@@ -1081,6 +1541,8 @@
, "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"
@@ -1110,6 +1572,10 @@
}
}
]
+ , ["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"}
]
@@ -1121,7 +1587,7 @@
, "body":
{ "type": "RESULT"
, "artifacts": {"type": "CALL_EXPRESSION", "name": "binary"}
- , "provides": {"type": "env", "vars": ["package"]}
+ , "provides": {"type": "env", "vars": ["run-libs", "package"]}
}
}
}
@@ -1132,6 +1598,8 @@
, "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"
}
, "expression":
@@ -1190,6 +1658,13 @@
, "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"}
@@ -1222,6 +1697,7 @@
, "else": [{"type": "var", "name": "artifacts"}]
}
, [{"type": "var", "name": "link-deps"}]
+ , [{"type": "var", "name": "run-libs"}]
]
}
}
@@ -1260,6 +1736,11 @@
, "provider": "link-args"
, "default": []
}
+ , { "type": "DEP_PROVIDES"
+ , "dep": {"type": "var", "name": "target"}
+ , "provider": "run-libs-args"
+ , "default": []
+ }
]
}
]
diff --git a/CC/RULES b/CC/RULES
index ff642b9..960c8d9 100644
--- a/CC/RULES
+++ b/CC/RULES
@@ -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,18 +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":
@@ -166,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)."
@@ -182,6 +211,18 @@
, "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."
@@ -208,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"
@@ -220,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"]
@@ -252,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":
@@ -322,7 +395,9 @@
}
}
]
+ , ["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"}
@@ -331,10 +406,20 @@
, "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":
@@ -349,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"]
@@ -396,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"
@@ -404,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"]
diff --git a/CC/TARGETS b/CC/TARGETS
index 2da456b..8860e8b 100644
--- a/CC/TARGETS
+++ b/CC/TARGETS
@@ -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 6903580..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,8 @@
, "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"]
@@ -181,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"
@@ -285,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"]
diff --git a/shell/test/EXPRESSIONS b/shell/test/EXPRESSIONS
index d9b1fbc..ea36b32 100644
--- a/shell/test/EXPRESSIONS
+++ b/shell/test/EXPRESSIONS
@@ -12,6 +12,7 @@
, "imports":
{ "artifacts_list": ["./", "../..", "field_artifacts_list"]
, "runfiles_list": ["./", "../..", "field_runfiles_list"]
+ , "map_provider": ["./", "../..", "field_map_provider"]
}
, "expression":
{ "type": "let*"
@@ -66,6 +67,19 @@
}
}
]
+ , [ "run-libs"
+ , { "type": "TREE"
+ , "$1":
+ { "type": "let*"
+ , "bindings":
+ [ ["fieldname", {"type": "var", "name": "deps-fieldname"}]
+ , ["provider", "run-libs"]
+ , ["transition", {"type": "var", "name": "deps-transition"}]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"}
+ }
+ }
+ ]
, [ "attempt marker"
, { "type": "if"
, "cond":
@@ -104,6 +118,10 @@
, "key": "work"
, "value": {"type": "var", "name": "deps"}
}
+ , { "type": "singleton_map"
+ , "key": "libs"
+ , "value": {"type": "var", "name": "run-libs"}
+ }
, {"type": "var", "name": "runner"}
, {"type": "var", "name": "test.sh"}
, {"type": "var", "name": "attempt marker"}
@@ -114,7 +132,27 @@
, {"type": "++", "$1": [["./runner"], {"type": "var", "name": "keep"}]}
]
, [ "test_env"
- , {"type": "var", "name": "TEST_ENV", "default": {"type": "empty_map"}}
+ , { "type": "map_union"
+ , "$1":
+ [ { "type": "if"
+ , "cond":
+ { "type": "=="
+ , "$1": {"type": "var", "name": "ATTEMPT"}
+ , "$2": null
+ }
+ , "then": {"type": "empty_map"}
+ , "else":
+ { "type": "singelton_map"
+ , "key": "TEST_RUN_NUMBER"
+ , "value": {"type": "var", "name": "ATTEMPT"}
+ }
+ }
+ , { "type": "var"
+ , "name": "TEST_ENV"
+ , "default": {"type": "empty_map"}
+ }
+ ]
+ }
]
]
, "body":
diff --git a/shell/test/RULES b/shell/test/RULES
index 98bf27c..19f859f 100644
--- a/shell/test/RULES
+++ b/shell/test/RULES
@@ -12,6 +12,10 @@
, "TEST_TMPDIR. The test should not assume write permissions"
, "outside the working directory and the TEST_TMPDIR."
, "For convenience, the environment variable TMPDIR is also set to TEST_TMPDIR."
+ , ""
+ , "If the configuration variable RUNS_PER_TEST is set, the environment"
+ , "variable TEST_RUN_NUMBER will also be set to the number of the attempt,"
+ , "counting from 0."
]
, "name":
[ "A name for the test, used in reporting, as well as for staging"
@@ -32,7 +36,7 @@
[ "The number of times the test should be run in order to detect flakyness."
, "If set, no test action will be taken from cache."
]
- , "TEST_ENV": ["The environment for executing the test runner."]
+ , "TEST_ENV": ["Additional environment for executing the test runner."]
}
, "tainted": ["test"]
, "artifacts_doc":
diff --git a/shell/test/test_runner.sh b/shell/test/test_runner.sh
index a99d5b7..97c75ef 100755
--- a/shell/test/test_runner.sh
+++ b/shell/test/test_runner.sh
@@ -25,6 +25,7 @@ echo UNKNOWN > time-stop
mkdir scratch
export TEST_TMPDIR=$(realpath scratch)
export TMPDIR="${TEST_TMPDIR}"
+export LD_LIBRARY_PATH=$(realpath ./libs):$LD_LIBRARY_PATH
# Change to the working directory; note: while unlikely, the test
# might not have test data, so we have to ensure the presence of
diff --git a/transitions/EXPRESSIONS b/transitions/EXPRESSIONS
index 8ea7550..92be685 100644
--- a/transitions/EXPRESSIONS
+++ b/transitions/EXPRESSIONS
@@ -10,4 +10,20 @@
}
}
}
+, "with fPIC":
+ { "doc":
+ [ "Transition that enables BUILD_POSITION_INDEPENDENT if config_field"
+ , "\"shared\" is not empty."
+ ]
+ , "expression":
+ { "type": "if"
+ , "cond": {"type": "FIELD", "name": "shared"}
+ , "then":
+ { "type": "singleton_map"
+ , "key": "BUILD_POSITION_INDEPENDENT"
+ , "value": true
+ }
+ , "else": {"type": "empty_map"}
+ }
+ }
}