diff options
Diffstat (limited to 'CC/prebuilt')
-rw-r--r-- | CC/prebuilt/EXPRESSIONS | 503 | ||||
-rw-r--r-- | CC/prebuilt/RULES | 147 | ||||
-rwxr-xr-x | CC/prebuilt/read_pkgconfig.py | 77 |
3 files changed, 0 insertions, 727 deletions
diff --git a/CC/prebuilt/EXPRESSIONS b/CC/prebuilt/EXPRESSIONS deleted file mode 100644 index b84e494..0000000 --- a/CC/prebuilt/EXPRESSIONS +++ /dev/null @@ -1,503 +0,0 @@ -{ "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"] - , "default-PATH": ["./", "..", "default-PATH"] - } - , "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": "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": "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" - , { "type": "map_union" - , "$1": - [ {"type": "var", "name": "ENV"} - , { "type": "singleton_map" - , "key": "PATH" - , "value": - { "type": "join" - , "separator": ":" - , "$1": - { "type": "++" - , "$1": - [ {"type": "CALL_EXPRESSION", "name": "default-PATH"} - , { "type": "if" - , "cond": {"type": "var", "name": "ENV_PATH"} - , "then": [{"type": "var", "name": "ENV_PATH"}] - } - ] - } - } - } - ] - } - ] - , [ "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": "var", "name": "link-deps"} - , {"type": "var", "name": "run-libs"} - , { "type": "to_subdir" - , "subdir": "pkgconfig" - , "flat": true - , "$1": - { "type": "map_union" - , "$1": {"type": "var", "name": "pkg-configs", "default": []} - } - } - ] - } - } - ] - , [ "pc-args" - , { "type": "if" - , "cond": {"type": "var", "name": "shared"} - , "then": [] - , "else": ["--static"] - } - ] - , [ "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": - { "type": "++" - , "$1": - [ [ "./config_reader" - , {"type": "var", "name": "cflags-filename"} - , {"type": "var", "name": "main-pkg-config"} - ] - , {"type": "var", "name": "pc-args"} - ] - } - , "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": - { "type": "++" - , "$1": - [ [ "./config_reader" - , {"type": "var", "name": "ldflags-filename"} - , {"type": "var", "name": "main-pkg-config"} - ] - , {"type": "var", "name": "pc-args"} - ] - } - , "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" - , { "type": "map_union" - , "$1": - [ { "type": "if" - , "cond": {"type": "var", "name": "shared"} - , "then": {"type": "var", "name": "libs"} - , "else": {"type": "empty_map"} - } - , {"type": "var", "name": "run-libs"} - ] - } - ] - , [ "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 deleted file mode 100644 index 16f9f26..0000000 --- a/CC/prebuilt/RULES +++ /dev/null @@ -1,147 +0,0 @@ -{ "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 deleted file mode 100755 index 115c305..0000000 --- a/CC/prebuilt/read_pkgconfig.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/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 -from typing import Dict, List, Set - - -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, args: List[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(args + ["--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() -> None: - if len(sys.argv) < 3: - print(f"usage: read_pkgconfig OUT_NAME PC_FILE [PC_ARGS...]") - exit(1) - - name = sys.argv[1] - pkg = Path(sys.argv[2]).stem - args = sys.argv[3:] - env = dict(os.environ, PKG_CONFIG_PATH="./lib/pkgconfig") - - if name.endswith(".cflags"): - data = run_pkgconfig(args + ["--cflags-only-other", pkg], env) - else: - data = read_ldflags(pkg, args, env) - - with open(f"{name}", 'w') as f: - f.write(data) - - -if __name__ == "__main__": - read_pkgconfig() |