aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/build_defs/repo
diff options
context:
space:
mode:
authorGravatar David Chen <dzc@google.com>2016-11-18 23:58:35 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-11-21 19:39:41 +0000
commit451599a8d22d79a84e228c9c06207df490f02f9f (patch)
tree8b3a44e177923a6cdfa0c39f631861d06c4db49a /tools/build_defs/repo
parentc43cbb6ee503215aa1309afda511fa7eb9dbf338 (diff)
Skylark implementations of http_archive, new_http_archive, and http_file rules.
RELNOTES: Skylark implementations of http_archive, new_http_archive, and http_file. -- MOS_MIGRATED_REVID=139633771
Diffstat (limited to 'tools/build_defs/repo')
-rw-r--r--tools/build_defs/repo/http.bzl223
1 files changed, 223 insertions, 0 deletions
diff --git a/tools/build_defs/repo/http.bzl b/tools/build_defs/repo/http.bzl
new file mode 100644
index 0000000000..af222d84a8
--- /dev/null
+++ b/tools/build_defs/repo/http.bzl
@@ -0,0 +1,223 @@
+# Copyright 2016 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.
+"""Rules for downloading files and archives over HTTP.
+
+### Setup
+
+To use these rules, load them in your `WORKSPACE` file as follows:
+
+```python
+load(
+ "@bazel_tools//tools/build_defs/repo:http.bzl",
+ "http_archive",
+ "http_file",
+)
+```
+
+These rules are improved versions of the native http rules and will eventually
+replace the native rules.
+"""
+
+
+def _http_archive_impl(ctx):
+ """Implementation of the http_archive rule."""
+ if ctx.attr.build_file and ctx.attr.build_file_content:
+ ctx.fail("Only one of build_file and build_file_content can be provided.")
+
+ # TODO(dzc,jart): Implement fallback URLs when available.
+ if len(ctx.attr.urls) > 1:
+ ctx.fail("Multiple urls are not yet supported.")
+ url = ctx.attr.urls[0]
+ ctx.download_and_extract(url, "", ctx.attr.sha256, ctx.attr.type,
+ ctx.attr.strip_prefix)
+ ctx.file("WORKSPACE", "workspace(name = \"{name}\")\n".format(name=ctx.name))
+ if ctx.attr.build_file:
+ ctx.symlink(ctx.attr.build_file, "BUILD")
+ else:
+ ctx.file("BUILD", ctx.attr.build_file_content)
+
+
+_HTTP_FILE_BUILD = """
+package(default_visibility = ["//visibility:public"])
+
+filegroup(
+ name = "file",
+ srcs = ["downloaded"],
+)
+"""
+
+def _http_file_impl(ctx):
+ """Implementation of the http_file rule."""
+ # TODO(dzc,jart): Implement fallback URLs when available.
+ if len(ctx.attr.urls) > 1:
+ ctx.fail("Multiple urls are not yet supported.")
+ url = ctx.attr.urls[0]
+ ctx.download(url, "file/downloaded", ctx.attr.sha256, ctx.attr.executable)
+ ctx.file("WORKSPACE", "workspace(name = \"{name}\")".format(name=ctx.name))
+ ctx.file("file/BUILD", _HTTP_FILE_BUILD)
+
+
+_http_archive_attrs = {
+ "urls": attr.string_list(mandatory=True),
+ "sha256": attr.string(),
+ "strip_prefix": attr.string(),
+ "type": attr.string(),
+ "build_file": attr.label(),
+ "build_file_content": attr.string(),
+}
+
+
+http_archive = repository_rule(
+ implementation = _http_archive_impl,
+ attrs = _http_archive_attrs,
+)
+"""Downloads a Bazel repository as a compressed archive file, decompresses it,
+and makes its targets available for binding.
+
+The repository should already contain a BUILD file. If it does not, use
+`new_http_archive` instead.
+
+It supports the following file extensions: `"zip"`, `"jar"`, `"war"`,
+`"tar.gz"`, `"tgz"`, `"tar.xz"`, and `tar.bz2`.
+
+Examples:
+ Suppose the current repository contains the source code for a chat program,
+ rooted at the directory `~/chat-app`. It needs to depend on an SSL library
+ which is available from http://example.com/openssl.zip. This `.zip` file
+ contains the following directory structure:
+
+ ```
+ WORKSPACE
+ src/
+ openssl.cc
+ openssl.h
+ ```
+
+ In the local repository, the user creates a `openssl.BUILD` file which
+ contains the following target definition:
+
+ ```python
+ cc_library(
+ name = "openssl-lib",
+ srcs = ["src/openssl.cc"],
+ hdrs = ["src/openssl.h"],
+ )
+ ```
+
+ Targets in the `~/chat-app` repository can depend on this target if the
+ following lines are added to `~/chat-app/WORKSPACE`:
+
+ ```python
+ http_archive(
+ name = "my_ssl",
+ urls = ["http://example.com/openssl.zip"],
+ sha256 = "03a58ac630e59778f328af4bcc4acb4f80208ed4",
+ build_file = "openssl.BUILD",
+ )
+ ```
+
+ Then targets would specify `@my_ssl//:openssl-lib` as a dependency.
+
+Args:
+ name: A unique name for this rule.
+ build_file: The file to use as the `BUILD` file for this repository.
+
+ Either `build_file` or `build_file_content` can be specified.
+
+ This attribute is a label relative to the main workspace. The file does not
+ need to be named `BUILD`, but can be (something like `BUILD.new-repo-name`
+ may work well for distinguishing it from the repository's actual `BUILD`
+ files.
+
+ build_file_content: The content for the BUILD file for this repository.
+
+ Either `build_file` or `build_file_content` can be specified.
+ sha256: The expected SHA-256 of the file downloaded.
+
+ This must match the SHA-256 of the file downloaded. _It is a security risk
+ to omit the SHA-256 as remote files can change._ At best omitting this
+ field will make your build non-hermetic. It is optional to make development
+ easier but should be set before shipping.
+ strip_prefix: A directory prefix to strip from the extracted files.
+
+ Many archives contain a top-level directory that contains all of the useful
+ files in archive. Instead of needing to specify this prefix over and over
+ in the `build_file`, this field can be used to strip it from all of the
+ extracted files.
+
+ For example, suppose you are using `foo-lib-latest.zip`, which contains the
+ directory `foo-lib-1.2.3/` under which there is a `WORKSPACE` file and are
+ `src/`, `lib/`, and `test/` directories that contain the actual code you
+ wish to build. Specify `strip_prefix = "foo-lib-1.2.3"` to use the
+ `foo-lib-1.2.3` directory as your top-level directory.
+
+ Note that if there are files outside of this directory, they will be
+ discarded and inaccessible (e.g., a top-level license file). This includes
+ files/directories that start with the prefix but are not in the directory
+ (e.g., `foo-lib-1.2.3.release-notes`). If the specified prefix does not
+ match a directory in the archive, Bazel will return an error.
+ type: The archive type of the downloaded file.
+
+ By default, the archive type is determined from the file extension of the
+ URL. If the file has no extension, you can explicitly specify one of the
+ following: `"zip"`, `"jar"`, `"war"`, `"tar.gz"`, `"tgz"`, `"tar.xz"`,
+ or `tar.bz2`.
+ urls: A URL to a file that will be made available to Bazel.
+
+ This must be an file, http or https URL. Redirections are followed.
+ Authentication is not supported.
+"""
+
+
+http_file = repository_rule(
+ implementation = _http_file_impl,
+ attrs = {
+ "executable": attr.bool(),
+ "sha256": attr.string(),
+ "urls": attr.string_list(mandatory=True),
+ },
+)
+"""Downloads a file from a URL and makes it available to be used as a file
+group.
+
+Examples:
+ Suppose you need to have a debian package for your custom rules. This package
+ is available from http://example.com/package.deb. Then you can add to your
+ WORKSPACE file:
+
+ ```python
+ http_file(
+ name = "my_deb",
+ urls = ["http://example.com/package.deb"],
+ sha256 = "03a58ac630e59778f328af4bcc4acb4f80208ed4",
+ )
+ ```
+
+ Targets would specify `@my_deb//file` as a dependency to depend on this file.
+
+Args:
+ name: A unique name for this rule.
+ executable: If the downloaded file should be made executable. Defaults to
+ False.
+ sha256: The expected SHA-256 of the file downloaded.
+
+ This must match the SHA-256 of the file downloaded. _It is a security risk
+ to omit the SHA-256 as remote files can change._ At best omitting this
+ field will make your build non-hermetic. It is optional to make development
+ easier but should be set before shipping.
+ urls: A URL to a file that will be made available to Bazel.
+
+ This must be an file, http, or https URL. Redirections are followed.
+ Authentication is not supported.
+"""