Initial commit
This commit is contained in:
commit
394f900560
|
@ -0,0 +1,13 @@
|
|||
# Bazel settings that apply to this repository.
|
||||
# Take care to document any settings that you expect users to apply.
|
||||
# Settings that apply only to CI are in .github/workflows/ci.bazelrc
|
||||
|
||||
|
||||
# Load any settings specific to the current user.
|
||||
# .bazelrc.user should appear in .gitignore so that settings are not shared with team members
|
||||
# This needs to be last statement in this
|
||||
# config, as the user configuration should be able to overwrite flags from this file.
|
||||
# See https://docs.bazel.build/versions/master/best-practices.html#bazelrc
|
||||
# (Note that we use .bazelrc.user so the file appears next to .bazelrc in directory listing,
|
||||
# rather than user.bazelrc as suggested in the Bazel docs)
|
||||
try-import %workspace%/.bazelrc.user
|
|
@ -0,0 +1,7 @@
|
|||
4.2.0
|
||||
# The first line of this file is used by Bazelisk and Bazel to be sure
|
||||
# the right version of Bazel is used to build and test this repo.
|
||||
# This also defines which version is used on CI.
|
||||
#
|
||||
# Note that you should also run integration_tests against other Bazel
|
||||
# versions you support.
|
|
@ -0,0 +1,7 @@
|
|||
# Bazel settings to apply on CI only
|
||||
# Included with a --bazelrc option in the call to bazel
|
||||
build --announce_rc
|
||||
test --test_output=errors
|
||||
build --disk_cache=$HOME/.cache/bazel
|
||||
build --repository_cache=$HOME/.cache/bazel-repo
|
||||
test --test_env=XDG_CACHE_HOME
|
|
@ -0,0 +1,38 @@
|
|||
name: CI
|
||||
|
||||
# Controls when the action will run.
|
||||
on:
|
||||
# Triggers the workflow on push or pull request events but only for the main branch
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
# The type of runner that the job will run on
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
- uses: bazelbuild/setup-bazelisk@v1
|
||||
- name: Mount bazel action cache
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: "~/.cache/bazel"
|
||||
key: bazel
|
||||
- name: Mount bazel repo cache
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: "~/.cache/bazel-repo"
|
||||
key: bazel-repo
|
||||
- name: bazel test //...
|
||||
env:
|
||||
# Bazelisk will download bazel to here
|
||||
XDG_CACHE_HOME: ~/.cache/bazel-repo
|
||||
run: bazel --bazelrc=.github/workflows/ci.bazelrc --bazelrc=.bazelrc test //...
|
|
@ -0,0 +1,32 @@
|
|||
# Cut a release whenever a new tag is pushed to the repo.
|
||||
# You should use an annotated tag, like `git tag -a v1.2.3`
|
||||
# and put the release notes into the commit message for the tag.
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v*.*.*"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- uses: bazelbuild/setup-bazelisk@v1
|
||||
- name: check git state is clean
|
||||
run: git status --porcelain
|
||||
- name: bazel test //...
|
||||
env:
|
||||
# Bazelisk will download bazel to here
|
||||
XDG_CACHE_HOME: ~/.cache/bazel-repo
|
||||
run:
|
||||
bazel --bazelrc=.github/workflows/ci.bazelrc --bazelrc=.bazelrc test
|
||||
--config=release //...
|
||||
- name: Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
prerelease: true
|
||||
files: |
|
||||
bazel-out/*/bin/path/to/some/output
|
|
@ -0,0 +1 @@
|
|||
bazel-*
|
|
@ -0,0 +1,26 @@
|
|||
# See CONTRIBUTING.md for instructions.
|
||||
# See https://pre-commit.com for more information
|
||||
# See https://pre-commit.com/hooks.html for more hooks
|
||||
|
||||
# Commitizen runs in commit-msg stage
|
||||
# but we don't want to run the other hooks on commit messages
|
||||
default_stages: [commit]
|
||||
|
||||
repos:
|
||||
# Check formatting and lint for starlark code
|
||||
- repo: https://github.com/keith/pre-commit-buildifier
|
||||
rev: 4.0.1.1
|
||||
hooks:
|
||||
- id: buildifier
|
||||
- id: buildifier-lint
|
||||
# Enforce that commit messages allow for later changelog generation
|
||||
- repo: https://github.com/commitizen-tools/commitizen
|
||||
rev: v2.18.0
|
||||
hooks:
|
||||
# Requires that commitizen is already installed
|
||||
- id: commitizen
|
||||
stages: [commit-msg]
|
||||
- repo: https://github.com/pre-commit/mirrors-prettier
|
||||
rev: "v2.4.0"
|
||||
hooks:
|
||||
- id: prettier
|
|
@ -0,0 +1,47 @@
|
|||
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
|
||||
load("@rules_pkg//:pkg.bzl", "pkg_tar")
|
||||
load(":version.bzl", "VERSION")
|
||||
load("@bazel_gazelle//:def.bzl", "gazelle", "gazelle_binary")
|
||||
|
||||
gazelle_binary(
|
||||
name = "gazelle_bin",
|
||||
languages = ["@bazel_skylib//gazelle/bzl"],
|
||||
)
|
||||
|
||||
gazelle(
|
||||
name = "gazelle",
|
||||
gazelle = "gazelle_bin",
|
||||
)
|
||||
|
||||
# This declares the release artifact users
|
||||
pkg_tar(
|
||||
name = "rules_mylang-" + VERSION,
|
||||
srcs = [
|
||||
"LICENSE",
|
||||
"README.md",
|
||||
"version.bzl",
|
||||
"//mylang:package_content",
|
||||
],
|
||||
extension = "tar.gz",
|
||||
# It is all source code, so make it read-only.
|
||||
mode = "0444",
|
||||
# Make it owned by root so it does not have the uid of the CI robot.
|
||||
owner = "0.0",
|
||||
strip_prefix = ".",
|
||||
)
|
||||
|
||||
bzl_library(
|
||||
name = "internal_deps",
|
||||
srcs = ["internal_deps.bzl"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"@bazel_tools//tools/build_defs/repo:http.bzl",
|
||||
"@bazel_tools//tools/build_defs/repo:utils.bzl",
|
||||
],
|
||||
)
|
||||
|
||||
bzl_library(
|
||||
name = "version",
|
||||
srcs = ["version.bzl"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
|
@ -0,0 +1,38 @@
|
|||
# How to Contribute
|
||||
|
||||
## Formatting
|
||||
|
||||
Starlark files should be formatted by buildifier.
|
||||
We suggest using a pre-commit hook to automate this.
|
||||
First [install pre-commit](https://pre-commit.com/#installation),
|
||||
then run
|
||||
|
||||
```shell
|
||||
pre-commit install
|
||||
```
|
||||
|
||||
Otherwise later tooling on CI may yell at you about formatting/linting violations.
|
||||
|
||||
## Updating BUILD files
|
||||
|
||||
Some targets are generated from sources.
|
||||
Currently this is just the `bzl_library` targets.
|
||||
Run `bazel run //:gazelle` to keep them up-to-date.
|
||||
|
||||
## Using this as a development dependency of other rules
|
||||
|
||||
You'll commonly find that you develop in another WORKSPACE, such as
|
||||
some other ruleset that depends on rules_mylang, or in a nested
|
||||
WORKSPACE in the integration_tests folder.
|
||||
|
||||
To always tell Bazel to use this directory rather than some release
|
||||
artifact or a version fetched from the internet, run this from this
|
||||
directory:
|
||||
|
||||
```sh
|
||||
OVERRIDE="--override_repository=rules_mylang=$(pwd)/rules_mylang"
|
||||
echo "build $OVERRIDE" >> ~/.bazelrc
|
||||
echo "query $OVERRIDE" >> ~/.bazelrc
|
||||
```
|
||||
|
||||
This means that any usage of `@rules_mylang` on your system will point to this folder.
|
|
@ -0,0 +1,202 @@
|
|||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
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.
|
|
@ -0,0 +1,55 @@
|
|||
# Template for Bazel rules
|
||||
|
||||
Copy this template to create a Bazel ruleset.
|
||||
|
||||
Features:
|
||||
|
||||
- follows the official style guide at https://docs.bazel.build/versions/main/skylark/deploying.html
|
||||
- includes Bazel formatting as a pre-commit hook (using [buildifier])
|
||||
- includes typical toolchain setup
|
||||
- CI configured with GitHub Actions
|
||||
- Release on GitHub Actions when pushing a tag
|
||||
|
||||
See https://docs.bazel.build/versions/main/skylark/deploying.html#readme
|
||||
|
||||
[buildifier]: https://github.com/bazelbuild/buildtools/tree/master/buildifier#readme
|
||||
|
||||
Ready to get started? Copy this repo, then
|
||||
|
||||
1. search for "com_myorg_rules_mylang" and replace with the name you'll use for your workspace
|
||||
1. search for "mylang" and replace with the language/tool your rules are for
|
||||
1. rename directory "mylang" similarly
|
||||
1. run `pre-commit install` to get lints (see CONTRIBUTING.md)
|
||||
1. if you don't need to fetch platform-dependent tools, then remove anything toolchain-related.
|
||||
1. delete this section of the README (everything up to the SNIP).
|
||||
|
||||
---- SNIP ----
|
||||
|
||||
# Bazel rules for mylang
|
||||
|
||||
## Installation
|
||||
|
||||
Include this in your WORKSPACE file:
|
||||
|
||||
```starlark
|
||||
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
||||
http_archive(
|
||||
name = "com_myorg_rules_mylang",
|
||||
url = "https://github.com/myorg/rules_mylang/releases/download/0.0.0/rules_mylang-0.0.0.tar.gz",
|
||||
sha256 = "",
|
||||
)
|
||||
|
||||
load("@com_myorg_rules_mylang//mylang:repositories.bzl", "mylang_rules_dependencies")
|
||||
|
||||
# This fetches the rules_mylang dependencies, which are:
|
||||
# - bazel_skylib
|
||||
# If you want to have a different version of some dependency,
|
||||
# you should fetch it *before* calling this.
|
||||
# Alternatively, you can skip calling this function, so long as you've
|
||||
# already fetched these dependencies.
|
||||
rules_mylang_dependencies()
|
||||
```
|
||||
|
||||
> note, in the above, replace the version and sha256 with the one indicated
|
||||
> in the release notes for rules_mylang
|
||||
> In the future, our release automation should take care of this.
|
|
@ -0,0 +1,35 @@
|
|||
# Declare the local Bazel workspace.
|
||||
# This is *not* included in the published distribution.
|
||||
workspace(
|
||||
# If your ruleset is "official"
|
||||
# (i.e. is in the bazelbuild GitHub org)
|
||||
# then this should just be named "rules_mylang"
|
||||
# see https://docs.bazel.build/versions/main/skylark/deploying.html#workspace
|
||||
name = "com_myorg_rules_mylang",
|
||||
)
|
||||
|
||||
load(":internal_deps.bzl", "rules_mylang_internal_deps")
|
||||
|
||||
# Fetch deps needed only locally for development
|
||||
rules_mylang_internal_deps()
|
||||
|
||||
load("//mylang:repositories.bzl", "mylang_register_toolchains", "rules_mylang_dependencies")
|
||||
|
||||
# Fetch our "runtime" dependencies which users need as well
|
||||
rules_mylang_dependencies()
|
||||
|
||||
mylang_register_toolchains(
|
||||
name = "mylang1_14",
|
||||
mylang_version = "1.14.2",
|
||||
)
|
||||
|
||||
############################################
|
||||
# Gazelle, for generating bzl_library targets
|
||||
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
|
||||
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
|
||||
|
||||
go_rules_dependencies()
|
||||
|
||||
go_register_toolchains(version = "1.17.2")
|
||||
|
||||
gazelle_dependencies()
|
|
@ -0,0 +1,53 @@
|
|||
# These loads are in the docs/ package rather than anything users depend on
|
||||
# so that the dependency on stardoc doesn't leak to them.
|
||||
load("@bazel_skylib//rules:diff_test.bzl", "diff_test")
|
||||
load("@bazel_skylib//rules:write_file.bzl", "write_file")
|
||||
load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
|
||||
|
||||
# Dictionary mapping from the label of a starlark module
|
||||
# (like //mylang:some.bzl) to the markdown file in this
|
||||
# folder where the API docs are written.
|
||||
_DOCS = {
|
||||
"//mylang:defs.bzl": "rules.md",
|
||||
}
|
||||
|
||||
[
|
||||
stardoc(
|
||||
name = md + "_gen",
|
||||
out = md + "_",
|
||||
input = tgt,
|
||||
deps = [tgt.replace(".bzl", "")],
|
||||
)
|
||||
for [
|
||||
tgt,
|
||||
md,
|
||||
] in _DOCS.items()
|
||||
]
|
||||
|
||||
[
|
||||
diff_test(
|
||||
name = "check_" + md,
|
||||
failure_message = "Run bazel run //docs:update",
|
||||
file1 = md,
|
||||
file2 = md + "_",
|
||||
)
|
||||
for md in _DOCS.values()
|
||||
]
|
||||
|
||||
write_file(
|
||||
name = "gen_update",
|
||||
out = "update.sh",
|
||||
content = [
|
||||
"#!/usr/bin/env bash",
|
||||
"cd $BUILD_WORKSPACE_DIRECTORY",
|
||||
] + [
|
||||
"cp -fv bazel-bin/docs/{0}_ docs/{0}".format(md)
|
||||
for md in _DOCS.values()
|
||||
],
|
||||
)
|
||||
|
||||
sh_binary(
|
||||
name = "update",
|
||||
srcs = ["update.sh"],
|
||||
data = [md + "_" for md in _DOCS.values()],
|
||||
)
|
|
@ -0,0 +1,4 @@
|
|||
<!-- Generated with Stardoc: http://skydoc.bazel.build -->
|
||||
|
||||
Public API re-exports
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
"""Our "development" dependencies
|
||||
|
||||
Users should *not* need to install these. If users see a load()
|
||||
statement from these, that's a bug in our distribution.
|
||||
"""
|
||||
|
||||
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
||||
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
|
||||
|
||||
def rules_mylang_internal_deps():
|
||||
"Fetch deps needed for local development"
|
||||
maybe(
|
||||
http_archive,
|
||||
name = "rules_pkg",
|
||||
urls = [
|
||||
"https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/0.2.4/rules_pkg-0.2.4.tar.gz",
|
||||
"https://github.com/bazelbuild/rules_pkg/releases/download/0.2.4/rules_pkg-0.2.4.tar.gz",
|
||||
],
|
||||
sha256 = "4ba8f4ab0ff85f2484287ab06c0d871dcb31cc54d439457d28fd4ae14b18450a",
|
||||
)
|
||||
|
||||
maybe(
|
||||
http_archive,
|
||||
name = "build_bazel_integration_testing",
|
||||
urls = [
|
||||
"https://github.com/bazelbuild/bazel-integration-testing/archive/165440b2dbda885f8d1ccb8d0f417e6cf8c54f17.zip",
|
||||
],
|
||||
strip_prefix = "bazel-integration-testing-165440b2dbda885f8d1ccb8d0f417e6cf8c54f17",
|
||||
sha256 = "2401b1369ef44cc42f91dc94443ef491208dbd06da1e1e10b702d8c189f098e3",
|
||||
)
|
||||
|
||||
maybe(
|
||||
http_archive,
|
||||
name = "io_bazel_rules_go",
|
||||
sha256 = "2b1641428dff9018f9e85c0384f03ec6c10660d935b750e3fa1492a281a53b0f",
|
||||
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",
|
||||
],
|
||||
)
|
||||
|
||||
maybe(
|
||||
http_archive,
|
||||
name = "bazel_gazelle",
|
||||
sha256 = "de69a09dc70417580aabf20a28619bb3ef60d038470c7cf8442fafcf627c21cb",
|
||||
urls = [
|
||||
"https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.24.0/bazel-gazelle-v0.24.0.tar.gz",
|
||||
"https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.24.0/bazel-gazelle-v0.24.0.tar.gz",
|
||||
],
|
||||
)
|
||||
|
||||
# Override bazel_skylib distribution to fetch sources instead
|
||||
# so that the gazelle extension is included
|
||||
# see https://github.com/bazelbuild/bazel-skylib/issues/250
|
||||
maybe(
|
||||
http_archive,
|
||||
name = "bazel_skylib",
|
||||
sha256 = "07b4117379dde7ab382345c3b0f5edfc6b7cff6c93756eac63da121e0bbcc5de",
|
||||
strip_prefix = "bazel-skylib-1.1.1",
|
||||
urls = [
|
||||
"https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/archive/1.1.1.tar.gz",
|
||||
"https://github.com/bazelbuild/bazel-skylib/archive/1.1.1.tar.gz",
|
||||
],
|
||||
)
|
||||
|
||||
maybe(
|
||||
http_archive,
|
||||
name = "io_bazel_stardoc",
|
||||
sha256 = "c9794dcc8026a30ff67cf7cf91ebe245ca294b20b071845d12c192afe243ad72",
|
||||
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",
|
||||
],
|
||||
)
|
|
@ -0,0 +1,47 @@
|
|||
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
|
||||
|
||||
# For stardoc to reference the files
|
||||
exports_files(["defs.bzl"])
|
||||
|
||||
# This is the target rule authors should put in their "toolchains"
|
||||
# attribute in order to get a runtime for the correct platform.
|
||||
# See https://docs.bazel.build/versions/main/toolchains.html#writing-rules-that-use-toolchains
|
||||
toolchain_type(
|
||||
name = "toolchain_type",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package_content",
|
||||
srcs = glob([
|
||||
"*.bzl",
|
||||
"*.bazel",
|
||||
]) + [
|
||||
"//mylang/private:package_content",
|
||||
],
|
||||
visibility = ["//:__pkg__"],
|
||||
)
|
||||
|
||||
bzl_library(
|
||||
name = "defs",
|
||||
srcs = ["defs.bzl"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
bzl_library(
|
||||
name = "repositories",
|
||||
srcs = ["repositories.bzl"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//mylang/private:toolchains_repo",
|
||||
"//mylang/private:versions",
|
||||
"@bazel_tools//tools/build_defs/repo:http.bzl",
|
||||
"@bazel_tools//tools/build_defs/repo:utils.bzl",
|
||||
],
|
||||
)
|
||||
|
||||
bzl_library(
|
||||
name = "toolchain",
|
||||
srcs = ["toolchain.bzl"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
|
@ -0,0 +1 @@
|
|||
"Public API re-exports"
|
|
@ -0,0 +1,22 @@
|
|||
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
|
||||
|
||||
filegroup(
|
||||
name = "package_content",
|
||||
srcs = glob([
|
||||
"*.bzl",
|
||||
"*.bazel",
|
||||
]),
|
||||
visibility = ["//mylang:__pkg__"],
|
||||
)
|
||||
|
||||
bzl_library(
|
||||
name = "toolchains_repo",
|
||||
srcs = ["toolchains_repo.bzl"],
|
||||
visibility = ["//mylang:__subpackages__"],
|
||||
)
|
||||
|
||||
bzl_library(
|
||||
name = "versions",
|
||||
srcs = ["versions.bzl"],
|
||||
visibility = ["//mylang:__subpackages__"],
|
||||
)
|
|
@ -0,0 +1,113 @@
|
|||
"""Create a repository to hold the toolchains
|
||||
|
||||
This follows guidance here:
|
||||
https://docs.bazel.build/versions/main/skylark/deploying.html#registering-toolchains
|
||||
"
|
||||
Note that in order to resolve toolchains in the analysis phase
|
||||
Bazel needs to analyze all toolchain targets that are registered.
|
||||
Bazel will not need to analyze all targets referenced by toolchain.toolchain attribute.
|
||||
If in order to register toolchains you need to perform complex computation in the repository,
|
||||
consider splitting the repository with toolchain targets
|
||||
from the repository with <LANG>_toolchain targets.
|
||||
Former will be always fetched,
|
||||
and the latter will only be fetched when user actually needs to build <LANG> code.
|
||||
"
|
||||
The "complex computation" in our case is simply downloading large artifacts.
|
||||
This guidance tells us how to avoid that: we put the toolchain targets in the alias repository
|
||||
with only the toolchain attribute pointing into the platform-specific repositories.
|
||||
"""
|
||||
|
||||
# Add more platforms as needed to mirror all the binaries
|
||||
# published by the upstream project.
|
||||
PLATFORMS = {
|
||||
"x86_64-apple-darwin": struct(
|
||||
compatible_with = [
|
||||
"@platforms//os:macos",
|
||||
"@platforms//cpu:x86_64",
|
||||
],
|
||||
),
|
||||
"aarch64-apple-darwin": struct(
|
||||
compatible_with = [
|
||||
"@platforms//os:macos",
|
||||
"@platforms//cpu:aarch64",
|
||||
],
|
||||
),
|
||||
"x86_64-unknown-linux-gnu": struct(
|
||||
compatible_with = [
|
||||
"@platforms//os:linux",
|
||||
"@platforms//cpu:x86_64",
|
||||
],
|
||||
),
|
||||
"x86_64-pc-windows-msvc": struct(
|
||||
compatible_with = [
|
||||
"@platforms//os:windows",
|
||||
"@platforms//cpu:x86_64",
|
||||
],
|
||||
),
|
||||
}
|
||||
|
||||
def _toolchains_repo_impl(repository_ctx):
|
||||
# Expose a concrete toolchain which is the result of Bazel resolving the toolchain
|
||||
# for the execution or target platform.
|
||||
# Workaround for https://github.com/bazelbuild/bazel/issues/14009
|
||||
starlark_content = """# Generated by toolchains_repo.bzl
|
||||
|
||||
# Forward all the providers
|
||||
def _resolved_toolchain_impl(ctx):
|
||||
toolchain_info = ctx.toolchains["@com_myorg_rules_mylang//mylang:toolchain_type"]
|
||||
return [
|
||||
toolchain_info,
|
||||
toolchain_info.default,
|
||||
toolchain_info.mylanginfo,
|
||||
toolchain_info.template_variables,
|
||||
]
|
||||
|
||||
# Copied from java_toolchain_alias
|
||||
# https://cs.opensource.google/bazel/bazel/+/master:tools/jdk/java_toolchain_alias.bzl
|
||||
resolved_toolchain = rule(
|
||||
implementation = _resolved_toolchain_impl,
|
||||
toolchains = ["@com_myorg_rules_mylang//mylang:toolchain_type"],
|
||||
incompatible_use_toolchain_transition = True,
|
||||
)
|
||||
"""
|
||||
repository_ctx.file("defs.bzl", starlark_content)
|
||||
|
||||
build_content = """# Generated by toolchains_repo.bzl
|
||||
#
|
||||
# These can be registered in the workspace file or passed to --extra_toolchains flag.
|
||||
# By default all these toolchains are registered by the mylang_register_toolchains macro
|
||||
# so you don't normally need to interact with these targets.
|
||||
|
||||
load(":defs.bzl", "resolved_toolchain")
|
||||
|
||||
resolved_toolchain(name = "resolved_toolchain", visibility = ["//visibility:public"])
|
||||
|
||||
"""
|
||||
|
||||
for [platform, meta] in PLATFORMS.items():
|
||||
build_content += """
|
||||
toolchain(
|
||||
name = "{platform}_toolchain",
|
||||
exec_compatible_with = {compatible_with},
|
||||
target_compatible_with = {compatible_with},
|
||||
toolchain = "@{user_repository_name}_{platform}//:mylang_toolchain",
|
||||
toolchain_type = "@com_myorg_rules_mylang//mylang:toolchain_type",
|
||||
)
|
||||
""".format(
|
||||
platform = platform,
|
||||
name = repository_ctx.attr.name,
|
||||
user_repository_name = repository_ctx.attr.user_repository_name,
|
||||
compatible_with = meta.compatible_with,
|
||||
)
|
||||
|
||||
# Base BUILD file for this repository
|
||||
repository_ctx.file("BUILD.bazel", build_content)
|
||||
|
||||
toolchains_repo = repository_rule(
|
||||
_toolchains_repo_impl,
|
||||
doc = """Creates a repository with toolchain definitions for all known platforms
|
||||
which can be registered or selected.""",
|
||||
attrs = {
|
||||
"user_repository_name": attr.string(doc = "what the user chose for the base name"),
|
||||
},
|
||||
)
|
|
@ -0,0 +1,14 @@
|
|||
"""Mirror of release info
|
||||
|
||||
TODO: generate this file from GitHub API"""
|
||||
|
||||
# The integrity hashes can be computed with
|
||||
# shasum -b -a 384 [downloaded file] | awk '{ print $1 }' | xxd -r -p | base64
|
||||
TOOL_VERSIONS = {
|
||||
"1.14.2": {
|
||||
"x86_64-apple-darwin": "sha384-ws4+rANvv0YxM1SgIBUXSG9jT8dKw83nls6R5qYkEKzPUB+viBIEozSsyq2e6i+f",
|
||||
"aarch64-apple-darwin": "sha384-HcvJbxoJtGSavkGu0e7CyD00cBlmDb0TBWJ4JSaNa70zuU3N7XlMOYm3bbQcAv2U",
|
||||
"x86_64-pc-windows-msvc": "sha384-35YN6TKpT0L9qyRBmq48NucvyXEtHnkeC+txf2YZmmJTmOzrAKREA74BA0EZvpar",
|
||||
"x86_64-unknown-linux-gnu": "sha384-QgGOwTaetxY0h5HWCKc/3ZtBs4N/fgaaORthn7UcEv++Idm9W+ntCCZRwvBdwHPD",
|
||||
},
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
"""Declare runtime dependencies
|
||||
|
||||
These are needed for local dev, and users must install them as well.
|
||||
See https://docs.bazel.build/versions/main/skylark/deploying.html#dependencies
|
||||
"""
|
||||
|
||||
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
||||
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
|
||||
load("//mylang/private:toolchains_repo.bzl", "PLATFORMS", "toolchains_repo")
|
||||
load("//mylang/private:versions.bzl", "TOOL_VERSIONS")
|
||||
|
||||
# WARNING: any changes in this function may be BREAKING CHANGES for users
|
||||
# because we'll fetch a dependency which may be different from one that
|
||||
# they were previously fetching later in their WORKSPACE setup, and now
|
||||
# ours took precedence. Such breakages are challenging for users, so any
|
||||
# changes in this function should be marked as BREAKING in the commit message
|
||||
# and released only in semver majors.
|
||||
def rules_mylang_dependencies():
|
||||
# The minimal version of bazel_skylib we require
|
||||
maybe(
|
||||
http_archive,
|
||||
name = "bazel_skylib",
|
||||
sha256 = "c6966ec828da198c5d9adbaa94c05e3a1c7f21bd012a0b29ba8ddbccb2c93b0d",
|
||||
urls = [
|
||||
"https://github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz",
|
||||
"https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz",
|
||||
],
|
||||
)
|
||||
|
||||
_DOC = "TODO"
|
||||
_ATTRS = {
|
||||
"mylang_version": attr.string(mandatory = True, values = TOOL_VERSIONS.keys()),
|
||||
"platform": attr.string(mandatory = True, values = PLATFORMS.keys()),
|
||||
}
|
||||
|
||||
def _mylang_repo_impl(repository_ctx):
|
||||
url = "https://github.com/someorg/someproject/releases/download/v{0}/mylang-{1}.zip".format(
|
||||
repository_ctx.attr.mylang_version,
|
||||
repository_ctx.attr.platform,
|
||||
)
|
||||
repository_ctx.download_and_extract(
|
||||
url = url,
|
||||
integrity = TOOL_VERSIONS[repository_ctx.attr.mylang_version][repository_ctx.attr.platform],
|
||||
)
|
||||
build_content = """#Generated by mylang/repositories.bzl
|
||||
load("@com_myorg_rules_mylang//mylang:toolchain.bzl", "mylang_toolchain")
|
||||
mylang_toolchain(name = "mylang_toolchain", target_tool = select({
|
||||
"@bazel_tools//src/conditions:host_windows": "mylang_tool.exe",
|
||||
"//conditions:default": "mylang_tool",
|
||||
}),
|
||||
)
|
||||
"""
|
||||
|
||||
# Base BUILD file for this repository
|
||||
repository_ctx.file("BUILD.bazel", build_content)
|
||||
|
||||
mylang_repositories = repository_rule(
|
||||
_mylang_repo_impl,
|
||||
doc = _DOC,
|
||||
attrs = _ATTRS,
|
||||
)
|
||||
|
||||
# Wrapper macro around everything above, this is the primary API
|
||||
def mylang_register_toolchains(name, **kwargs):
|
||||
"""Convenience macro for users which does typical setup.
|
||||
|
||||
- create a repository for each built-in platform like "mylang_linux_amd64" -
|
||||
this repository is lazily fetched when node is needed for that platform.
|
||||
- TODO: create a convenience repository for the host platform like "mylang_host"
|
||||
- create a repository exposing toolchains for each platform like "mylang_platforms"
|
||||
- register a toolchain pointing at each platform
|
||||
Users can avoid this macro and do these steps themselves, if they want more control.
|
||||
Args:
|
||||
name: base name for all created repos, like "mylang1_14"
|
||||
**kwargs: passed to each node_repositories call
|
||||
"""
|
||||
for platform in PLATFORMS.keys():
|
||||
mylang_repositories(
|
||||
name = name + "_" + platform,
|
||||
platform = platform,
|
||||
**kwargs
|
||||
)
|
||||
native.register_toolchains("@%s_toolchains//:%s_toolchain" % (name, platform))
|
||||
|
||||
toolchains_repo(
|
||||
name = name + "_toolchains",
|
||||
user_repository_name = name,
|
||||
)
|
|
@ -0,0 +1,78 @@
|
|||
"""This module implements the language-specific toolchain rule.
|
||||
"""
|
||||
|
||||
MylangInfo = provider(
|
||||
doc = "Information about how to invoke the tool executable.",
|
||||
fields = {
|
||||
"target_tool_path": "Path to the tool executable for the target platform.",
|
||||
"tool_files": """Files required in runfiles to make the tool executable available.
|
||||
|
||||
May be empty if the target_tool_path points to a locally installed tool binary.""",
|
||||
},
|
||||
)
|
||||
|
||||
# Avoid using non-normalized paths (workspace/../other_workspace/path)
|
||||
def _to_manifest_path(ctx, file):
|
||||
if file.short_path.startswith("../"):
|
||||
return "external/" + file.short_path[3:]
|
||||
else:
|
||||
return ctx.workspace_name + "/" + file.short_path
|
||||
|
||||
def _mylang_toolchain_impl(ctx):
|
||||
if ctx.attr.target_tool and ctx.attr.target_tool_path:
|
||||
fail("Can only set one of target_tool or target_tool_path but both were set.")
|
||||
if not ctx.attr.target_tool and not ctx.attr.target_tool_path:
|
||||
fail("Must set one of target_tool or target_tool_path.")
|
||||
|
||||
tool_files = []
|
||||
target_tool_path = ctx.attr.target_tool_path
|
||||
|
||||
if ctx.attr.target_tool:
|
||||
tool_files = ctx.attr.target_tool.files.to_list()
|
||||
target_tool_path = _to_manifest_path(ctx, tool_files[0])
|
||||
|
||||
# Make the $(tool_BIN) variable available in places like genrules.
|
||||
# See https://docs.bazel.build/versions/main/be/make-variables.html#custom_variables
|
||||
template_variables = platform_common.TemplateVariableInfo({
|
||||
"MYLANG_BIN": target_tool_path,
|
||||
})
|
||||
default = DefaultInfo(
|
||||
files = depset(tool_files),
|
||||
runfiles = ctx.runfiles(files = tool_files),
|
||||
)
|
||||
mylanginfo = MylangInfo(
|
||||
target_tool_path = target_tool_path,
|
||||
tool_files = tool_files,
|
||||
)
|
||||
|
||||
# Export all the providers inside our ToolchainInfo
|
||||
# so the resolved_toolchain rule can grab and re-export them.
|
||||
toolchain_info = platform_common.ToolchainInfo(
|
||||
mylanginfo = mylanginfo,
|
||||
template_variables = template_variables,
|
||||
default = default,
|
||||
)
|
||||
return [
|
||||
default,
|
||||
toolchain_info,
|
||||
template_variables,
|
||||
]
|
||||
|
||||
mylang_toolchain = rule(
|
||||
implementation = _mylang_toolchain_impl,
|
||||
attrs = {
|
||||
"target_tool": attr.label(
|
||||
doc = "A hermetically downloaded executable target for the target platform.",
|
||||
mandatory = False,
|
||||
allow_single_file = True,
|
||||
),
|
||||
"target_tool_path": attr.string(
|
||||
doc = "Path to an existing executable for the target platform.",
|
||||
mandatory = False,
|
||||
),
|
||||
},
|
||||
doc = """Defines a mylang compiler/runtime toolchain.
|
||||
|
||||
For usage see https://docs.bazel.build/versions/main/toolchains.html#defining-toolchains.
|
||||
""",
|
||||
)
|
|
@ -0,0 +1,3 @@
|
|||
"Constants to track versioning info"
|
||||
|
||||
VERSION = "0.1.0"
|
Loading…
Reference in New Issue