summaryrefslogtreecommitdiff
path: root/rules/CC/pkgconfig
diff options
context:
space:
mode:
Diffstat (limited to 'rules/CC/pkgconfig')
-rw-r--r--rules/CC/pkgconfig/EXPRESSIONS296
-rw-r--r--rules/CC/pkgconfig/RULES124
-rw-r--r--rules/CC/pkgconfig/TARGETS1
-rwxr-xr-xrules/CC/pkgconfig/add_rpath24
4 files changed, 445 insertions, 0 deletions
diff --git a/rules/CC/pkgconfig/EXPRESSIONS b/rules/CC/pkgconfig/EXPRESSIONS
new file mode 100644
index 0000000..72d66fd
--- /dev/null
+++ b/rules/CC/pkgconfig/EXPRESSIONS
@@ -0,0 +1,296 @@
+{ "pkgconfig result":
+ { "vars": ["ENV", "name", "args", "stage"]
+ , "imports":
+ { "default-ENV": ["./", "..", "default-ENV"]
+ , "default-PATH": ["./", "..", "default-PATH"]
+ , "stage": ["", "stage_singleton_field"]
+ , "list_provider": ["", "field_list_provider"]
+ , "map_provider": ["", "field_map_provider"]
+ , "sh": ["shell", "sh"]
+ , "sh-PATH": ["shell", "PATH"]
+ }
+ , "expression":
+ { "type": "let*"
+ , "bindings":
+ [ [ "ENV"
+ , { "type": "map_union"
+ , "$1":
+ [ {"type": "CALL_EXPRESSION", "name": "default-ENV"}
+ , {"type": "var", "name": "ENV", "default": {"type": "empty_map"}}
+ ]
+ }
+ ]
+ , [ "ENV_PATH"
+ , { "type": "lookup"
+ , "map": {"type": "var", "name": "ENV"}
+ , "key": "PATH"
+ }
+ ]
+ , [ "ENV_PKG_CONFIG_PATH"
+ , { "type": "lookup"
+ , "map": {"type": "var", "name": "ENV"}
+ , "key": "PKG_CONFIG_PATH"
+ }
+ ]
+ , [ "sh-PATH"
+ , { "type": "let*"
+ , "bindings": [["fieldname", "shell defaults"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "sh-PATH"}
+ }
+ ]
+ , [ "pkgconfig PATH"
+ , { "type": "let*"
+ , "bindings":
+ [["fieldname", "pkgconfig defaults"], ["provider", "PATH"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"}
+ }
+ ]
+ , [ "PKG_CONFIG_PATH"
+ , { "type": "let*"
+ , "bindings":
+ [ ["fieldname", "pkgconfig defaults"]
+ , ["provider", "PKG_CONFIG_PATH"]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"}
+ }
+ ]
+ , [ "final PATH"
+ , { "type": "join"
+ , "separator": ":"
+ , "$1":
+ { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "pkgconfig PATH"}
+ , {"type": "CALL_EXPRESSION", "name": "default-PATH"}
+ , {"type": "var", "name": "sh-PATH"}
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "ENV_PATH"}
+ , "then": [{"type": "var", "name": "ENV_PATH"}]
+ }
+ ]
+ }
+ }
+ ]
+ , [ "final PKG_CONFIG_PATH"
+ , { "type": "join"
+ , "separator": ":"
+ , "$1":
+ { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "PKG_CONFIG_PATH"}
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "ENV_PKG_CONFIG_PATH"}
+ , "then": [{"type": "var", "name": "ENV_PKG_CONFIG_PATH"}]
+ }
+ ]
+ }
+ }
+ ]
+ , [ "ENV"
+ , { "type": "map_union"
+ , "$1":
+ [ {"type": "var", "name": "ENV"}
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "final PATH"}
+ , "else": {"type": "empty_map"}
+ , "then":
+ { "type": "singleton_map"
+ , "key": "PATH"
+ , "value": {"type": "var", "name": "final PATH"}
+ }
+ }
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "final PKG_CONFIG_PATH"}
+ , "else": {"type": "empty_map"}
+ , "then":
+ { "type": "singleton_map"
+ , "key": "PKG_CONFIG_PATH"
+ , "value": {"type": "var", "name": "final PKG_CONFIG_PATH"}
+ }
+ }
+ ]
+ }
+ ]
+ , ["TOOLCHAIN_DIR", "toolchain"]
+ , [ "shell TOOLCHAIN"
+ , { "type": "to_subdir"
+ , "subdir": {"type": "var", "name": "TOOLCHAIN_DIR"}
+ , "$1":
+ { "type": "let*"
+ , "bindings":
+ [ ["fieldname", "shell defaults"]
+ , ["provider", "TOOLCHAIN"]
+ , ["default", {"type": "empty_map"}]
+ ]
+ , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"}
+ }
+ }
+ ]
+ , [ "sh"
+ , { "type": "let*"
+ , "bindings": [["fieldname", "shell defaults"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "sh"}
+ }
+ ]
+ , [ "pkg-config"
+ , { "type": "join"
+ , "$1":
+ { "type": "let*"
+ , "bindings":
+ [["fieldname", "pkgconfig defaults"], ["provider", "pkg-config"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"}
+ }
+ }
+ ]
+ , [ "pkg-config"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "pkg-config"}
+ , "then": {"type": "var", "name": "pkg-config"}
+ , "else": "pkg-config"
+ }
+ ]
+ , [ "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": "var", "name": "shell TOOLCHAIN"}
+ , "cmd":
+ [ {"type": "var", "name": "sh"}
+ , "-c"
+ , { "type": "join"
+ , "separator": " "
+ , "$1":
+ { "type": "++"
+ , "$1":
+ [ [{"type": "var", "name": "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": "ACTION"
+ , "inputs": {"type": "var", "name": "shell TOOLCHAIN"}
+ , "cmd":
+ [ {"type": "var", "name": "sh"}
+ , "-c"
+ , { "type": "join"
+ , "separator": " "
+ , "$1":
+ { "type": "++"
+ , "$1":
+ [ [{"type": "var", "name": "pkg-config"}]
+ , [ { "type": "join_cmd"
+ , "$1":
+ { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "args", "default": []}
+ , ["--libs", {"type": "var", "name": "name"}]
+ ]
+ }
+ }
+ ]
+ , [">", "ldflags.raw"]
+ ]
+ }
+ }
+ ]
+ , "env": {"type": "var", "name": "ENV"}
+ , "outs": ["ldflags.raw"]
+ }
+ ]
+ , [ "add_rpath"
+ , { "type": "let*"
+ , "bindings": [["fieldname", "add_rpath"], ["location", "add_rpath"]]
+ , "body": {"type": "CALL_EXPRESSION", "name": "stage"}
+ }
+ ]
+ , [ "ldflags-files"
+ , { "type": "to_subdir"
+ , "subdir": {"type": "var", "name": "stage"}
+ , "$1":
+ { "type": "ACTION"
+ , "inputs":
+ { "type": "map_union"
+ , "$1":
+ [ {"type": "var", "name": "add_rpath"}
+ , {"type": "var", "name": "ldflags-files"}
+ , {"type": "var", "name": "shell TOOLCHAIN"}
+ ]
+ }
+ , "cmd":
+ [ {"type": "var", "name": "sh"}
+ , "-c"
+ , { "type": "join"
+ , "separator": " "
+ , "$1":
+ [ "./add_rpath $(cat ldflags.raw)"
+ , ">"
+ , { "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 0000000..f72fdf6
--- /dev/null
+++ b/rules/CC/pkgconfig/RULES
@@ -0,0 +1,124 @@
+{ "defaults":
+ { "doc": ["A rule to provide defaults for pkgconfig"]
+ , "string_fields": ["pkg-config", "PATH", "PKG_CONFIG_PATH"]
+ , "target_fields": ["base"]
+ , "field_doc":
+ { "pkg-config":
+ ["The name of the pkg-config binary to use, potentially with full path."]
+ , "PATH": ["Additional paths to add to \"PATH\" when calling pkg-config"]
+ , "PKG_CONFIG_PATH":
+ [ "Additional paths to add to \"PKG_CONFIG_PATH\" when calling pkg-config"
+ ]
+ , "base": ["Other targets (using the same rule) to inherit from."]
+ }
+ , "imports":
+ { "base-provides": ["./", "..", "defaults-base-provides"]
+ , "base-provides-++": ["./", "..", "defaults-base-provides-++"]
+ }
+ , "expression":
+ { "type": "let*"
+ , "bindings":
+ [ ["pkg-config", {"type": "FIELD", "name": "pkg-config"}]
+ , ["provider", "pkg-config"]
+ , [ "pkg-config"
+ , { "type": "if"
+ , "cond": {"type": "var", "name": "pkg-config"}
+ , "then": {"type": "var", "name": "pkg-config"}
+ , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"}
+ }
+ ]
+ , ["PATH", {"type": "FIELD", "name": "PATH"}]
+ , ["provider", "PATH"]
+ , [ "PATH"
+ , { "type": "nub_left"
+ , "$1":
+ { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "PATH"}
+ , {"type": "CALL_EXPRESSION", "name": "base-provides-++"}
+ ]
+ }
+ }
+ ]
+ , ["PKG_CONFIG_PATH", {"type": "FIELD", "name": "PKG_CONFIG_PATH"}]
+ , ["provider", "PKG_CONFIG_PATH"]
+ , [ "PKG_CONFIG_PATH"
+ , { "type": "nub_left"
+ , "$1":
+ { "type": "++"
+ , "$1":
+ [ {"type": "var", "name": "PKG_CONFIG_PATH"}
+ , {"type": "CALL_EXPRESSION", "name": "base-provides-++"}
+ ]
+ }
+ }
+ ]
+ ]
+ , "body":
+ { "type": "RESULT"
+ , "provides":
+ {"type": "env", "vars": ["pkg-config", "PATH", "PKG_CONFIG_PATH"]}
+ }
+ }
+ }
+, "system_library":
+ { "doc": ["A system library via pkg-config"]
+ , "string_fields": ["name", "args", "stage"]
+ , "implicit":
+ { "defaults": [["./", "..", "defaults"]]
+ , "shell defaults": [["shell", "defaults"]]
+ , "add_rpath": ["add_rpath"]
+ , "pkgconfig 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."]
+ , "defaults": ["The C/C++ toolchain to use"]
+ , "pkgconfig defaults": ["The pkgconfig configuration to use"]
+ }
+ , "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; this variable,"
+ , "as well as \"PATH\", is prefixed by the values provided in"
+ , "the \"defaults\"."
+ ]
+ }
+ , "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"}
+ }
+ }
+}
diff --git a/rules/CC/pkgconfig/TARGETS b/rules/CC/pkgconfig/TARGETS
new file mode 100644
index 0000000..705d1d7
--- /dev/null
+++ b/rules/CC/pkgconfig/TARGETS
@@ -0,0 +1 @@
+{"defaults": {"type": "defaults"}}
diff --git a/rules/CC/pkgconfig/add_rpath b/rules/CC/pkgconfig/add_rpath
new file mode 100755
index 0000000..d020f2b
--- /dev/null
+++ b/rules/CC/pkgconfig/add_rpath
@@ -0,0 +1,24 @@
+#!/bin/sh
+# 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.
+
+for x in "$@"
+do
+ echo -n '' "$x"
+ case $x in
+ -L*) echo -n '' -Xlinker -rpath -Xlinker "$(expr "$x" : "..\(.*\)")"
+ ;;
+ esac
+done
+echo