rules_pkg/examples/naming_package_files
Tony Aiuto 907e6611f9 Fall back to WORKSPACE.bzlmod for examples/naming. Something about a local_repository in MODULE.bazel and bazel 7.0.0 is wonky. 2023-12-19 14:30:48 -05:00
..
BUILD chore: buildifier format all files (#775) 2023-11-06 13:29:07 -05:00
MODULE.bazel Fall back to WORKSPACE.bzlmod for examples/naming. Something about a local_repository in MODULE.bazel and bazel 7.0.0 is wonky. 2023-12-19 14:30:48 -05:00
WORKSPACE chore: buildifier format all files (#775) 2023-11-06 13:29:07 -05:00
WORKSPACE.bzlmod Fall back to WORKSPACE.bzlmod for examples/naming. Something about a local_repository in MODULE.bazel and bazel 7.0.0 is wonky. 2023-12-19 14:30:48 -05:00
my_package_name.bzl chore: buildifier format all files (#775) 2023-11-06 13:29:07 -05:00
package_upload.bzl
readme.md

readme.md

Examples of how to name packages using build time configuration.

Examples

The examples below only show snippets of the relevant technique. See the BUILD file for the complete source.

Using command line flags to modify a package name

We can use a config_setting to capture the command line flag and then select() on that to drop a part into into the name.

config_setting(
    name = "special_build",
    values = {"define": "SPECIAL=1"},
)

my_package_naming(
    name = "my_naming_vars",
    special_build = select({
        ":special_build": "-IsSpecial",
        "//conditions:default": "",
    }),
)
bazel build :example1
ls -l bazel-bin/example1.tar bazel-bin/RulesPkgExamples-k8-fastbuild.tar
bazel build :example1 --define=SPECIAL=1
ls -l bazel-bin/example1*.tar

Using values from a toolchain in a package name.

The rule providing the naming can depend on toolchains just like a *_library or *_binary rule

def _names_from_toolchains_impl(ctx):
    values = {}
    cc_toolchain = find_cc_toolchain(ctx)
    values['cc_cpu'] = cc_toolchain.cpu
    return PackageVariablesInfo(values = values)

names_from_toolchains = rule(
    implementation = _names_from_toolchains_impl,
    attrs = {
        "_cc_toolchain": attr.label(
            default = Label(
                "@rules_cc//cc:current_cc_toolchain",
            ),
        ),
    },
    toolchains = ["@rules_cc//cc:toolchain_type"],
)
bazel build :example2
ls -l bazel-bin/example2*.tar

Debian package names

Debian package names are of the form <package>_<version>-<revision>_<arch>.deb.

One way you might do that is shown in this snipped from the BUILD file.

VERSION = "1"
REVISION = "2"

basic_naming(
    name = "my_naming_vars",

    version = VERSION,
    revision = REVISION,
    ...
)

pkg_deb(
    name = "a_deb_package",
    package = "foo-tools",
    ...
    # Note: target_cpu comes from the --cpu on the command line, and dows not
    # have to be stated in the BUILD file.
    package_file_name = "foo-tools_{version}-{revision}_{target_cpu}.deb",
    package_variables = ":my_naming_vars",
    version = VERSION,
)

Try building bazel build :a_deb_package then examine the results. Note that the .deb out file has the correctly formed name, while the target itself is a symlink to that file.

$ ls -l bazel-bin/a_deb_package.deb bazel-bin/foo-tools_1-2_k8.deb
lrwxrwxrwx 1 user primarygroup   163 Jul 26 12:56 bazel-bin/a_deb_package.deb -> /home/user/.cache/bazel/_bazel_user/.../execroot/rules_pkg_examples/bazel-out/k8-fastbuild/bin/foo-tools_1-2_k8.deb
-r-xr-xr-x 1 user primarygroup 10662 Jul 26 12:56 bazel-bin/foo-tools_1-2_k8.deb