diff --git a/BUILD.bazel b/BUILD.bazel index 1e555d5123..49e53a2a3d 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -13,6 +13,9 @@ # limitations under the License. load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("@package_metadata//licenses/rules:license.bzl", "license") +load("@package_metadata//purl:purl.bzl", "purl") +load("@package_metadata//rules:package_metadata.bzl", "package_metadata") # Resolve rules_cc Starlark libraries to their correct targets # gazelle:resolve starlark @rules_cc//cc/common:cc_info.bzl @rules_cc//cc/common:common @@ -53,6 +56,24 @@ package(default_visibility = ["//visibility:public"]) licenses(["notice"]) +package_metadata( + name = "package_metadata", + attributes = [ + ":license", + ], + purl = purl.bazel( + module_name() or "rules_python", + module_version(), + ), + visibility = ["//visibility:public"], +) + +license( + name = "license", + kind = "@package_metadata//licenses/spdx:Apache-2.0", + text = ":LICENSE", +) + exports_files([ "LICENSE", "version.bzl", @@ -67,7 +88,11 @@ exports_files( ) exports_files( - glob(["*.md"]), + glob( + ["*.md"], + # Not all files are present when used as an integration test fixture + allow_empty = True, + ), visibility = ["//docs:__subpackages__"], ) @@ -75,7 +100,9 @@ filegroup( name = "distribution", srcs = [ "BUILD.bazel", + "LICENSE", "MODULE.bazel", + "REPO.bazel", "WORKSPACE", "WORKSPACE.bzlmod", "internal_dev_deps.bzl", diff --git a/MODULE.bazel b/MODULE.bazel index d21e779bf8..86a803e1cf 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -6,7 +6,7 @@ module( bazel_dep(name = "bazel_features", version = "1.21.0") bazel_dep(name = "bazel_skylib", version = "1.8.2") -bazel_dep(name = "package_metadata", version = "0.0.7") +bazel_dep(name = "package_metadata", version = "0.0.13") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_cc", version = "0.2.17") bazel_dep(name = "toml.bzl", version = "0.4.1") diff --git a/REPO.bazel b/REPO.bazel new file mode 100644 index 0000000000..bbbb673139 --- /dev/null +++ b/REPO.bazel @@ -0,0 +1,7 @@ +"""File declaring metadata applying to all packages and targets in the Bazel module.""" + +repo( + default_package_metadata = [ + "//:package_metadata", + ], +) diff --git a/WORKSPACE b/WORKSPACE index 46b26b8a9a..a83f7e4732 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -17,6 +17,17 @@ workspace(name = "rules_python") # Everything below this line is used only for developing rules_python. Users # should not copy it to their WORKSPACE. +# REPO.bazel's default_package_metadata makes every package in this repo depend +# on @package_metadata, so it must be defined before any other load. +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "package_metadata", + sha256 = "755bd6c8a3751982e2555d96c913ec070954ca9d01f935563392255da4ebad72", + strip_prefix = "package_metadata-0.0.13/metadata", + url = "https://github.com/bazel-contrib/supply-chain/releases/download/package_metadata-0.0.13/package_metadata-0.0.13.tar.gz", +) + # Workaround for Bazel 9 duplicate name issue in Gazelle. load("//:workspace_bazel9.bzl", "bazel_9_workaround") @@ -77,8 +88,6 @@ python_register_multi_toolchains( python_versions = PYTHON_VERSIONS, ) -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - # Used for Bazel CI http_archive( name = "bazelci_rules", diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index 3489613a6c..5353b8b8c5 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -80,9 +80,9 @@ def py_repositories(transition_settings = []): ) http_archive( name = "package_metadata", - sha256 = "8f27dc7393e3f3bdc793bdc4ba36d67a63c22cc9d38cc65d3204654974ea4563", - strip_prefix = "supply-chain-0.0.7/metadata", - url = "https://github.com/bazel-contrib/supply-chain/releases/download/v0.0.7/supply-chain-v0.0.7.tar.gz", + sha256 = "755bd6c8a3751982e2555d96c913ec070954ca9d01f935563392255da4ebad72", + strip_prefix = "package_metadata-0.0.13/metadata", + url = "https://github.com/bazel-contrib/supply-chain/releases/download/package_metadata-0.0.13/package_metadata-0.0.13.tar.gz", ) # Needed by rules_cc, triggered by @rules_java_prebuilt in Bazel by using @rules_cc//cc:defs.bzl diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 96b68e7796..e7e6fdb4fa 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -584,6 +584,7 @@ bzl_library( ":whl_metadata", "//python/private:normalize_name", "//python/private:repo_utils", + "@package_metadata//purl:srcs", ], ) diff --git a/python/private/pypi/patch_and_extract_whl.bzl b/python/private/pypi/patch_and_extract_whl.bzl index b4ecb2f5b5..77cc5792d6 100644 --- a/python/private/pypi/patch_and_extract_whl.bzl +++ b/python/private/pypi/patch_and_extract_whl.bzl @@ -1,5 +1,6 @@ "" +load("@package_metadata//purl:purl.bzl", "purl") load("//python/private:normalize_name.bzl", "normalize_name") load("//python/private:repo_utils.bzl", "repo_utils") load(":generate_whl_library_build_bazel.bzl", "generate_whl_library_build_bazel") @@ -49,13 +50,13 @@ def _to_purl(*, index, metadata, filename): # https://github.com/package-url/purl-spec/blob/main/types-doc/pypi-definition.md#name-definition name = normalize_name(metadata.name).replace("_", "-") - qualifiers = {} + builder = purl.builder().type("pypi").name(name).version(metadata.version) if index: - qualifiers["repository_url"] = index + builder.add_qualifier("repository_url", index) if filename: - qualifiers["file_name"] = filename + builder.add_qualifier("file_name", filename) - return "pkg:pypi/{}@{}?{}".format(name, metadata.version, "&".join(["{}={}".format(key, val) for key, val in qualifiers.items()])) + return builder.build() def _remove_files(rctx, *basenames): paths = list(rctx.path(".").readdir()) diff --git a/tests/integration/bzlmod_lockfile/MODULE.bazel.lock b/tests/integration/bzlmod_lockfile/MODULE.bazel.lock index b3480a57bf..7f72ba594c 100644 --- a/tests/integration/bzlmod_lockfile/MODULE.bazel.lock +++ b/tests/integration/bzlmod_lockfile/MODULE.bazel.lock @@ -67,9 +67,10 @@ "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", + "https://bcr.bazel.build/modules/package_metadata/0.0.13/MODULE.bazel": "a9cc7e81640c1e7eaca5a465cdf4b63c88d416ca998fcded3680181b1602eee2", + "https://bcr.bazel.build/modules/package_metadata/0.0.13/source.json": "f488e4534468eac223f6417dfdf8d3b7299166d36536408d37c2493ca1e8539d", "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", "https://bcr.bazel.build/modules/package_metadata/0.0.7/MODULE.bazel": "7adb03933fc8401f495800cf4eafcff0edc6da0ff55c7db223ef69d19f689486", - "https://bcr.bazel.build/modules/package_metadata/0.0.7/source.json": "50639625e937b56115012674c797cca7a05a96b4878c87d803c13dc2b31de8a0", "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", diff --git a/tests/integration/whl_library/MODULE.bazel b/tests/integration/whl_library/MODULE.bazel index d3886d7650..9a02f606ab 100644 --- a/tests/integration/whl_library/MODULE.bazel +++ b/tests/integration/whl_library/MODULE.bazel @@ -1,6 +1,6 @@ module(name = "integration_test") -bazel_dep(name = "package_metadata", version = "0.0.7") +bazel_dep(name = "package_metadata", version = "0.0.13") bazel_dep(name = "rules_python", version = "0.0.0") local_path_override( module_name = "rules_python", diff --git a/tests/integration/whl_library/test_contents.py b/tests/integration/whl_library/test_contents.py index 58f13354e3..e34063cf4d 100644 --- a/tests/integration/whl_library/test_contents.py +++ b/tests/integration/whl_library/test_contents.py @@ -164,6 +164,10 @@ def test_whl_deps_ar_the_same(self): "@whl_archive//:site-packages/requests/structures.py", "@whl_archive//:site-packages/requests/utils.py", "@whl_archive//:srcs", + "@package_metadata//licenses/spdx:Apache-2.0", + "@rules_python//:LICENSE", + "@rules_python//:license", + "@rules_python//:package_metadata", "@rules_python//python:none", "@rules_python//python/config_settings:_is_venvs_site_packages_yes", "@rules_python//python/config_settings:add_srcs_to_runfiles",