diff options
author | Oliver Reiche <oliver.reiche@huawei.com> | 2023-03-31 16:11:00 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2023-04-18 12:44:10 +0200 |
commit | 70a8b0714e1f8d91df2957c568484263b71b8e0e (patch) | |
tree | 348d31c279689c2f207e847eaab0058a2bb9fe95 | |
parent | d5a8ff34b7789a257a7acdbaeeefd16ff9575c25 (diff) | |
download | justbuild-70a8b0714e1f8d91df2957c568484263b71b8e0e.tar.gz |
rules: Support creating compile/link flags from pkg-config
-rw-r--r-- | rules/CC/pkgconfig/EXPRESSIONS | 136 | ||||
-rw-r--r-- | rules/CC/pkgconfig/RULES | 52 |
2 files changed, 188 insertions, 0 deletions
diff --git a/rules/CC/pkgconfig/EXPRESSIONS b/rules/CC/pkgconfig/EXPRESSIONS new file mode 100644 index 00000000..c7704213 --- /dev/null +++ b/rules/CC/pkgconfig/EXPRESSIONS @@ -0,0 +1,136 @@ +{ "pkgconfig result": + { "vars": ["ENV", "name", "args", "stage"] + , "imports": {"default-ENV": ["./", "..", "default-ENV"]} + , "expression": + { "type": "let*" + , "bindings": + [ [ "ENV" + , { "type": "map_union" + , "$1": + { "type": "++" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "default-ENV"} + , [ { "type": "var" + , "name": "ENV" + , "default": {"type": "empty_map"} + } + ] + ] + } + } + ] + , [ "cflags-filename" + , {"type": "join", "$1": [{"type": "var", "name": "name"}, ".cflags"]} + ] + , [ "cflags-files" + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "stage"} + , "$1": + { "type": "ACTION" + , "inputs": {"type": "empty_map"} + , "cmd": + [ "/bin/sh" + , "-c" + , { "type": "join" + , "separator": " " + , "$1": + { "type": "++" + , "$1": + [ ["pkg-config"] + , [ { "type": "join_cmd" + , "$1": + { "type": "++" + , "$1": + [ {"type": "var", "name": "args", "default": []} + , ["--cflags", {"type": "var", "name": "name"}] + ] + } + } + ] + , [">"] + , [ { "type": "join_cmd" + , "$1": {"type": "var", "name": "cflags-filename"} + } + ] + ] + } + } + ] + , "env": {"type": "var", "name": "ENV"} + , "outs": [{"type": "var", "name": "cflags-filename"}] + } + } + ] + , [ "compile-args" + , { "type": "foreach_map" + , "var_key": "flag-file" + , "range": {"type": "var", "name": "cflags-files"} + , "body": + {"type": "join", "$1": ["@", {"type": "var", "name": "flag-file"}]} + } + ] + , [ "ldflags-filename" + , {"type": "join", "$1": [{"type": "var", "name": "name"}, ".ldflags"]} + ] + , [ "ldflags-files" + , { "type": "to_subdir" + , "subdir": {"type": "var", "name": "stage"} + , "$1": + { "type": "ACTION" + , "inputs": {"type": "empty_map"} + , "cmd": + [ "/bin/sh" + , "-c" + , { "type": "join" + , "separator": " " + , "$1": + { "type": "++" + , "$1": + [ ["pkg-config"] + , [ { "type": "join_cmd" + , "$1": + { "type": "++" + , "$1": + [ {"type": "var", "name": "args", "default": []} + , ["--libs", {"type": "var", "name": "name"}] + ] + } + } + ] + , [">"] + , [ { "type": "join_cmd" + , "$1": {"type": "var", "name": "ldflags-filename"} + } + ] + ] + } + } + ] + , "env": {"type": "var", "name": "ENV"} + , "outs": [{"type": "var", "name": "ldflags-filename"}] + } + } + ] + , [ "link-args" + , { "type": "foreach_map" + , "var_key": "flag-file" + , "range": {"type": "var", "name": "ldflags-files"} + , "body": + {"type": "join", "$1": ["@", {"type": "var", "name": "flag-file"}]} + } + ] + , ["package", {"type": "env", "vars": ["cflags-files", "ldflags-files"]}] + , ["compile-deps", {"type": "empty_map"}] + , ["link-deps", {"type": "empty_map"}] + ] + , "body": + { "type": "RESULT" + , "provides": + { "type": "env" + , "vars": + ["compile-deps", "compile-args", "link-deps", "link-args", "package"] + } + } + } + } +} diff --git a/rules/CC/pkgconfig/RULES b/rules/CC/pkgconfig/RULES new file mode 100644 index 00000000..a6f6ce84 --- /dev/null +++ b/rules/CC/pkgconfig/RULES @@ -0,0 +1,52 @@ +{ "system_library": + { "doc": ["A system library via pkg-config"] + , "string_fields": ["name", "args", "stage"] + , "implicit": {"defaults": [["./", "..", "defaults"]]} + , "config_vars": ["PKG_CONFIG_ARGS", "ENV"] + , "field_doc": + { "name": ["The pkg-config name of the library."] + , "args": + [ "Additional pkg-config arguments (e.g., \"--define-prefix\" or" + , "\"--static\"), appended to the config variable \"PKG_CONFIG_ARGS\"." + ] + , "stage": ["The stage of the internally created flag files."] + } + , "config_doc": + { "PKG_CONFIG_ARGS": + [ "Additional pkg-config arguments (e.g., \"--define-prefix\" or" + , "\"--static\")." + ] + , "ENV": + [ "The environment for any action generated. May contain colon-separated" + , "\"PKG_CONFIG_PATH\" for looking up pkg-config files." + ] + } + , "imports": {"pkgconfig result": "pkgconfig result"} + , "expression": + { "type": "let*" + , "bindings": + [ [ "name" + , { "type": "assert_non_empty" + , "msg": "system_library requires non-empty name" + , "$1": {"type": "join", "$1": {"type": "FIELD", "name": "name"}} + } + ] + , [ "args" + , { "type": "++" + , "$1": + [ {"type": "var", "name": "PKG_CONFIG_ARGS", "default": []} + , {"type": "FIELD", "name": "args"} + ] + } + ] + , [ "stage" + , { "type": "join" + , "separator": "/" + , "$1": {"type": "FIELD", "name": "stage"} + } + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "pkgconfig result"} + } + } +} |