diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index fc40687..31934d2 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -96,4 +96,18 @@ tasks: - "--test_env=LOCALAPPDATA" - "--test_tag_filters=-no_windows" + ubuntu1804_last_green_bzlmod: + name: "Last Green Bazel (with bzlmod)" + platform: ubuntu1804 + bazel: last_green + build_targets: + - "//..." + test_targets: + - "//..." + build_flags: + - "--experimental_enable_bzlmod" + test_flags: + - "--experimental_enable_bzlmod" + - "--test_env=PATH" + buildifier: latest diff --git a/BUILD b/BUILD index fd7798b..8425403 100644 --- a/BUILD +++ b/BUILD @@ -7,7 +7,10 @@ package(default_visibility = ["//visibility:public"]) # buildifier: disable=skylark-comment # gazelle:exclude skylark_library.bzl -exports_files(["LICENSE"]) +exports_files([ + "LICENSE", + "MODULE.bazel", +]) filegroup( name = "test_deps", @@ -69,6 +72,7 @@ filegroup( "BUILD", "CODEOWNERS", "CONTRIBUTORS", + "WORKSPACE.bzlmod", "//lib:distribution", "//rules:distribution", "//rules/private:distribution", diff --git a/CHANGELOG.md b/CHANGELOG.md index 4567ed3..ef9c469 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ +Release 1.3.0 + +**New Features** +- Added `dicts.omit` and `dicts.pick` (#304) +- Added `expand_template` rule (#330) +- Added `subpackages` module (#348) +- Added `copy_directory` rule (#366) +- Added `bzlmod` support (#385) + +**Incompatible Changes** +- `native_binary` and `native_test` now use symlinks instead of copying, if + the OS supports it (#340) +- `native_binary` and `native_test` now build in target configuration instead + of host configuration (#341) +- `copy_file` no longer adds non-executables to `default_runfiles` (#326) + +**Contributors** + +Alex Eagle, Alexandre Rostovtsev, Barry McNamara, Derek Cormier, Fabian +Meumertzheim, Geoffrey Martin-Noble, hchsiao, Kevin Kres, nickgooding, +Vertexwahn, Vinh Tran + + Release 1.2.1 Bugfix release: fixes build failure with --incompatible_disallow_empty_glob diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 0000000..698c698 --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,33 @@ +module( + name = "bazel_skylib", + compatibility_level = 1, + version = "1.3.0", +) + +register_toolchains( + "//toolchains/unittest:cmd_toolchain", + "//toolchains/unittest:bash_toolchain", +) + +bazel_dep(name = "platforms", version = "0.0.4") + +### INTERNAL ONLY - lines after this are not included in the release packaging. + +# Gazelle extension is experimental +bazel_dep(name = "rules_go", repo_name = "io_bazel_rules_go", version = "0.33.0") +bazel_dep(name = "gazelle", repo_name = "bazel_gazelle", version = "0.26.0") + +go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps") + +go_deps.module( + path = "github.com/bazelbuild/buildtools", + sum = "h1:fmdo+fvvWlhldUcqkhAMpKndSxMN3vH5l7yow5cEaiQ=", + version = "v0.0.0-20220531122519-a43aed7014c8", +) + +use_repo(go_deps, "com_github_bazelbuild_buildtools") + +# Build-only / test-only dependencies +bazel_dep(name = "stardoc", dev_dependency = True, repo_name = "io_bazel_stardoc", version = "0.5.1") +bazel_dep(name = "rules_pkg", dev_dependency = True, version = "0.5.1") +bazel_dep(name = "rules_cc", dev_dependency = True, version = "0.0.1") diff --git a/README.md b/README.md index cd2bc6b..12ef7dc 100644 --- a/README.md +++ b/README.md @@ -61,8 +61,14 @@ s = shell.quote(p) * [analysis_test](docs/analysis_test_doc.md) * [build_test](docs/build_test_doc.md) +* [common_settings](docs/common_settings_doc.md) +* [copy_directory](docs/copy_directory_doc.md) * [copy_file](docs/copy_file_doc.md) +* [diff_test](docs/diff_test_doc.md) * [expand_template](docs/expand_template_doc.md) +* [native_binary and native_test](docs/native_binary_doc.md) +* [run_binary](docs/run_binary_doc.md) +* [select_file](docs/select_file_doc.md) * [write_file](docs/write_file_doc.md) ## Writing a new module diff --git a/WORKSPACE b/WORKSPACE index 00f86ab..6a84653 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -6,10 +6,10 @@ load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") maybe( name = "io_bazel_rules_go", repo_rule = http_archive, - sha256 = "2b1641428dff9018f9e85c0384f03ec6c10660d935b750e3fa1492a281a53b0f", + sha256 = "685052b498b6ddfe562ca7a97736741d87916fe536623afb7da2824c0211c369", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.29.0/rules_go-v0.29.0.zip", - "https://github.com/bazelbuild/rules_go/releases/download/v0.29.0/rules_go-v0.29.0.zip", + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.33.0/rules_go-v0.33.0.zip", + "https://github.com/bazelbuild/rules_go/releases/download/v0.33.0/rules_go-v0.33.0.zip", ], ) @@ -26,10 +26,10 @@ go_register_toolchains(version = "1.17.1") maybe( http_archive, name = "io_bazel_stardoc", - sha256 = "c9794dcc8026a30ff67cf7cf91ebe245ca294b20b071845d12c192afe243ad72", + sha256 = "aa814dae0ac400bbab2e8881f9915c6f47c49664bf087c409a15f90438d2c23e", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/stardoc/releases/download/0.5.0/stardoc-0.5.0.tar.gz", - "https://github.com/bazelbuild/stardoc/releases/download/0.5.0/stardoc-0.5.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/stardoc/releases/download/0.5.1/stardoc-0.5.1.tar.gz", + "https://github.com/bazelbuild/stardoc/releases/download/0.5.1/stardoc-0.5.1.tar.gz", ], ) diff --git a/WORKSPACE.bzlmod b/WORKSPACE.bzlmod new file mode 100644 index 0000000..5a16370 --- /dev/null +++ b/WORKSPACE.bzlmod @@ -0,0 +1,2 @@ +# Workaround so that targets prefixed with @bazel_skylib still work +workspace(name = "bazel_skylib") diff --git a/distribution/BUILD b/distribution/BUILD index 8a9b1e7..326cee7 100644 --- a/distribution/BUILD +++ b/distribution/BUILD @@ -6,10 +6,20 @@ package( default_visibility = ["//visibility:private"], ) +genrule( + name = "distro_module_bazel", + srcs = ["//:MODULE.bazel"], + outs = ["MODULE.bazel"], + cmd = "sed -e '/### INTERNAL ONLY/,$$d' $(location //:MODULE.bazel) >$@", +) + # Build the artifact to put on the github release page. pkg_tar( name = "bazel-skylib-%s" % version, - srcs = ["//:distribution"], + srcs = [ + "distro_module_bazel", + "//:distribution", + ], extension = "tar.gz", mode = "0644", # Make it owned by root so it does not have the uid of the CI robot. diff --git a/docs/BUILD b/docs/BUILD index 5a55308..ddff1b2 100644 --- a/docs/BUILD +++ b/docs/BUILD @@ -3,21 +3,25 @@ load("//docs/private:stardoc_with_diff_test.bzl", "stardoc_with_diff_test", "upd licenses(["notice"]) stardoc_with_diff_test( + name = "analysis_test", bzl_library_target = "//rules:analysis_test", out_label = "//docs:analysis_test_doc.md", ) stardoc_with_diff_test( + name = "build_test", bzl_library_target = "//rules:build_test", out_label = "//docs:build_test_doc.md", ) stardoc_with_diff_test( + name = "collections", bzl_library_target = "//lib:collections", out_label = "//docs:collections_doc.md", ) stardoc_with_diff_test( + name = "common_settings", bzl_library_target = "//rules:common_settings", out_label = "//docs:common_settings_doc.md", ) @@ -28,91 +32,115 @@ stardoc_with_diff_test( ) stardoc_with_diff_test( + name = "copy_directory", bzl_library_target = "//rules:copy_directory", out_label = "//docs:copy_directory_doc.md", ) stardoc_with_diff_test( + name = "copy_file", bzl_library_target = "//rules:copy_file", out_label = "//docs:copy_file_doc.md", ) stardoc_with_diff_test( + name = "dicts", bzl_library_target = "//lib:dicts", out_label = "//docs:dicts_doc.md", ) stardoc_with_diff_test( + name = "diff_test", bzl_library_target = "//rules:diff_test", out_label = "//docs:diff_test_doc.md", ) stardoc_with_diff_test( + name = "expand_template", bzl_library_target = "//rules:expand_template", out_label = "//docs:expand_template_doc.md", ) stardoc_with_diff_test( + name = "native_binary", bzl_library_target = "//rules:native_binary", out_label = "//docs:native_binary_doc.md", ) stardoc_with_diff_test( + name = "new_sets", bzl_library_target = "//lib:new_sets", out_label = "//docs:new_sets_doc.md", ) stardoc_with_diff_test( + name = "partial", bzl_library_target = "//lib:partial", out_label = "//docs:partial_doc.md", ) stardoc_with_diff_test( + name = "paths", bzl_library_target = "//lib:paths", out_label = "//docs:paths_doc.md", ) stardoc_with_diff_test( + name = "run_binary", bzl_library_target = "//rules:run_binary", out_label = "//docs:run_binary_doc.md", ) stardoc_with_diff_test( + name = "selects", bzl_library_target = "//lib:selects", out_label = "//docs:selects_doc.md", ) stardoc_with_diff_test( + name = "select_file", + bzl_library_target = "//rules:select_file", + out_label = "//docs:select_file_doc.md", +) + +stardoc_with_diff_test( + name = "shell", bzl_library_target = "//lib:shell", out_label = "//docs:shell_doc.md", ) stardoc_with_diff_test( + name = "structs", bzl_library_target = "//lib:structs", out_label = "//docs:structs_doc.md", ) stardoc_with_diff_test( + name = "subpackages", bzl_library_target = "//lib:subpackages", out_label = "//docs:subpackages_doc.md", ) stardoc_with_diff_test( + name = "types", bzl_library_target = "//lib:types", out_label = "//docs:types_doc.md", ) stardoc_with_diff_test( + name = "unittest", bzl_library_target = "//lib:unittest", out_label = "//docs:unittest_doc.md", ) stardoc_with_diff_test( + name = "versions", bzl_library_target = "//lib:versions", out_label = "//docs:versions_doc.md", ) stardoc_with_diff_test( + name = "write_file", bzl_library_target = "//rules:write_file", out_label = "//docs:write_file_doc.md", ) diff --git a/docs/analysis_test_doc.md b/docs/analysis_test_doc.md index 1a564ae..94f79bc 100755 --- a/docs/analysis_test_doc.md +++ b/docs/analysis_test_doc.md @@ -2,7 +2,7 @@ A test verifying other targets can be successfully analyzed as part of a `bazel test` - + ## analysis_test diff --git a/docs/build_test_doc.md b/docs/build_test_doc.md index 332dc58..d547406 100755 --- a/docs/build_test_doc.md +++ b/docs/build_test_doc.md @@ -2,7 +2,7 @@ A test verifying other targets build as part of a `bazel test` - + ## build_test @@ -36,6 +36,6 @@ Typical usage: | :------------- | :------------- | :------------- | | name | The name of the test rule. | none | | targets | A list of targets to ensure build. | none | -| kwargs | The <a href="https://docs.bazel.build/versions/main/be/common-definitions.html#common-attributes-tests">common attributes for tests</a>. | none | +| kwargs | The <a href="https://bazel.build/reference/be/common-definitions#common-attributes-tests">common attributes for tests</a>. | none | diff --git a/docs/collections_doc.md b/docs/collections_doc.md index 1138850..cd9db8b 100755 --- a/docs/collections_doc.md +++ b/docs/collections_doc.md @@ -2,7 +2,7 @@ Skylib module containing functions that operate on collections. - + ## collections.after_each @@ -25,7 +25,7 @@ Inserts `separator` after each item in `iterable`. A new list with `separator` after each item in `iterable`. - + ## collections.before_each @@ -48,7 +48,7 @@ Inserts `separator` before each item in `iterable`. A new list with `separator` before each item in `iterable`. - + ## collections.uniq diff --git a/docs/common_settings_doc.md b/docs/common_settings_doc.md index 736e48c..4dda47c 100755 --- a/docs/common_settings_doc.md +++ b/docs/common_settings_doc.md @@ -6,10 +6,10 @@ These rules return a BuildSettingInfo with the value of the build setting. For label-typed settings, use the native label_flag and label_setting rules. More documentation on how to use build settings at -https://docs.bazel.build/versions/main/skylark/config.html#user-defined-build-settings +https://bazel.build/extending/config#user-defined-build-settings - + ## bool_flag @@ -27,7 +27,7 @@ A bool-typed build setting that can be set on the command line | name | A unique name for this target. | Name | required | | - + ## bool_setting @@ -45,7 +45,7 @@ A bool-typed build setting that cannot be set on the command line | name | A unique name for this target. | Name | required | | - + ## int_flag @@ -63,7 +63,7 @@ An int-typed build setting that can be set on the command line | name | A unique name for this target. | Name | required | | - + ## int_setting @@ -81,7 +81,7 @@ An int-typed build setting that cannot be set on the command line | name | A unique name for this target. | Name | required | | - + ## string_flag @@ -100,7 +100,7 @@ A string-typed build setting that can be set on the command line | values | The list of allowed values for this setting. An error is raised if any other value is given. | List of strings | optional | [] | - + ## string_list_flag @@ -118,7 +118,7 @@ A string list-typed build setting that can be set on the command line | name | A unique name for this target. | Name | required | | - + ## string_list_setting @@ -136,7 +136,7 @@ A string list-typed build setting that cannot be set on the command line | name | A unique name for this target. | Name | required | | - + ## string_setting @@ -155,7 +155,7 @@ A string-typed build setting that cannot be set on the command line | values | The list of allowed values for this setting. An error is raised if any other value is given. | List of strings | optional | [] | - + ## BuildSettingInfo diff --git a/docs/copy_directory_doc.md b/docs/copy_directory_doc.md index a0fbc9d..1177d20 100755 --- a/docs/copy_directory_doc.md +++ b/docs/copy_directory_doc.md @@ -6,7 +6,7 @@ The rule uses a Bash command on Linux/macOS/non-Windows, and a cmd.exe command on Windows (no Bash is required). - + ## copy_directory @@ -36,7 +36,7 @@ for more context. | kwargs | further keyword arguments, e.g. visibility | none | - + ## copy_directory_action diff --git a/docs/copy_file_doc.md b/docs/copy_file_doc.md index 47a1244..ed297a6 100755 --- a/docs/copy_file_doc.md +++ b/docs/copy_file_doc.md @@ -9,7 +9,7 @@ The rule uses a Bash command on Linux/macOS/non-Windows, and a cmd.exe command on Windows (no Bash is required). - + ## copy_file diff --git a/docs/dicts_doc.md b/docs/dicts_doc.md index 9010392..2360325 100755 --- a/docs/dicts_doc.md +++ b/docs/dicts_doc.md @@ -2,7 +2,7 @@ Skylib module containing functions that operate on dictionaries. - + ## dicts.add @@ -34,7 +34,7 @@ dictionary, and the sum of a single dictionary is a copy of itself. A new `dict` that has all the entries of the given dictionaries. - + ## dicts.omit @@ -57,7 +57,7 @@ Returns a new `dict` that has all the entries of `dictionary` with keys not in ` A new `dict` that has all the entries of `dictionary` with keys not in `keys`. - + ## dicts.pick diff --git a/docs/diff_test_doc.md b/docs/diff_test_doc.md index 0271f4d..4fc2416 100755 --- a/docs/diff_test_doc.md +++ b/docs/diff_test_doc.md @@ -6,7 +6,7 @@ The rule uses a Bash command (diff) on Linux/macOS/non-Windows, and a cmd.exe command (fc.exe) on Windows (no Bash is required). - + ## diff_test @@ -28,6 +28,6 @@ The test succeeds if the files' contents match. | file1 | Label of the file to compare to <code>file2</code>. | none | | file2 | Label of the file to compare to <code>file1</code>. | none | | failure_message | Additional message to log if the files' contents do not match. | None | -| kwargs | The <a href="https://docs.bazel.build/versions/main/be/common-definitions.html#common-attributes-tests">common attributes for tests</a>. | none | +| kwargs | The <a href="https://bazel.build/reference/be/common-definitions#common-attributes-tests">common attributes for tests</a>. | none | diff --git a/docs/expand_template_doc.md b/docs/expand_template_doc.md index b370135..1132da6 100755 --- a/docs/expand_template_doc.md +++ b/docs/expand_template_doc.md @@ -3,7 +3,7 @@ A rule that performes template expansion. - + ## expand_template diff --git a/docs/maintainers_guide.md b/docs/maintainers_guide.md index 5f496f9..5339b6a 100644 --- a/docs/maintainers_guide.md +++ b/docs/maintainers_guide.md @@ -72,7 +72,8 @@ Name 1, Name 2, Name 3 (alphabetically from `git log`) -------------------------------------------------------------------------------- -2. Bump `version` in version.bzl to the new version. +2. Bump `version` in version.bzl *and* MODULE.bazel to the new version. + TODO(#386): add a test to make sure the two versions are in sync. 3. Ensure that the commits for steps 1 and 2 have been merged. All further steps must be performed on a single, known-good git commit. 4. `bazel build //distribution:bazel-skylib-$VERSION.tar.gz` @@ -81,7 +82,7 @@ Name 1, Name 2, Name 3 (alphabetically from `git log`) can obtain them via `gcloud init`): ``` -gsutil cp bazel-bin/distro/bazel-skylib-$VERSION.tar.gz gs://bazel-mirror/github.com/bazelbuild/bazel-skylib/releases/download/$VERSION/bazel-skylib-$VERSION.tar.gz +gsutil cp bazel-bin/distribution/bazel-skylib-$VERSION.tar.gz gs://bazel-mirror/github.com/bazelbuild/bazel-skylib/releases/download/$VERSION/bazel-skylib-$VERSION.tar.gz gsutil setmeta -h "Cache-Control: public, max-age=31536000" "gs://bazel-mirror/github.com/bazelbuild/bazel-skylib/releases/download/$VERSION/bazel-skylib-$VERSION.tar.gz" ``` diff --git a/docs/native_binary_doc.md b/docs/native_binary_doc.md index a9c476d..b512b25 100755 --- a/docs/native_binary_doc.md +++ b/docs/native_binary_doc.md @@ -8,7 +8,7 @@ do, but they run the wrapped binary directly, instead of through Bash, so they don't depend on Bash and work with --shell_executable="". - + ## native_binary @@ -29,12 +29,12 @@ in genrule.tools for example. You can also augment the binary with runfiles. | Name | Description | Type | Mandatory | Default | | :------------- | :------------- | :------------- | :------------- | :------------- | | name | A unique name for this target. | Name | required | | -| data | data dependencies. See https://docs.bazel.build/versions/main/be/common-definitions.html#typical.data | List of labels | optional | [] | +| data | data dependencies. See https://bazel.build/reference/be/common-definitions#typical.data | List of labels | optional | [] | | out | An output name for the copy of the binary | String | required | | | src | path of the pre-built executable | Label | required | | - + ## native_test @@ -55,7 +55,7 @@ the binary with runfiles. | Name | Description | Type | Mandatory | Default | | :------------- | :------------- | :------------- | :------------- | :------------- | | name | A unique name for this target. | Name | required | | -| data | data dependencies. See https://docs.bazel.build/versions/main/be/common-definitions.html#typical.data | List of labels | optional | [] | +| data | data dependencies. See https://bazel.build/reference/be/common-definitions#typical.data | List of labels | optional | [] | | out | An output name for the copy of the binary | String | required | | | src | path of the pre-built executable | Label | required | | diff --git a/docs/new_sets_doc.md b/docs/new_sets_doc.md index e34107f..4f7fde2 100755 --- a/docs/new_sets_doc.md +++ b/docs/new_sets_doc.md @@ -11,7 +11,7 @@ Skylib module containing common hash-set algorithms. `types.is_set()` method in types.bzl. - + ## sets.make @@ -36,7 +36,7 @@ All elements must be hashable. A set containing the passed in values. - + ## sets.copy @@ -58,7 +58,7 @@ Creates a new set from another set. A new set containing the same elements as `s`. - + ## sets.to_list @@ -80,7 +80,7 @@ Creates a list from the values in the set. A list of values inserted into the set. - + ## sets.insert @@ -106,7 +106,7 @@ Element must be hashable. This mutates the original set. The set `s` with `e` included. - + ## sets.contains @@ -129,7 +129,7 @@ Checks for the existence of an element in a set. True if the element exists in the set, False if the element does not. - + ## sets.is_equal @@ -152,7 +152,7 @@ Returns whether two sets are equal. True if `a` is equal to `b`, False otherwise. - + ## sets.is_subset @@ -175,7 +175,7 @@ Returns whether `a` is a subset of `b`. True if `a` is a subset of `b`, False otherwise. - + ## sets.disjoint @@ -201,7 +201,7 @@ Two sets are disjoint if they have no elements in common. True if `a` and `b` are disjoint, False otherwise. - + ## sets.intersection @@ -224,7 +224,7 @@ Returns the intersection of two sets. A set containing the elements that are in both `a` and `b`. - + ## sets.union @@ -246,7 +246,7 @@ Returns the union of several sets. The set union of all sets in `*args`. - + ## sets.difference @@ -269,7 +269,7 @@ Returns the elements in `a` that are not in `b`. A set containing the elements that are in `a` but not in `b`. - + ## sets.length @@ -291,7 +291,7 @@ Returns the number of elements in a set. An integer representing the number of elements in the set. - + ## sets.remove @@ -317,7 +317,7 @@ Element must be hashable. This mutates the original set. The set `s` with `e` removed. - + ## sets.repr @@ -339,7 +339,7 @@ Returns a string value representing the set. A string representing the set. - + ## sets.str diff --git a/docs/partial_doc.md b/docs/partial_doc.md index d772ec8..97d4094 100755 --- a/docs/partial_doc.md +++ b/docs/partial_doc.md @@ -7,7 +7,7 @@ Partial function objects allow some parameters are bound before the call. Similar to https://docs.python.org/3/library/functools.html#functools.partial. - + ## partial.make @@ -123,7 +123,7 @@ partial.call(func, x=2) A new `partial` that can be called using `call` - + ## partial.call @@ -147,7 +147,7 @@ Calls a partial created using `make`. Whatever the function in the partial returns. - + ## partial.is_instance diff --git a/docs/paths_doc.md b/docs/paths_doc.md index e0d8116..e9d619d 100755 --- a/docs/paths_doc.md +++ b/docs/paths_doc.md @@ -7,7 +7,7 @@ path separators (forward slash, "/"); they do not handle Windows-style paths with backslash separators or drive letters. - + ## paths.basename @@ -35,7 +35,7 @@ the final slash). The basename of the path, which includes the extension. - + ## paths.dirname @@ -62,7 +62,7 @@ included, unless omitting them would make the dirname empty. The dirname of the path. - + ## paths.is_absolute @@ -84,7 +84,7 @@ Returns `True` if `path` is an absolute path. `True` if `path` is an absolute path. - + ## paths.join @@ -116,7 +116,7 @@ If any component is an absolute path, all previous components are discarded. A string containing the joined paths. - + ## paths.normalize @@ -153,7 +153,7 @@ POSIX platforms; specifically: The normalized path. - + ## paths.relativize @@ -185,7 +185,7 @@ the path both start with the same initial parent references. The portion of `path` that is relative to `start`. - + ## paths.replace_extension @@ -211,7 +211,7 @@ If the path has no extension, the new extension is added to it. The path with the extension replaced (or added, if it did not have one). - + ## paths.split_extension diff --git a/docs/private/stardoc_with_diff_test.bzl b/docs/private/stardoc_with_diff_test.bzl index dc23deb..9fe425b 100644 --- a/docs/private/stardoc_with_diff_test.bzl +++ b/docs/private/stardoc_with_diff_test.bzl @@ -1,3 +1,17 @@ +# Copyright 2022 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. + """Helpers for keeping stardoc documentation up-to-date. These are currently a private API in bazel-skylib. @@ -14,6 +28,7 @@ load("@bazel_skylib//rules:write_file.bzl", "write_file") load("@bazel_skylib//rules:diff_test.bzl", "diff_test") def stardoc_with_diff_test( + name, bzl_library_target, out_label): """Creates a stardoc target coupled with a `diff_test` for a given `bzl_library`. @@ -21,15 +36,15 @@ def stardoc_with_diff_test( This is helpful for minimizing boilerplate in repos wih lots of stardoc targets. Args: + name: the stardoc target name bzl_library_target: the label of the `bzl_library` target to generate documentation for out_label: the label of the output MD file """ - out_file = out_label.replace("//", "").replace(":", "/") # Generate MD from .bzl stardoc( - name = out_file.replace("/", "_").replace(".md", "-docgen"), + name = name, out = out_file.replace(".md", "-docgen.md"), input = bzl_library_target + ".bzl", deps = [bzl_library_target], diff --git a/docs/run_binary_doc.md b/docs/run_binary_doc.md index 96bada5..8e4491d 100755 --- a/docs/run_binary_doc.md +++ b/docs/run_binary_doc.md @@ -6,7 +6,7 @@ run_binary() build rule implementation. Runs a binary as a build action. This rule does not require Bash (unlike native.genrule()). - + ## run_binary @@ -22,8 +22,8 @@ Runs a binary as a build action.

This rule does not require Bash (unlik | Name | Description | Type | Mandatory | Default | | :------------- | :------------- | :------------- | :------------- | :------------- | | name | A unique name for this target. | Name | required | | -| args | Command line arguments of the binary.<br/><br/>Subject to<code><a href="https://docs.bazel.build/versions/main/be/make-variables.html#location">$(location)</a></code> expansion. | List of strings | optional | [] | -| env | Environment variables of the action.<br/><br/>Subject to <code><a href="https://docs.bazel.build/versions/main/be/make-variables.html#location">$(location)</a></code> expansion. | Dictionary: String -> String | optional | {} | +| args | Command line arguments of the binary.<br/><br/>Subject to<code><a href="https://bazel.build/reference/be/make-variables#predefined_label_variables">$(location)</a></code> expansion. | List of strings | optional | [] | +| env | Environment variables of the action.<br/><br/>Subject to <code><a href="https://bazel.build/reference/be/make-variables#predefined_label_variables">$(location)</a></code> expansion. | Dictionary: String -> String | optional | {} | | outs | Output files generated by the action.<br/><br/>These labels are available for <code>$(location)</code> expansion in <code>args</code> and <code>env</code>. | List of labels | required | | | srcs | Additional inputs of the action.<br/><br/>These labels are available for <code>$(location)</code> expansion in <code>args</code> and <code>env</code>. | List of labels | optional | [] | | tool | The tool to run in the action.<br/><br/>Must be the label of a *_binary rule, of a rule that generates an executable file, or of a file that can be executed as a subprocess (e.g. an .exe or .bat file on Windows or a binary with executable permission on Linux). This label is available for <code>$(location)</code> expansion in <code>args</code> and <code>env</code>. | Label | required | | diff --git a/docs/select_file_doc.md b/docs/select_file_doc.md new file mode 100755 index 0000000..667f519 --- /dev/null +++ b/docs/select_file_doc.md @@ -0,0 +1,28 @@ + + + +select_file() build rule implementation. + +Selects a single file from the outputs of a target by given relative path. + + + + +## select_file + +
+select_file(name, srcs, subpath)
+
+ +Selects a single file from the outputs of a target by given relative path + +**ATTRIBUTES** + + +| Name | Description | Type | Mandatory | Default | +| :------------- | :------------- | :------------- | :------------- | :------------- | +| name | A unique name for this target. | Name | required | | +| srcs | The target producing the file among other outputs | Label | required | | +| subpath | Relative path to the file | String | required | | + + diff --git a/docs/selects_doc.md b/docs/selects_doc.md index 8bfd964..8e2f31b 100755 --- a/docs/selects_doc.md +++ b/docs/selects_doc.md @@ -2,7 +2,7 @@ Skylib module containing convenience interfaces for select(). - + ## selects.with_or @@ -48,7 +48,7 @@ to ``` - + ## selects.with_or_dict @@ -74,7 +74,7 @@ macros. A dictionary usable by a native `select()`. - + ## selects.config_setting_group diff --git a/docs/shell_doc.md b/docs/shell_doc.md index 0759434..bd559b9 100755 --- a/docs/shell_doc.md +++ b/docs/shell_doc.md @@ -2,7 +2,7 @@ Skylib module containing shell utility functions. - + ## shell.array_literal @@ -33,7 +33,7 @@ A string that represents the sequence as a shell array; that is, parentheses containing the quoted elements. - + ## shell.quote diff --git a/docs/structs_doc.md b/docs/structs_doc.md index a409d86..667aa46 100755 --- a/docs/structs_doc.md +++ b/docs/structs_doc.md @@ -2,7 +2,7 @@ Skylib module containing functions that operate on structs. - + ## structs.to_dict diff --git a/docs/subpackages_doc.md b/docs/subpackages_doc.md index b2363cd..8a0956f 100755 --- a/docs/subpackages_doc.md +++ b/docs/subpackages_doc.md @@ -3,7 +3,7 @@ Skylib module containing common functions for working with native.subpackages() - + ## subpackages.all @@ -46,7 +46,7 @@ A mutable sorted list containing all sub-packages of the current Bazel package. - + ## subpackages.exists @@ -82,7 +82,7 @@ NOTE: fail()s if native.subpackages() is not supported in the current Bazel vers True if 'relative_path' is a subpackage of the current package. - + ## subpackages.supported diff --git a/docs/types_doc.md b/docs/types_doc.md index 7ab0a6c..bdc9cba 100755 --- a/docs/types_doc.md +++ b/docs/types_doc.md @@ -2,7 +2,7 @@ Skylib module containing functions checking types. - + ## types.is_list @@ -24,7 +24,7 @@ Returns True if v is an instance of a list. True if v is an instance of a list, False otherwise. - + ## types.is_string @@ -46,7 +46,7 @@ Returns True if v is an instance of a string. True if v is an instance of a string, False otherwise. - + ## types.is_bool @@ -68,7 +68,7 @@ Returns True if v is an instance of a bool. True if v is an instance of a bool, False otherwise. - + ## types.is_none @@ -90,7 +90,7 @@ Returns True if v has the type of None. True if v is None, False otherwise. - + ## types.is_int @@ -112,7 +112,7 @@ Returns True if v is an instance of a signed integer. True if v is an instance of a signed integer, False otherwise. - + ## types.is_tuple @@ -134,7 +134,7 @@ Returns True if v is an instance of a tuple. True if v is an instance of a tuple, False otherwise. - + ## types.is_dict @@ -156,7 +156,7 @@ Returns True if v is an instance of a dict. True if v is an instance of a dict, False otherwise. - + ## types.is_function @@ -178,7 +178,7 @@ Returns True if v is an instance of a function. True if v is an instance of a function, False otherwise. - + ## types.is_depset @@ -200,7 +200,7 @@ Returns True if v is an instance of a `depset`. True if v is an instance of a `depset`, False otherwise. - + ## types.is_set diff --git a/docs/unittest_doc.md b/docs/unittest_doc.md index a8e4a5a..a199a2e 100755 --- a/docs/unittest_doc.md +++ b/docs/unittest_doc.md @@ -16,7 +16,7 @@ See https://bazel.build/extending/concepts for background about macros, rules, and the different phases of a build. - + ## unittest_toolchain @@ -41,7 +41,7 @@ unittest_toolchain(name, success_templ | Test script generated when the test passes. Should exit with status 0. | String | required | | - + ## analysistest.make @@ -95,7 +95,7 @@ A rule definition that should be stored in a global whose name ends in `_test`. - + ## analysistest.begin @@ -125,7 +125,7 @@ A test environment struct that must be passed to assertions and finally to struct as it may change. - + ## analysistest.end @@ -151,7 +151,7 @@ that the results are reported. A list of providers needed to automatically register the analysis test result. - + ## analysistest.fail @@ -170,7 +170,7 @@ Unconditionally causes the current test to fail. | msg | The message to log describing the failure. | none | - + ## analysistest.target_actions @@ -192,7 +192,7 @@ Returns a list of actions registered by the target under test. A list of actions registered by the target under test - + ## analysistest.target_bin_dir_path @@ -214,7 +214,7 @@ Returns ctx.bin_dir.path for the target under test. Output bin dir path string. - + ## analysistest.target_under_test @@ -236,7 +236,7 @@ Returns the target under test. The target under test. - + ## asserts.expect_failure @@ -259,7 +259,7 @@ This requires that the analysis test is created with `analysistest.make()` and | expected_failure_msg | The error message to expect as a result of analysis failures. | "" | - + ## asserts.equals @@ -280,7 +280,7 @@ Asserts that the given `expected` and `actual` values are equal. | msg | An optional message that will be printed that describes the failure. If omitted, a default will be used. | None | - + ## asserts.false @@ -300,7 +300,7 @@ Asserts that the given `condition` is false. | msg | An optional message that will be printed that describes the failure. If omitted, a default will be used. | "Expected condition to be false, but was true." | - + ## asserts.set_equals @@ -321,7 +321,7 @@ Asserts that the given `expected` and `actual` sets are equal. | msg | An optional message that will be printed that describes the failure. If omitted, a default will be used. | None | - + ## asserts.new_set_equals @@ -342,7 +342,7 @@ Asserts that the given `expected` and `actual` sets are equal. | msg | An optional message that will be printed that describes the failure. If omitted, a default will be used. | None | - + ## asserts.true @@ -362,7 +362,7 @@ Asserts that the given `condition` is true. | msg | An optional message that will be printed that describes the failure. If omitted, a default will be used. | "Expected condition to be true, but was false." | - + ## loadingtest.make @@ -384,7 +384,7 @@ Creates a loading phase test environment and test_suite. loading phase environment passed to other loadingtest functions - + ## loadingtest.equals @@ -409,7 +409,7 @@ Creates a test case for asserting state at LOADING phase. None, creates test case - + ## register_unittest_toolchains @@ -421,7 +421,7 @@ Registers the toolchains for unittest users. - + ## unittest.make @@ -469,7 +469,7 @@ A rule definition that should be stored in a global whose name ends in `_test`. - + ## unittest.suite @@ -525,7 +525,7 @@ name each target. | test_rules | A list of test rules defines by unittest.test. | none | - + ## unittest.begin @@ -555,7 +555,7 @@ A test environment struct that must be passed to assertions and finally to struct as it may change. - + ## unittest.end @@ -581,7 +581,7 @@ that the results are reported. A list of providers needed to automatically register the test result. - + ## unittest.fail diff --git a/docs/versions_doc.md b/docs/versions_doc.md index 83ee7a7..ed968c7 100755 --- a/docs/versions_doc.md +++ b/docs/versions_doc.md @@ -2,7 +2,7 @@ Skylib module containing functions for checking Bazel versions. - + ## versions.get @@ -14,7 +14,7 @@ Returns the current Bazel version - + ## versions.parse @@ -39,7 +39,7 @@ int tuples can be compared directly using binary operators (<, >). An int 3-tuple of a (major, minor, patch) version. - + ## versions.check @@ -59,7 +59,7 @@ Check that the version of Bazel is valid within the specified range. | bazel_version | the version of Bazel to check. Used for testing, defaults to native.bazel_version | None | - + ## versions.is_at_most @@ -82,7 +82,7 @@ Check that a version is lower or equals to a threshold. True if version <= threshold. - + ## versions.is_at_least diff --git a/docs/write_file_doc.md b/docs/write_file_doc.md index 8f39376..456a067 100755 --- a/docs/write_file_doc.md +++ b/docs/write_file_doc.md @@ -10,7 +10,7 @@ file. Instead they use Starlark's built-in file writing action (ctx.actions.write). - + ## write_file diff --git a/rules/build_test.bzl b/rules/build_test.bzl index 9ec8ab1..682901e 100644 --- a/rules/build_test.bzl +++ b/rules/build_test.bzl @@ -63,7 +63,7 @@ def build_test(name, targets, **kwargs): Args: name: The name of the test rule. targets: A list of targets to ensure build. - **kwargs: The common attributes for tests. + **kwargs: The common attributes for tests. """ if len(targets) == 0: fail("targets must be non-empty", "targets") diff --git a/rules/common_settings.bzl b/rules/common_settings.bzl index 7f56a7f..eb057cc 100644 --- a/rules/common_settings.bzl +++ b/rules/common_settings.bzl @@ -18,7 +18,7 @@ These rules return a BuildSettingInfo with the value of the build setting. For label-typed settings, use the native label_flag and label_setting rules. More documentation on how to use build settings at -https://docs.bazel.build/versions/main/skylark/config.html#user-defined-build-settings +https://bazel.build/extending/config#user-defined-build-settings """ BuildSettingInfo = provider( @@ -69,13 +69,22 @@ string_list_setting = rule( doc = "A string list-typed build setting that cannot be set on the command line", ) +def _no_at_str(label): + """Strips any leading '@'s for labels in the main repo, so that the error string is more friendly.""" + s = str(label) + if s.startswith("@@//"): + return s[2:] + if s.startswith("@//"): + return s[1:] + return s + def _string_impl(ctx): allowed_values = ctx.attr.values value = ctx.build_setting_value if len(allowed_values) == 0 or value in ctx.attr.values: return BuildSettingInfo(value = value) else: - fail("Error setting " + str(ctx.label) + ": invalid value '" + value + "'. Allowed values are " + str(allowed_values)) + fail("Error setting " + _no_at_str(ctx.label) + ": invalid value '" + value + "'. Allowed values are " + str(allowed_values)) string_flag = rule( implementation = _string_impl, diff --git a/rules/diff_test.bzl b/rules/diff_test.bzl index 25213d6..ee2f589 100644 --- a/rules/diff_test.bzl +++ b/rules/diff_test.bzl @@ -164,7 +164,7 @@ def diff_test(name, file1, file2, failure_message = None, **kwargs): file1: Label of the file to compare to file2. file2: Label of the file to compare to file1. failure_message: Additional message to log if the files' contents do not match. - **kwargs: The common attributes for tests. + **kwargs: The common attributes for tests. """ _diff_test( name = name, diff --git a/rules/native_binary.bzl b/rules/native_binary.bzl index a027fc9..b33347b 100644 --- a/rules/native_binary.bzl +++ b/rules/native_binary.bzl @@ -61,7 +61,7 @@ _ATTRS = { "data": attr.label_list( allow_files = True, doc = "data dependencies. See" + - " https://docs.bazel.build/versions/main/be/common-definitions.html#typical.data", + " https://bazel.build/reference/be/common-definitions#typical.data", ), # "out" is attr.string instead of attr.output, so that it is select()'able. "out": attr.string(mandatory = True, doc = "An output name for the copy of the binary"), diff --git a/rules/private/copy_common.bzl b/rules/private/copy_common.bzl index 5a0bb33..a8f7243 100644 --- a/rules/private/copy_common.bzl +++ b/rules/private/copy_common.bzl @@ -22,11 +22,7 @@ COPY_EXECUTION_REQUIREMENTS = { # ----------------+----------------------------------------------------------------------------- # no-cache | Results in the action or test never being cached (remotely or locally) # ----------------+----------------------------------------------------------------------------- - # local | Precludes the action or test from being remotely cached, remotely executed, - # | or run inside the sandbox. For genrules and tests, marking the rule with the - # | local = True attribute has the same effect. - # ----------------+----------------------------------------------------------------------------- - # See https://bazel.google.cn/reference/be/common-definitions?hl=en&authuser=0#common-attributes + # See https://bazel.build/reference/be/common-definitions#common-attributes # # Copying file & directories is entirely IO-bound and there is no point doing this work # remotely. @@ -44,11 +40,6 @@ COPY_EXECUTION_REQUIREMENTS = { # disk cache stores the directory artifact as a single entry, but the slight performance bump # comes at the cost of heavy disk cache usage, which is an unmanaged directory that grow beyond # the bounds of the physical disk. - # - # Sandboxing for this action is wasteful as well since there is a 1:1 mapping of input - # file/directory to output file/directory and no room for non-hermetic inputs to sneak in to the - # input. "no-remote": "1", "no-cache": "1", - "local": "1", } diff --git a/rules/run_binary.bzl b/rules/run_binary.bzl index 47c8bc5..c40c0be 100644 --- a/rules/run_binary.bzl +++ b/rules/run_binary.bzl @@ -76,7 +76,7 @@ run_binary = rule( ), "env": attr.string_dict( doc = "Environment variables of the action.

Subject to " + - " $(location)" + + " $(location)" + " expansion.", ), "srcs": attr.label_list( @@ -91,7 +91,7 @@ run_binary = rule( ), "args": attr.string_list( doc = "Command line arguments of the binary.

Subject to" + - "$(location)" + + "$(location)" + " expansion.", ), }, diff --git a/rules/select_file.bzl b/rules/select_file.bzl index f359e43..1b73093 100644 --- a/rules/select_file.bzl +++ b/rules/select_file.bzl @@ -15,7 +15,7 @@ """ select_file() build rule implementation. -Selects a single file from the outputs of some target by given relative path. +Selects a single file from the outputs of a target by given relative path. """ def _impl(ctx): @@ -38,8 +38,7 @@ def _impl(ctx): select_file = rule( implementation = _impl, - doc = "Selects a single file from the outputs of some target \ -by given relative path", + doc = "Selects a single file from the outputs of a target by given relative path", attrs = { "srcs": attr.label( allow_files = True, diff --git a/tests/copy_directory/BUILD.bazel b/tests/copy_directory/BUILD.bazel index 2c72ab9..f766e99 100644 --- a/tests/copy_directory/BUILD.bazel +++ b/tests/copy_directory/BUILD.bazel @@ -1,6 +1,7 @@ # This package aids testing the 'copy_directory' rule. load("//rules:copy_directory.bzl", "copy_directory") +load(":empty_directory.bzl", "empty_directory") licenses(["notice"]) @@ -13,10 +14,8 @@ copy_directory( out = "dir_copy", ) -genrule( - name = "empty_directory", - outs = ["empty_dir"], - cmd = "mkdir $@", +empty_directory( + name = "empty_dir", ) copy_directory( diff --git a/tests/copy_directory/empty_directory.bzl b/tests/copy_directory/empty_directory.bzl new file mode 100644 index 0000000..92c5a5f --- /dev/null +++ b/tests/copy_directory/empty_directory.bzl @@ -0,0 +1,34 @@ +# Copyright 2022 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. + +"""Creates an empty directory.""" + +def _empty_directory_impl(ctx): + out = ctx.actions.declare_directory(ctx.attr.name) + ctx.actions.run_shell( + outputs = [out], + command = "mkdir -p $@", + arguments = [out.path], + mnemonic = "EmptyDirectory", + progress_message = "Creating empty directory %s" % out.path, + use_default_shell_env = True, + execution_requirements = {"no-remote": "1"}, # see rules/private/copy_directory_private.bzl + ) + return [DefaultInfo(files = depset(direct = [out]))] + +empty_directory = rule( + implementation = _empty_directory_impl, + provides = [DefaultInfo], + doc = "Creates an empty directory with the same name as the target", +) diff --git a/version.bzl b/version.bzl index 324adb5..70a04d6 100644 --- a/version.bzl +++ b/version.bzl @@ -13,4 +13,4 @@ # limitations under the License. """The version of bazel-skylib.""" -version = "1.2.1" +version = "1.3.0"