diff options
author | Oliver Reiche <oliver.reiche@huawei.com> | 2023-04-06 18:16:50 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2023-04-18 12:44:10 +0200 |
commit | b6c862820e62cfcf43f7dc05e149e5c29746f89d (patch) | |
tree | 2e9ad45d01ea5616b4ca6575ff02f2e1a8f4a84f | |
parent | aaa3bff3e4c6373028d8dc1a0b170d3bd7690e24 (diff) | |
download | justbuild-b6c862820e62cfcf43f7dc05e149e5c29746f89d.tar.gz |
rules: Support protoc/grpc_cpp_plugin from defaults
-rw-r--r-- | rules/CC/EXPRESSIONS | 3 | ||||
-rw-r--r-- | rules/CC/proto/EXPRESSIONS | 162 | ||||
-rw-r--r-- | rules/CC/proto/RULES | 233 | ||||
-rw-r--r-- | rules/CC/proto/TARGETS | 13 |
4 files changed, 337 insertions, 74 deletions
diff --git a/rules/CC/EXPRESSIONS b/rules/CC/EXPRESSIONS index 3433598e..c3541cd6 100644 --- a/rules/CC/EXPRESSIONS +++ b/rules/CC/EXPRESSIONS @@ -100,7 +100,7 @@ } , "defaults-base-provides": { "doc": ["Query list-provider from 'base' targets (last wins)"] - , "vars": ["provider"] + , "vars": ["provider", "default"] , "vars_doc": {"provider": ["The name of the list-provider in the provides map."]} , "imports": {"provider_list": ["./", "..", "field_provider_list"]} @@ -110,6 +110,7 @@ , "body": { "type": "foldl" , "var": "next" + , "start": {"type": "var", "name": "default", "default": []} , "accum_var": "curr" , "range": {"type": "CALL_EXPRESSION", "name": "provider_list"} , "body": diff --git a/rules/CC/proto/EXPRESSIONS b/rules/CC/proto/EXPRESSIONS index 3341637b..d2705f16 100644 --- a/rules/CC/proto/EXPRESSIONS +++ b/rules/CC/proto/EXPRESSIONS @@ -1,4 +1,81 @@ -{ "protoc-deps": +{ "default-PROTOC": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "../..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "proto-defaults"] + , ["provider", "PROTOC"] + , [ "transition" + , {"type": "var", "name": "defaults-transition", "default": null} + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } +, "default-LDFLAGS": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "../..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "proto-defaults"] + , ["provider", "LDFLAGS"] + , [ "transition" + , {"type": "var", "name": "defaults-transition", "default": null} + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } +, "default-GRPC_PLUGIN": + { "vars": ["defaults-transition"] + , "imports": {"list_provider": ["./", "../..", "field_list_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "proto-defaults"] + , ["provider", "GRPC_PLUGIN"] + , [ "transition" + , {"type": "var", "name": "defaults-transition", "default": null} + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "list_provider"} + } + } +, "default-ENV": + { "vars": ["defaults-transition"] + , "imports": {"map_provider": ["./", "../..", "field_map_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "proto-defaults"] + , ["provider", "ENV"] + , [ "transition" + , {"type": "var", "name": "defaults-transition", "default": null} + ] + , ["default", {"type": "empty_map"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} + } + } +, "default-TOOLCHAIN": + { "vars": ["defaults-transition"] + , "imports": {"map_provider": ["./", "../..", "field_map_provider"]} + , "expression": + { "type": "let*" + , "bindings": + [ ["fieldname", "proto-defaults"] + , ["provider", "TOOLCHAIN"] + , [ "transition" + , {"type": "var", "name": "defaults-transition", "default": null} + ] + , ["default", {"type": "empty_map"}] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "map_provider"} + } + } +, "protoc-deps": { "imports": {"map_provider": ["./", "../..", "field_map_provider"]} , "expression": { "type": "let*" @@ -16,7 +93,6 @@ , "name" , "stage" , "service support" - , "deps-transition" , "public-fieldnames" , "private-fieldnames" ] @@ -26,47 +102,57 @@ , "runfiles": ["./", "../..", "field_runfiles"] , "artifacts_list": ["./", "../..", "field_artifacts_list"] , "protoc-deps": "protoc-deps" + , "default-PROTOC": "default-PROTOC" + , "default-LDFLAGS": "default-LDFLAGS" + , "default-GRPC_PLUGIN": "default-GRPC_PLUGIN" + , "default-ENV": "default-ENV" + , "default-TOOLCHAIN": "default-TOOLCHAIN" } , "expression": { "type": "let*" , "bindings": [ ["pure C", false] - , [ "protoc" - , { "type": "let*" - , "bindings": - [ ["fieldname", "protoc"] - , ["transition", {"type": "var", "name": "deps-transition"}] - , ["location", "protoc"] - ] - , "body": {"type": "CALL_EXPRESSION", "name": "stage"} - } - ] - , [ "grpc_cpp_plugin" + , ["TOOLCHAIN_DIR", "toolchain"] + , ["TOOLCHAIN", {"type": "CALL_EXPRESSION", "name": "default-TOOLCHAIN"}] + , [ "TOOLCHAIN" , { "type": "if" - , "cond": {"type": "var", "name": "service support"} + , "cond": {"type": "var", "name": "TOOLCHAIN"} , "then": - { "type": "let*" - , "bindings": - [ ["fieldname", "grpc_cpp_plugin"] - , ["transition", {"type": "var", "name": "deps-transition"}] - , ["location", "grpc_cpp_plugin"] + { "type": "to_subdir" + , "subdir": {"type": "var", "name": "TOOLCHAIN_DIR"} + , "$1": {"type": "var", "name": "TOOLCHAIN"} + } + } + ] + , [ "PROTOC" + , { "type": "join" + , "$1": + { "type": "++" + , "$1": + [ { "type": "if" + , "cond": {"type": "var", "name": "TOOLCHAIN"} + , "then": ["./", {"type": "var", "name": "TOOLCHAIN_DIR"}, "/"] + } + , {"type": "CALL_EXPRESSION", "name": "default-PROTOC"} ] - , "body": {"type": "CALL_EXPRESSION", "name": "stage"} } - , "else": {"type": "empty_map"} } ] - , ["protoc-deps", {"type": "CALL_EXPRESSION", "name": "protoc-deps"}] - , [ "proto deps" - , { "type": "to_subdir" - , "subdir": "work" + , [ "GRPC_PLUGIN" + , { "type": "join" , "$1": - { "type": "let*" - , "bindings": [["fieldname", "proto-deps"]] - , "body": {"type": "CALL_EXPRESSION", "name": "runfiles"} + { "type": "++" + , "$1": + [ { "type": "if" + , "cond": {"type": "var", "name": "TOOLCHAIN"} + , "then": ["./", {"type": "var", "name": "TOOLCHAIN_DIR"}, "/"] + } + , {"type": "CALL_EXPRESSION", "name": "default-GRPC_PLUGIN"} + ] } } ] + , ["protoc-deps", {"type": "CALL_EXPRESSION", "name": "protoc-deps"}] , [ "proto srcs" , { "type": "disjoint_map_union" , "msg": "Sources may not conflict" @@ -139,12 +225,20 @@ , [ "cmd" , { "type": "++" , "$1": - [ ["./protoc", "--proto_path=work", "--cpp_out=work"] + [ [ {"type": "var", "name": "PROTOC"} + , "--proto_path=work" + , "--cpp_out=work" + ] , { "type": "if" , "cond": {"type": "var", "name": "service support"} , "then": [ "--grpc_out=work" - , "--plugin=protoc-gen-grpc=./grpc_cpp_plugin" + , { "type": "join" + , "$1": + [ "--plugin=protoc-gen-grpc=" + , {"type": "var", "name": "GRPC_PLUGIN"} + ] + } ] , "else": [] } @@ -158,9 +252,7 @@ { "type": "map_union" , "$1": [ {"type": "var", "name": "staged all proto srcs"} - , {"type": "var", "name": "protoc"} - , {"type": "var", "name": "grpc_cpp_plugin"} - , {"type": "var", "name": "proto deps"} + , {"type": "var", "name": "TOOLCHAIN"} ] } , "outs": {"type": "var", "name": "outs"} @@ -300,7 +392,9 @@ ] , ["cflags", []] , ["private-cflags", []] - , ["private-ldflags", []] + , [ "private-ldflags" + , {"type": "CALL_EXPRESSION", "name": "default-LDFLAGS"} + ] ] , "body": {"type": "CALL_EXPRESSION", "name": "result"} } diff --git a/rules/CC/proto/RULES b/rules/CC/proto/RULES index 89d1e344..97b43672 100644 --- a/rules/CC/proto/RULES +++ b/rules/CC/proto/RULES @@ -1,4 +1,186 @@ -{ "library": +{ "defaults": + { "doc": + [ "A rule to provide protoc/GRPC defaults." + , "Used to implement [\"CC/proto\", \"defaults\"] for CC proto libraries" + , "and [\"CC/proto\", \"service defaults\"] for CC proto service libraries" + , "(GRPC)." + ] + , "target_fields": ["base", "toolchain", "deps"] + , "string_fields": + ["PROTOC", "LDFLAGS", "ADD_LDFLAGS", "GRPC_PLUGIN", "PATH"] + , "config_vars": ["ARCH", "HOST_ARCH"] + , "field_doc": + { "base": + [ "Other targets (using the same rule) to inherit values from. If" + , "multiple targets are specified, for values that are overwritten (see" + , "documentation of other fields) the last specified value wins." + ] + , "toolchain": + [ "Optional toolchain directory. A collection of artifacts that provide" + , "the protobuf compiler and the GRPC plugin (if needed). Note that only" + , "artifacts of the specified targets are considered (no runfiles etc.)." + , "Specifying this field overlays artifacts from \"base\"." + ] + , "deps": + [ "Optional CC libraries the resulting CC proto libraries implicitly" + , "depend on. Those are typically \"libprotobuf\" for CC proto libraries" + , "and \"libgrpc++\" for CC proto service libraries. Specifying this" + , "field extends dependencies from \"base\"." + ] + , "PROTOC": + [ "The proto compiler. If \"toolchain\" is empty, this field's value is" + , "considered the proto compiler name that is looked up in \"PATH\". If" + , "\"toolchain\" is non-empty, this field's value is assumed to be the" + , "relative path to the proto compiler in \"toolchain\". Specifying this" + , "field overwrites values from \"base\"." + ] + , "GRPC_PLUGIN": + [ "The GRPC plugin for the proto compiler. If \"toolchain\" is empty," + , "this field's value is considered to be the absolute system path to the" + , "plugin. If \"toolchain\" is non-empty, this field's value is assumed" + , "to be the relative path to the plugin in \"toolchain\". Specifying" + , "this field overwrites values from \"base\"." + ] + , "LDFLAGS": + [ "Linker flags for linking the final CC library. Specifying this field" + , "overwrites values from \"base\"." + ] + , "ADD_LDFLAGS": + [ "Additional linker flags for linking the final CC library. Specifying" + , "this field extends values from \"base\"." + ] + , "PATH": + [ "Path for looking up the proto compiler. Individual paths are joined" + , "with \":\"." + ] + } + , "imports": + { "base-provides": ["./", "..", "defaults-base-provides"] + , "artifacts": ["", "field_artifacts"] + , "compile-deps": ["CC", "compile-deps"] + , "compile-args-deps": ["CC", "compile-args-deps"] + , "link-deps": ["CC", "link-deps"] + , "link-args-deps": ["CC", "link-args-deps"] + , "cflags-files-deps": ["CC", "cflags-files-deps"] + , "ldflags-files-deps": ["CC", "ldflags-files-deps"] + , "for host": ["transitions", "for host"] + } + , "config_transitions": + {"toolchain": [{"type": "CALL_EXPRESSION", "name": "for host"}]} + , "expression": + { "type": "let*" + , "bindings": + [ ["PROTOC", {"type": "FIELD", "name": "PROTOC"}] + , ["LDFLAGS", {"type": "FIELD", "name": "LDFLAGS"}] + , ["GRPC_PLUGIN", {"type": "FIELD", "name": "GRPC_PLUGIN"}] + , ["PATH", {"type": "FIELD", "name": "PATH"}] + , ["provider", "PROTOC"] + , [ "PROTOC" + , { "type": "if" + , "cond": {"type": "var", "name": "PROTOC"} + , "then": {"type": "var", "name": "PROTOC"} + , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"} + } + ] + , ["provider", "LDFLAGS"] + , [ "LDFLAGS" + , { "type": "if" + , "cond": {"type": "var", "name": "LDFLAGS"} + , "then": {"type": "var", "name": "LDFLAGS"} + , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"} + } + ] + , ["provider", "GRPC_PLUGIN"] + , [ "GRPC_PLUGIN" + , { "type": "if" + , "cond": {"type": "var", "name": "GRPC_PLUGIN"} + , "then": {"type": "var", "name": "GRPC_PLUGIN"} + , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"} + } + ] + , ["provider", "ENV"] + , [ "ENV" + , { "type": "if" + , "cond": {"type": "var", "name": "PATH"} + , "then": + { "type": "singleton_map" + , "key": "PATH" + , "value": + { "type": "join" + , "separator": ":" + , "$1": {"type": "var", "name": "PATH"} + } + } + , "else": {"type": "CALL_EXPRESSION", "name": "base-provides"} + } + ] + , ["provider", "TOOLCHAIN"] + , ["default", {"type": "empty_map"}] + , [ "TOOLCHAIN" + , { "type": "map_union" + , "$1": + [ {"type": "CALL_EXPRESSION", "name": "base-provides"} + , { "type": "if" + , "cond": {"type": "FIELD", "name": "toolchain"} + , "then": + { "type": "let*" + , "bindings": + [ ["fieldname", "toolchain"] + , [ "transition" + , {"type": "CALL_EXPRESSION", "name": "for host"} + ] + ] + , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"} + } + , "else": {"type": "empty_map"} + } + ] + } + ] + , [ "LDFLAGS" + , { "type": "++" + , "$1": + [ {"type": "var", "name": "LDFLAGS"} + , {"type": "FIELD", "name": "ADD_LDFLAGS"} + ] + } + ] + , ["deps-fieldnames", ["base", "deps"]] + , ["compile-deps", {"type": "CALL_EXPRESSION", "name": "compile-deps"}] + , [ "compile-args" + , {"type": "CALL_EXPRESSION", "name": "compile-args-deps"} + ] + , ["link-deps", {"type": "CALL_EXPRESSION", "name": "link-deps"}] + , ["link-args", {"type": "CALL_EXPRESSION", "name": "link-args-deps"}] + , [ "cflags-files" + , {"type": "CALL_EXPRESSION", "name": "cflags-files-deps"} + ] + , [ "ldflags-files" + , {"type": "CALL_EXPRESSION", "name": "ldflags-files-deps"} + ] + , ["package", {"type": "env", "vars": ["cflags-files", "ldflags-files"]}] + ] + , "body": + { "type": "RESULT" + , "provides": + { "type": "env" + , "vars": + [ "PROTOC" + , "LDFLAGS" + , "GRPC_PLUGIN" + , "ENV" + , "TOOLCHAIN" + , "compile-deps" + , "compile-args" + , "link-deps" + , "link-args" + , "package" + ] + } + } + } + } +, "library": { "doc": [ "A library C++ library, generated from proto files." , "" @@ -7,19 +189,10 @@ ] , "string_fields": ["name", "stage"] , "target_fields": ["srcs", "deps"] - , "config_vars": - ["OS", "ARCH", "HOST_ARCH", "CXX", "CXXFLAGS", "ADD_CXXFLAGS", "AR", "ENV"] + , "config_vars": ["CXX", "CXXFLAGS", "ADD_CXXFLAGS", "AR", "ENV"] , "implicit": - { "protoc": [["@", "protoc", "", "protoc"]] - , "defaults": [["./", "..", "defaults"]] - , "proto-deps": [["@", "protoc", "", "libprotobuf"]] - } - , "imports": - { "protoc-compile": "protoc-compile" - , "host transition": ["transitions", "for host"] - } - , "config_transitions": - {"protoc": [{"type": "CALL_EXPRESSION", "name": "host transition"}]} + {"defaults": [["./", "..", "defaults"]], "proto-defaults": ["defaults"]} + , "imports": {"protoc-compile": "protoc-compile"} , "expression": { "type": "let*" , "bindings": @@ -30,11 +203,8 @@ , "$1": {"type": "FIELD", "name": "stage"} } ] - , [ "deps-transition" - , {"type": "CALL_EXPRESSION", "name": "host transition"} - ] - , ["public-fieldnames", ["deps", "proto-deps"]] - , ["private-fieldnames", ["deps", "proto-deps"]] + , ["public-fieldnames", ["deps"]] + , ["private-fieldnames", ["deps", "proto-defaults"]] ] , "body": {"type": "CALL_EXPRESSION", "name": "protoc-compile"} } @@ -48,24 +218,12 @@ ] , "string_fields": ["name", "stage"] , "target_fields": ["srcs", "deps"] - , "config_vars": - ["OS", "ARCH", "HOST_ARCH", "CXX", "CXXFLAGS", "ADD_CXXFLAGS", "AR", "ENV"] + , "config_vars": ["CXX", "CXXFLAGS", "ADD_CXXFLAGS", "AR", "ENV"] , "implicit": - { "protoc": [["@", "protoc", "", "protoc"]] - , "grpc_cpp_plugin": [["@", "grpc", "", "grpc_cpp_plugin"]] - , "defaults": [["./", "..", "defaults"]] - , "proto-deps": - [["@", "grpc", "", "grpc++"], ["@", "protoc", "", "libprotobuf"]] - } - , "imports": - { "protoc-compile": "protoc-compile" - , "host transition": ["transitions", "for host"] - } - , "config_transitions": - { "protoc": [{"type": "CALL_EXPRESSION", "name": "host transition"}] - , "grpc_cpp_plugin": - [{"type": "CALL_EXPRESSION", "name": "host transition"}] + { "defaults": [["./", "..", "defaults"]] + , "proto-defaults": ["service defaults"] } + , "imports": {"protoc-compile": "protoc-compile"} , "expression": { "type": "let*" , "bindings": @@ -77,11 +235,8 @@ , "$1": {"type": "FIELD", "name": "stage"} } ] - , [ "deps-transition" - , {"type": "CALL_EXPRESSION", "name": "host transition"} - ] - , ["public-fieldnames", ["deps", "proto-deps"]] - , ["private-fieldnames", ["deps", "proto-deps"]] + , ["public-fieldnames", ["deps", "proto-defaults"]] + , ["private-fieldnames", ["deps", "proto-defaults"]] ] , "body": {"type": "CALL_EXPRESSION", "name": "protoc-compile"} } diff --git a/rules/CC/proto/TARGETS b/rules/CC/proto/TARGETS new file mode 100644 index 00000000..45ef7595 --- /dev/null +++ b/rules/CC/proto/TARGETS @@ -0,0 +1,13 @@ +{ "defaults": + { "type": ["CC/proto", "defaults"] + , "PROTOC": ["protoc"] + , "LDFLAGS": ["-lprotobuf"] + , "PATH": ["/bin", "/usr/bin"] + } +, "service defaults": + { "type": ["CC/proto", "defaults"] + , "base": ["defaults"] + , "GRPC_PLUGIN": ["/usr/bin/grpc_cpp_plugin"] + , "ADD_LDFLAGS": ["-lgrpc++", "-lgrpc", "-lgpr"] + } +} |