| """Repository rules and macros which are expected to be called from WORKSPACE file of either |
| googleapis itself or any third_party repository which consumes googleapis as its dependency. |
| """ |
| |
| def _switched_rules_impl(ctx): |
| disabled_rule_script = """ |
| def {rule_name}(**kwargs): |
| pass |
| """ |
| enabled_native_rule_script = """ |
| {rule_name} = {native_rule_name} |
| """ |
| enabled_rule_script = """ |
| load("{file_label}", _{rule_name} = "{loaded_rule_name}") |
| """ |
| elabled_rule_scrip_alias = """ |
| {rule_name} = _{rule_name} |
| """ |
| load_rules = [] # load() must go before everythin else in .bzl files since Bazel 0.25.0 |
| rules = [] |
| |
| for rule_name, value_and_name in ctx.attr.rules.items(): |
| value = value_and_name[0] |
| loaded_rule_name = value_and_name[1] if value_and_name[1] else rule_name |
| |
| if not value: |
| rules.append(disabled_rule_script.format(rule_name = rule_name)) |
| elif value.startswith("@"): |
| load_rules.append(enabled_rule_script.format( |
| file_label = value, |
| rule_name = rule_name, |
| loaded_rule_name = loaded_rule_name, |
| )) |
| rules.append(elabled_rule_scrip_alias.format(rule_name = rule_name)) |
| elif value.startswith("native."): |
| rules.append( |
| enabled_native_rule_script.format(rule_name = rule_name, native_rule_name = value), |
| ) |
| else: |
| rules.append(value) |
| |
| ctx.file("BUILD.bazel", "") |
| ctx.file("imports.bzl", "".join(load_rules + rules)) |
| |
| switched_rules = repository_rule( |
| implementation = _switched_rules_impl, |
| attrs = { |
| "rules": attr.string_list_dict( |
| allow_empty = True, |
| mandatory = False, |
| default = {}, |
| ), |
| }, |
| ) |
| |
| def switched_rules_by_language( |
| name, |
| gapic = False, |
| grpc = False, |
| java = False, |
| go = False, |
| cc = False, |
| php = False, |
| nodejs = False, |
| python = False, |
| ruby = False, |
| csharp = False, |
| go_test = False, |
| rules_override = {}): |
| """Switches rules in the generated imports.bzl between no-op and the actual implementation. |
| |
| This defines which language-specific rules (or client type specific, like grpc or gapic) should |
| be enabled during the build. All non-enabled language-specific rules will default to no-op |
| implementations. Examples of the language-specific rules are: java_gapic_library |
| (Java-specific), go_proto_library (Go-specific), proto_library_with_info (gapic-specific) etc. |
| Note, proto_library rule is always enabled. |
| |
| For example, to use this rule and enable Java and Go rules, add the following in the external |
| repository which imports com_google_googleapis repository and its corresponding dependencies: |
| |
| load("@com_google_googleapis//:repository_rules.bzl", "switched_rules_by_language") |
| |
| switched_rules_by_language( |
| name = "com_google_googleapis_imports", |
| grpc = True, |
| gapic = True, |
| go = True, |
| java = True, |
| ) |
| |
| Note, for build to work you should also import the language-specific transitive dependencies. |
| |
| Args: |
| name (str): name of a target, is expected to be "com_google_googleapis_imports". |
| gapic (bool): Enable GAPIC specific rules. The GAPIC rules are also language-specific, so |
| the actual enabled rules will be determined by the other language-specific arguments of |
| this rule. False by default. |
| grpc (bool): Enable gRPC specific rules. The gRPC rules are also language-specific, so |
| the actual enabled rules will be determined by the other language-specific arguments of |
| this rule. False by default. |
| java (bool): Enable Java specific rules. False by default. |
| go (bool): Enable Go specific rules. False by default. |
| cc (bool): Enable C++ specific rules. False by default. Partially implemented (no GAPIC |
| support). |
| php (bool): Enable PHP specific rules. False by default. |
| nodejs (bool): Enable Node.js specific rules. False by default. |
| ruby (bool): Enable Ruby specific rules. False by default. |
| python (bool): Enable Python-specific rules. False by default. |
| csharp (bool): Enable C# specific rules. False by default. |
| go_test (bool): A special temporary flag to disable only go_test targets. This is needed to |
| support rules_go version 0.24.0+, which made importmap duplicates an error instead of a |
| warning. More details: https://github.com/bazelbuild/rules_go/issues/1986. |
| rules_override (dict): Custom rule overrides (for advanced usage). |
| """ |
| |
| rules = {} |
| |
| # |
| # Common |
| # |
| rules["proto_library_with_info"] = _switch( |
| gapic, |
| "@rules_gapic//:gapic.bzl", |
| ) |
| rules["moved_proto_library"] = _switch( |
| gapic, |
| "@rules_gapic//:gapic.bzl", |
| ) |
| |
| # |
| # Java |
| # |
| rules["java_proto_library"] = _switch( |
| java, |
| "native.java_proto_library", |
| ) |
| rules["java_grpc_library"] = _switch( |
| java and grpc, |
| "@io_grpc_grpc_java//:java_grpc_library.bzl", |
| ) |
| rules["java_gapic_library"] = _switch( |
| java and grpc and gapic, |
| "@gapic_generator_java//rules_java_gapic:java_gapic.bzl", |
| ) |
| rules["java_gapic_test"] = _switch( |
| java and grpc and gapic, |
| "@gapic_generator_java//rules_java_gapic:java_gapic.bzl", |
| ) |
| rules["java_gapic_assembly_gradle_pkg"] = _switch( |
| java and grpc and gapic, |
| "@gapic_generator_java//rules_java_gapic:java_gapic_pkg.bzl", |
| ) |
| |
| # |
| # Python |
| # |
| rules["py_proto_library"] = _switch( |
| python, |
| "@com_github_grpc_grpc//bazel:python_rules.bzl", |
| ) |
| rules["py_grpc_library"] = _switch( |
| python and grpc, |
| "@com_github_grpc_grpc//bazel:python_rules.bzl", |
| ) |
| rules["py_gapic_library"] = _switch( |
| python and grpc and gapic, |
| "@gapic_generator_python//rules_python_gapic:py_gapic.bzl", |
| ) |
| rules["py_test"] = _switch( |
| python and grpc and gapic, |
| "native.py_test", |
| ) |
| rules["py_gapic_assembly_pkg"] = _switch( |
| python and grpc and gapic, |
| "@gapic_generator_python//rules_python_gapic:py_gapic_pkg.bzl", |
| ) |
| rules["py_import"] = _switch( |
| python and grpc and gapic, |
| "@rules_python//python:defs.bzl", |
| ) |
| |
| # |
| # Go |
| # |
| rules["go_proto_library"] = _switch( |
| go, |
| "@io_bazel_rules_go//proto:def.bzl", |
| ) |
| rules["go_grpc_library"] = _switch( |
| go, |
| "@io_bazel_rules_go//proto:def.bzl", |
| ) |
| rules["go_library"] = _switch( |
| go, |
| "@io_bazel_rules_go//go:def.bzl", |
| ) |
| rules["go_test"] = _switch( |
| go and grpc and gapic and go_test, |
| "@io_bazel_rules_go//go:def.bzl", |
| ) |
| rules["go_gapic_library"] = _switch( |
| go and grpc and gapic, |
| "@com_googleapis_gapic_generator_go//rules_go_gapic:go_gapic.bzl", |
| ) |
| rules["go_gapic_assembly_pkg"] = _switch( |
| go and grpc and gapic, |
| "@com_googleapis_gapic_generator_go//rules_go_gapic:go_gapic_pkg.bzl", |
| ) |
| |
| # |
| # C++ |
| # |
| rules["cc_proto_library"] = _switch( |
| cc, |
| "native.cc_proto_library", |
| ) |
| rules["cc_grpc_library"] = _switch( |
| cc and grpc, |
| "@com_github_grpc_grpc//bazel:cc_grpc_library.bzl", |
| ) |
| rules["cc_gapic_library"] = _switch(False) |
| |
| # |
| # PHP |
| # |
| rules["php_proto_library"] = _switch( |
| php, |
| "@gapic_generator_php//rules_php_gapic:php_gapic.bzl", |
| "php_proto_library", |
| ) |
| rules["php_grpc_library"] = _switch( |
| php and grpc, |
| "@gapic_generator_php//rules_php_gapic:php_gapic.bzl", |
| "php_grpc_library", |
| ) |
| rules["php_gapic_library"] = _switch( |
| php and grpc and gapic, |
| "@gapic_generator_php//rules_php_gapic:php_gapic.bzl", |
| "php_gapic_library", |
| ) |
| rules["php_gapic_assembly_pkg"] = _switch( |
| php and grpc and gapic, |
| "@gapic_generator_php//rules_php_gapic:php_gapic_pkg.bzl", |
| "php_gapic_assembly_pkg", |
| ) |
| |
| # |
| # Node.js |
| # |
| rules["nodejs_gapic_library"] = _switch( |
| nodejs and grpc and gapic, |
| "@gapic_generator_typescript//rules_typescript_gapic:typescript_gapic.bzl", |
| "typescript_gapic_library", |
| ) |
| rules["nodejs_gapic_assembly_pkg"] = _switch( |
| nodejs and grpc and gapic, |
| "@gapic_generator_typescript//rules_typescript_gapic:typescript_gapic_pkg.bzl", |
| "typescript_gapic_assembly_pkg", |
| ) |
| |
| # |
| # Ruby |
| # |
| rules["ruby_proto_library"] = _switch( |
| ruby, |
| "@gapic_generator_ruby//rules_ruby_gapic:ruby_gapic.bzl", |
| ) |
| rules["ruby_grpc_library"] = _switch( |
| ruby and grpc, |
| "@gapic_generator_ruby//rules_ruby_gapic:ruby_gapic.bzl", |
| ) |
| rules["ruby_ads_gapic_library"] = _switch( |
| ruby and grpc and gapic, |
| "@gapic_generator_ruby//rules_ruby_gapic:ruby_gapic.bzl", |
| ) |
| rules["ruby_cloud_gapic_library"] = _switch( |
| ruby and grpc and gapic, |
| "@gapic_generator_ruby//rules_ruby_gapic:ruby_gapic.bzl", |
| ) |
| rules["ruby_gapic_assembly_pkg"] = _switch( |
| ruby and grpc and gapic, |
| "@gapic_generator_ruby//rules_ruby_gapic:ruby_gapic_pkg.bzl", |
| ) |
| |
| # |
| # C# |
| # |
| rules["csharp_proto_library"] = _switch( |
| csharp, |
| "@rules_gapic//csharp:csharp_gapic.bzl", |
| ) |
| rules["csharp_grpc_library"] = _switch( |
| csharp and grpc, |
| "@rules_gapic//csharp:csharp_gapic.bzl", |
| ) |
| rules["csharp_gapic_library"] = _switch( |
| csharp and grpc and gapic, |
| "@gapic_generator_csharp//rules_csharp_gapic:csharp_gapic.bzl", |
| ) |
| rules["csharp_gapic_assembly_pkg"] = _switch( |
| csharp and grpc and gapic, |
| "@gapic_generator_csharp//rules_csharp_gapic:csharp_gapic_pkg.bzl", |
| ) |
| |
| rules.update(rules_override) |
| |
| switched_rules( |
| name = name, |
| rules = rules, |
| ) |
| |
| def _switch(enabled, enabled_value = "", actual_name = ""): |
| if enabled: |
| return [enabled_value, actual_name] |
| else: |
| return ["", actual_name] |