diff options
Diffstat (limited to 'rules/CC/pkgconfig')
-rw-r--r-- | rules/CC/pkgconfig/EXPRESSIONS | 296 | ||||
-rw-r--r-- | rules/CC/pkgconfig/RULES | 124 | ||||
-rw-r--r-- | rules/CC/pkgconfig/TARGETS | 1 | ||||
-rwxr-xr-x | rules/CC/pkgconfig/add_rpath | 24 |
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 |