diff --git a/apple/BUILD b/apple/BUILD index aaaec52e0e..ca64340da8 100644 --- a/apple/BUILD +++ b/apple/BUILD @@ -1,4 +1,5 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("//apple/internal/aspects:resource_aspect_hint.bzl", "apple_resource_hint", "apple_resource_hint_action") load(":cc_toolchain_forwarder.bzl", "cc_toolchain_forwarder") package(default_visibility = ["//visibility:public"]) @@ -278,3 +279,20 @@ filegroup( ], visibility = ["//:__pkg__"], ) + +# An aspect hint that enables runfile inclusion as AppleResources +# for cc_libraries. Runfiles keep their folder structure. +apple_resource_hint( + name = "use_resources", + action = apple_resource_hint_action.resources, +) + +apple_resource_hint( + name = "use_runfiles", + action = apple_resource_hint_action.runfiles, +) + +apple_resource_hint( + name = "suppress_resources", + action = apple_resource_hint_action.suppress, +) diff --git a/apple/internal/BUILD b/apple/internal/BUILD index 56ca23e876..f676fa27fc 100644 --- a/apple/internal/BUILD +++ b/apple/internal/BUILD @@ -319,6 +319,7 @@ bzl_library( "//apple:providers", "//apple/internal/aspects:framework_provider_aspect", "//apple/internal/aspects:resource_aspect", + "//apple/internal/aspects:resource_aspect_hint", "//apple/internal/utils:clang_rt_dylibs", "//apple/internal/utils:main_thread_checker_dylibs", "@bazel_skylib//lib:collections", @@ -394,6 +395,7 @@ bzl_library( "//apple:providers", "//apple/internal/aspects:framework_provider_aspect", "//apple/internal/aspects:resource_aspect", + "//apple/internal/aspects:resource_aspect_hint", "//apple/internal/utils:clang_rt_dylibs", "//apple/internal/utils:main_thread_checker_dylibs", ], @@ -533,6 +535,7 @@ bzl_library( "//apple/internal/aspects:app_intents_aspect", "//apple/internal/aspects:framework_provider_aspect", "//apple/internal/aspects:resource_aspect", + "//apple/internal/aspects:resource_aspect_hint", "//apple/internal/aspects:swift_usage_aspect", "//apple/internal/testing:apple_test_bundle_support", "@bazel_skylib//lib:dicts", @@ -556,6 +559,7 @@ bzl_library( "//apple:providers", "//apple/internal/aspects:framework_provider_aspect", "//apple/internal/aspects:resource_aspect", + "//apple/internal/aspects:resource_aspect_hint", "//apple/internal/aspects:swift_dynamic_framework_aspect", "//apple/internal/aspects:swift_usage_aspect", "//apple/internal/testing:apple_test_bundle_support", @@ -667,6 +671,7 @@ bzl_library( "//apple:providers", "//apple/internal/aspects:framework_provider_aspect", "//apple/internal/aspects:resource_aspect", + "//apple/internal/aspects:resource_aspect_hint", "//apple/internal/utils:clang_rt_dylibs", "//apple/internal/utils:main_thread_checker_dylibs", "@bazel_tools//tools/cpp:toolchain_utils.bzl", @@ -703,6 +708,7 @@ bzl_library( "//apple:providers", "//apple/internal/aspects:framework_provider_aspect", "//apple/internal/aspects:resource_aspect", + "//apple/internal/aspects:resource_aspect_hint", "//apple/internal/utils:clang_rt_dylibs", "//apple/internal/utils:main_thread_checker_dylibs", "@bazel_skylib//lib:sets", @@ -738,6 +744,7 @@ bzl_library( "//apple:providers", "//apple/internal/aspects:framework_provider_aspect", "//apple/internal/aspects:resource_aspect", + "//apple/internal/aspects:resource_aspect_hint", "//apple/internal/utils:clang_rt_dylibs", "//apple/internal/utils:main_thread_checker_dylibs", "@bazel_skylib//lib:sets", @@ -771,6 +778,7 @@ bzl_library( ":transition_support", "//apple:providers", "//apple/internal/aspects:resource_aspect", + "//apple/internal/aspects:resource_aspect_hint", "//apple/internal/aspects:swift_usage_aspect", "//apple/internal/utils:files", "@bazel_skylib//lib:partial", diff --git a/apple/internal/aspects/BUILD b/apple/internal/aspects/BUILD index ca4555cc99..8c31c1e4d7 100644 --- a/apple/internal/aspects/BUILD +++ b/apple/internal/aspects/BUILD @@ -58,6 +58,18 @@ bzl_library( ], ) +bzl_library( + name = "resource_aspect_hint", + srcs = ["resource_aspect_hint.bzl"], + visibility = [ + "//apple/internal:__pkg__", + "//apple/internal/testing:__pkg__", + ], + deps = [ + "@build_bazel_rules_swift//swift", + ], +) + bzl_library( name = "swift_dynamic_framework_aspect", srcs = ["swift_dynamic_framework_aspect.bzl"], diff --git a/apple/internal/aspects/resource_aspect.bzl b/apple/internal/aspects/resource_aspect.bzl index 67836d2997..73db6f31ef 100644 --- a/apple/internal/aspects/resource_aspect.bzl +++ b/apple/internal/aspects/resource_aspect.bzl @@ -58,6 +58,11 @@ load( "@build_bazel_rules_apple//apple/internal:swift_support.bzl", "swift_support", ) +load( + "@build_bazel_rules_apple//apple/internal/aspects:resource_aspect_hint.bzl", + "AppleResourceHintInfo", + "apple_resource_hint_action", +) load( "@build_bazel_rules_apple//apple/internal/providers:apple_debug_info.bzl", "AppleDebugInfo", @@ -125,6 +130,23 @@ def _apple_resource_aspect_impl(target, ctx): collect_structured_args = {} collect_framework_import_bundle_files = None + hint_action = None + default_action = None + + # TODO: remove usage of `getattr` and use `aspect_ctx.rule.attr.aspect_hints` directly when we drop Bazel 6. + aspect_hint = None + for hint in getattr(ctx.rule.attr, "aspect_hints", []): + if AppleResourceHintInfo in hint: + if aspect_hint: + fail(("Conflicting AppleResourceHintInfo from aspect hints " + + "'{hint1}' and '{hint2}'. Only one is " + + "allowed.").format( + hint1 = str(aspect_hint.label), + hint2 = str(hint.label), + )) + aspect_hint = hint + hint_action = hint[AppleResourceHintInfo].action + # Owner to attach to the resources as they're being bucketed. owner = None @@ -132,6 +154,7 @@ def _apple_resource_aspect_impl(target, ctx): bundle_name = None if ctx.rule.kind == "objc_library": + default_action = apple_resource_hint_action.resources collect_args["res_attrs"] = ["data"] # Only set objc_library targets as owners if they have srcs, non_arc_srcs or deps. This @@ -139,34 +162,53 @@ def _apple_resource_aspect_impl(target, ctx): if ctx.rule.attr.srcs or ctx.rule.attr.non_arc_srcs or ctx.rule.attr.deps: owner = str(ctx.label) + elif ctx.rule.kind == "cc_library": + default_action = apple_resource_hint_action.runfiles + collect_args["res_attrs"] = ["data"] + elif ctx.rule.kind == "objc_import": + default_action = apple_resource_hint_action.resources + collect_args["res_attrs"] = ["data"] + + elif ctx.rule.kind == "cc_import": + default_action = apple_resource_hint_action.runfiles collect_args["res_attrs"] = ["data"] elif ctx.rule.kind == "swift_library": + default_action = apple_resource_hint_action.resources module_names = [x.name for x in target[SwiftInfo].direct_modules if x.swift] bucketize_args["swift_module"] = module_names[0] if module_names else None collect_args["res_attrs"] = ["data"] owner = str(ctx.label) elif ctx.rule.kind in ["apple_static_framework_import", "apple_static_xcframework_import"]: + default_action = apple_resource_hint_action.resources if AppleFrameworkImportBundleInfo in target: collect_framework_import_bundle_files = target[AppleFrameworkImportBundleInfo].bundle_files collect_args["res_attrs"] = ["data"] owner = str(ctx.label) elif ctx.rule.kind == "apple_resource_group": + default_action = apple_resource_hint_action.resources collect_args["res_attrs"] = ["resources"] collect_structured_args["res_attrs"] = ["structured_resources"] elif ctx.rule.kind == "apple_resource_bundle": + default_action = apple_resource_hint_action.resources collect_infoplists_args["res_attrs"] = ["infoplists"] collect_args["res_attrs"] = ["resources"] collect_structured_args["res_attrs"] = ["structured_resources"] process_args["bundle_id"] = ctx.rule.attr.bundle_id or None bundle_name = "{}.bundle".format(ctx.rule.attr.bundle_name or ctx.label.name) + if hint_action: + default_action = hint_action + + is_resource_action = default_action == apple_resource_hint_action.resources + is_runfiles_action = default_action == apple_resource_hint_action.runfiles + # Collect all resource files related to this target. - if collect_infoplists_args: + if collect_infoplists_args and is_resource_action: infoplists = resources.collect( attr = ctx.rule.attr, **collect_infoplists_args @@ -190,7 +232,7 @@ def _apple_resource_aspect_impl(target, ctx): ), ) - if collect_args: + if collect_args and is_resource_action: resource_files = resources.collect( attr = ctx.rule.attr, **collect_args @@ -213,7 +255,7 @@ def _apple_resource_aspect_impl(target, ctx): ), ) - if collect_structured_args: + if collect_structured_args and is_resource_action: # `structured_resources` requires an explicit parent directory, requiring them to be # processed differently from `resources` and resources inherited from other fields. # @@ -264,7 +306,7 @@ def _apple_resource_aspect_impl(target, ctx): ) # Collect .bundle/ files from framework_import rules - if collect_framework_import_bundle_files: + if collect_framework_import_bundle_files and is_resource_action: parent_dir_param = partial.make( resources.bundle_relative_parent_dir, extension = "bundle", @@ -278,6 +320,18 @@ def _apple_resource_aspect_impl(target, ctx): ), ) + if is_runfiles_action: + # Gather the runfiles and mark them as pre-processed/unprocessed + # dylibs are excluded from runfile packaging because they are included in the Content/Resources directory instead. + apple_resource_infos.append( + resources.bucketize_typed( + [x for x in target[DefaultInfo].default_runfiles.files.to_list() if x.extension != "dylib"], + owner = None, + bucket_type = "unprocessed", + parent_dir_param = partial.make(resources.runfiles_resources_parent_dir), + ), + ) + # Get the providers from dependencies, referenced by deps and locations for resources. apple_debug_infos = [] apple_dsym_bundle_infos = [] diff --git a/apple/internal/aspects/resource_aspect_hint.bzl b/apple/internal/aspects/resource_aspect_hint.bzl new file mode 100644 index 0000000000..77c98f2eda --- /dev/null +++ b/apple/internal/aspects/resource_aspect_hint.bzl @@ -0,0 +1,158 @@ +# Copyright 2024 The Bazel Authors. All rights reserved. +# +# 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. + +"""Implementation of the `apple_resource_hint` rule.""" + +# Possible actions for the AppleResourceHintInfo are +# `resources` collect all labels referenced in the data attribute, process them based on +# file extension, flatten the folder heirarchy and include them in Contents/Resources +# `runfiles` collect all runfiles without processing and include them in Contents/Resources. +# `suppress` stop any collection of resources on this target. Transitive runfiles may still be +# collected based on ancestor resource rules. +apple_resource_hint_action = struct( + resources = "resources", + runfiles = "runfiles", + suppress = "suppress", +) + +_resource_actions = [ + apple_resource_hint_action.resources, + apple_resource_hint_action.runfiles, + apple_resource_hint_action.suppress, +] + +AppleResourceHintInfo = provider( + doc = """ +Provider that propagates desire to automatically bundle runfiles, resources, or suppress both. +Available actions are + `resources` collect all labels referenced in the data attribute, process them based on + file extension, flatten the folder heirarchy and include them in Contents/Resources + `runfiles` collect all runfiles without processing and include them in Contents/Resources. + `suppress` stop any collection of resources on this target. Transitive runfiles may still be + collected based on ancestor resource rules. +""", + fields = { + "action": "Which resource action to run.", + }, +) + +def _apple_resource_hint_impl(ctx): + if ctx.attr.action not in _resource_actions: + fail(str(ctx.label) + " apple resource hint allowed to take values: (" + + ", ".join(_resource_actions) + ") but was set to unallowed value: " + + ctx.attr.action) + return AppleResourceHintInfo( + action = ctx.attr.action, + ) + +apple_resource_hint = rule( + attrs = { + "action": attr.string( + mandatory = True, + doc = """ +Hints the resource collector to take a specific action. +Available actions are + `resources` collect all labels referenced in the data attribute, process them based on + file extension, flatten the folder heirarchy and include them in Contents/Resources + `runfiles` collect all runfiles without processing and include them in Contents/Resources. + `suppress` stop any collection of resources on this target. Transitive runfiles may still be + collected based on ancestor resource rules. +""", + ), + }, + doc = """\ +Defines an aspect hint that generates an appropriate AppleResourceHintInfo based on the +runfiles for this target. + +> [!NOTE] +> Bazel 6 users must set the `--experimental_enable_aspect_hints` flag to utilize +> this rule. In addition, downstream consumers of rules that utilize this rule +> must also set the flag. The flag is enabled by default in Bazel 7. + +Some rules like `cc_library` may have data associated with them in the data attribute +that is needed at runtime. If the library was linked in a `cc_binary` then those data +files would be made available to the application as `runfiles`. To control this +functionality with a `macos_application` you may use this aspect hint. + + +#### Collect resources of a cc_library + +By default a cc_library will add its runfiles to the Contents/Resources folder of a +`macos_application`. To alter this behavior and have it collect resources instead +you can add this pre-built aspect hint. This will cause resources to be collected +and processed like objc_library. + +```build +# //my/project/BUILD +cc_library( + name = "somelib", + data = ["mydata.txt"], + aspect_hints = ["@build_bazel_rules_apple//apple:use_resources"], +) +``` + +#### Collect runfiles of a objc_library + +Similar to above, you can modify the default resource collection behavior of +an objc_library by adding an aspect hint to `use_runfiles` instead of resources. + +```build +# //my/project/BUILD +objc_library( + name = "somelib", + data = ["mydata.txt"], + aspect_hints = ["@build_bazel_rules_apple//apple:use_runfiles"], +) +``` + +Runfiles are described here: https://bazel.build/contribute/codebase#runfiles +The runfiles tree reflects the project tree layout. For example, if you have these +files in your project +``` +myFile1.txt +some_folder/myFile2.txt +``` +with a build file +```build +cc_library( + name = "somelib", + data = ["myFile1.txt", "some_folder/myFile2.txt"], + aspect_hints = ["@build_bazel_rules_apple//apple:use_runfiles"], +) +``` +then the resources will be in +``` +Contents/Resources/myFile1.txt +Contents/Resources/some_folder/myFile2.txt +``` + +#### Suppress resource collection + +In some situations you may wish to suppress resource or runfile collection of +a target. You can add the `suppress_resources` aspect hint to accomplish this. +Note that runfile collection is transitive, so if an ancestor of this target +collects runfiles then this targets runfiles will be included regardless of +any aspect hint applied. + +```build +# //my/project/BUILD +objc_library( + name = "somelib", + data = ["mydata.txt"], + aspect_hints = ["@build_bazel_rules_apple//apple:suppress_resources"], +) +``` +""", + implementation = _apple_resource_hint_impl, +) diff --git a/apple/internal/resources.bzl b/apple/internal/resources.bzl index f637c6de22..ec07d7ef8c 100644 --- a/apple/internal/resources.bzl +++ b/apple/internal/resources.bzl @@ -387,7 +387,7 @@ def _bucketize_typed_data(*, bucket_type, owner = None, parent_dir_param = None, if types.is_string(parent_dir_param) or parent_dir_param == None: parent = parent_dir_param else: - parent = partial.call(parent_dir_param, resource) + parent = partial.call(partial = parent_dir_param, resource = resource) if ".lproj/" in resource_short_path and (not parent or ".lproj" not in parent): lproj_path = bundle_paths.farthest_parent(resource_short_path, "lproj") @@ -786,6 +786,17 @@ def _structured_resources_parent_dir(*, parent_dir = None, resource): path = paths.dirname(package_relative).rstrip("/") return paths.join(parent_dir or "", path or "") or None +def _runfiles_resources_parent_dir(*, resource): + """Returns the parent directory of the file. + + Args: + resource: The resource for which to calculate the package relative path. + + Returns: + The package relative path to the parent directory of the resource. + """ + return paths.dirname(resource.path) + def _expand_owners(*, owners): """Converts a depset of (path, owner) to a dict of paths to dict of owners. @@ -974,5 +985,6 @@ resources = struct( nest_in_bundle = _nest_in_bundle, populated_resource_fields = _populated_resource_fields, process_bucketized_data = _process_bucketized_data, + runfiles_resources_parent_dir = _runfiles_resources_parent_dir, structured_resources_parent_dir = _structured_resources_parent_dir, ) diff --git a/doc/rules-resources.md b/doc/rules-resources.md index a5af763e12..cc648b302e 100644 --- a/doc/rules-resources.md +++ b/doc/rules-resources.md @@ -550,6 +550,28 @@ the expected outputs for each of the actions declared in this method. An AppleResourceInfo provider with resources bucketized according to type. + + +## resources_common.runfiles_resources_parent_dir + +
+resources_common.runfiles_resources_parent_dir(resource) ++ +Returns the parent directory of the file. + +**PARAMETERS** + + +| Name | Description | Default Value | +| :------------- | :------------- | :------------- | +| resource | The resource for which to calculate the package relative path. | none | + +**RETURNS** + +The package relative path to the parent directory of the resource. + + ## resources_common.structured_resources_parent_dir diff --git a/test/starlark_tests/macos_application_tests.bzl b/test/starlark_tests/macos_application_tests.bzl index f218dd9601..8cb61a5300 100644 --- a/test/starlark_tests/macos_application_tests.bzl +++ b/test/starlark_tests/macos_application_tests.bzl @@ -407,6 +407,42 @@ def macos_application_test_suite(name): tags = [name], ) + archive_contents_test( + name = "{}_archive_contains_cc_library_with_runfiles_test".format(name), + build_type = "simulator", + target_under_test = "//test/starlark_tests/targets_under_test/macos:app_with_cc_library_with_runfiles", + contains = [ + "$CONTENT_ROOT/Resources/test/starlark_tests/resources/cc_lib_resources/runfile_a.txt", + "$CONTENT_ROOT/Resources/test/starlark_tests/resources/cc_lib_resources/runfile_b.txt", + ], + tags = [name], + ) + + archive_contents_test( + name = "{}_archive_contains_cc_library_with_resources_test".format(name), + build_type = "simulator", + target_under_test = "//test/starlark_tests/targets_under_test/macos:app_with_cc_library_with_resources", + contains = [ + "$CONTENT_ROOT/Resources/resource_a.txt", + ], + tags = [name], + ) + + archive_contents_test( + name = "{}_archive_contains_cc_library_suppress_resources_test".format(name), + build_type = "simulator", + target_under_test = "//test/starlark_tests/targets_under_test/macos:app_with_cc_library_suppress_resources", + contains = [ + "$CONTENT_ROOT/Resources/test/starlark_tests/resources/cc_lib_resources/runfile_b.txt", + ], + not_contains = [ + # Suppressed resource shouldn't be in either runfile or resource location + "$CONTENT_ROOT/Resources/test/starlark_tests/resources/cc_lib_resources/suppressed_resource.txt", + "$CONTENT_ROOT/Resources/suppressed_resource.txt", + ], + tags = [name], + ) + native.test_suite( name = name, tags = [name], diff --git a/test/starlark_tests/resources/BUILD b/test/starlark_tests/resources/BUILD index 7fc61cda01..dca76ca038 100644 --- a/test/starlark_tests/resources/BUILD +++ b/test/starlark_tests/resources/BUILD @@ -1135,53 +1135,52 @@ swift_library( # C/C++ rules with data cc_library( - name = "cc_lib_with_data", + name = "cc_library_with_runfile_a", srcs = ["main.cc"], data = [ - "//test/testdata/resources:basic_bundle", + # this file should be placed in nested runfiles-like structure + "//test/starlark_tests/resources:cc_lib_resources/runfile_a.txt", ], tags = common.fixture_tags, + deps = [ + ":cc_library_with_runfile_b", + ], ) cc_library( - name = "cc_lib_with_structured_resources", + name = "cc_library_with_runfile_b", srcs = ["main.cc"], data = [ - ":structured_resources_in_resources", + # this file should be placed in nested runfiles-like structure + "//test/starlark_tests/resources:cc_lib_resources/runfile_b.txt", ], tags = common.fixture_tags, ) cc_library( - name = "cc_lib_with_cc_import_with_data", + name = "cc_library_with_resource_a", srcs = ["main.cc"], - deps = [ - ":cc_import_with_data", + aspect_hints = ["@build_bazel_rules_apple//apple:use_resources"], + data = [ + # because of aspect-hint, this file should be placed in /Resources/nested.txt + "//test/starlark_tests/resources:cc_lib_resources/resource_a.txt", ], + tags = common.fixture_tags, ) cc_library( - name = "cc_lib_with_cc_import_with_structured_resources", + name = "cc_library_with_suppressed_resources", srcs = ["main.cc"], - deps = [ - ":cc_import_with_structured_resources", - ], -) - -cc_import( - name = "cc_import_with_data", + aspect_hints = ["@build_bazel_rules_apple//apple:suppress_resources"], data = [ - "//test/testdata/resources:basic_bundle", + # because of aspect-hint, this file should not be included in the application + "//test/starlark_tests/resources:cc_lib_resources/suppressed_resource.txt", ], tags = common.fixture_tags, -) - -cc_import( - name = "cc_import_with_structured_resources", - data = [ - ":structured_resources_in_resources", + deps = [ + # dep will follow cc_library_runfileB rules and be included as a runfile + ":cc_library_with_runfile_b", ], - tags = common.fixture_tags, ) # Targets for CcInfo dylib tests diff --git a/test/starlark_tests/resources/cc_lib_resources/resource_a.txt b/test/starlark_tests/resources/cc_lib_resources/resource_a.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/starlark_tests/resources/cc_lib_resources/runfile_a.txt b/test/starlark_tests/resources/cc_lib_resources/runfile_a.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/starlark_tests/resources/cc_lib_resources/runfile_b.txt b/test/starlark_tests/resources/cc_lib_resources/runfile_b.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/starlark_tests/resources/cc_lib_resources/suppressed_resource.txt b/test/starlark_tests/resources/cc_lib_resources/suppressed_resource.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/starlark_tests/targets_under_test/macos/BUILD b/test/starlark_tests/targets_under_test/macos/BUILD index 57fc983adf..7df112d93f 100644 --- a/test/starlark_tests/targets_under_test/macos/BUILD +++ b/test/starlark_tests/targets_under_test/macos/BUILD @@ -2908,6 +2908,48 @@ macos_unit_test( ], ) +# --------------------------------------------------------------------------------------- +# Targets to test resource processing with C/C++ rules. + +macos_application( + name = "app_with_cc_library_with_runfiles", + bundle_id = "com.google.example", + infoplists = [ + "//test/starlark_tests/resources:Info.plist", + ], + minimum_os_version = common.min_os_macos.baseline, + tags = common.fixture_tags, + deps = [ + "//test/starlark_tests/resources:cc_library_with_runfile_a", + ], +) + +macos_application( + name = "app_with_cc_library_with_resources", + bundle_id = "com.google.example", + infoplists = [ + "//test/starlark_tests/resources:Info.plist", + ], + minimum_os_version = common.min_os_macos.baseline, + tags = common.fixture_tags, + deps = [ + "//test/starlark_tests/resources:cc_library_with_resource_a", + ], +) + +macos_application( + name = "app_with_cc_library_suppress_resources", + bundle_id = "com.google.example", + infoplists = [ + "//test/starlark_tests/resources:Info.plist", + ], + minimum_os_version = common.min_os_macos.baseline, + tags = common.fixture_tags, + deps = [ + "//test/starlark_tests/resources:cc_library_with_suppressed_resources", + ], +) + # --------------------------------------------------------------------------------------- # Targets for CcInfo dylib bundling tests