1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
// Copyright 2014 Google Inc. 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.
package com.google.devtools.build.lib.bazel.rules.workspace;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.syntax.Type.STRING;
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
import com.google.devtools.build.lib.packages.RuleClass;
/**
* Rule definition for the new_http_archive rule.
*/
public class NewHttpArchiveRule implements RuleDefinition {
public static final String NAME = "new_http_archive";
@Override
public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
return builder
/* <!-- #BLAZE_RULE(new_http_archive).ATTRIBUTE(url) -->
A URL referencing an archive file containing a Bazel repository.
${SYNOPSIS}
<p>Archives of type .zip, .jar, .war, .tar.gz or .tgz are supported. There is no support
for authentication. Redirections are followed.</p>
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("url", STRING).mandatory())
/* <!-- #BLAZE_RULE(new_http_archive).ATTRIBUTE(sha256) -->
The expected SHA-256 hash of the file downloaded.
${SYNOPSIS}
<p>This must match the SHA-256 hash of the file downloaded.</p>
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("sha256", STRING).mandatory())
/* <!-- #BLAZE_RULE(new_http_archive).ATTRIBUTE(build_file) -->
The file to use as the BUILD file for this repository.
${SYNOPSIS}
<p>This path is relative to the build's workspace. The file does not need to be named
BUILD, but can be something like BUILD.new-repo-name to distinguish it
from the workspace's actual BUILD files.</p>
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("build_file", STRING).mandatory())
/* <!-- #BLAZE_RULE(new_http_archive).ATTRIBUTE(type) -->
The archive type of the downloaded file.
${SYNOPSIS}
<p>By default, the archive type is determined from the file extension of the URL. If the
file has no extension, you can explicitly specify either "zip", "jar", "tar.gz", or
"tgz" here.</p>
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("type", STRING))
/* <!-- #BLAZE_RULE(http_archive).ATTRIBUTE(strip_prefix) -->
A directory prefix to strip from the extracted files.
${SYNOPSIS}
<p>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
<code>build_file</code>, this field can be used to strip it from all of the extracted
files.</p>
<p>For example, suppose you are using foo-lib-latest.zip, which contains the directory
foo-lib-1.2.3/ under which there are src/, lib/, and test/ directories that contain the
actual code you wish to build. Specify <code>strip_prefix = "foo-lib-1.2.3"</code> and
your <code>build_file</code> will not have to account for this top-level directory.</p>
<p>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.</p>
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("strip_prefix", STRING))
.setWorkspaceOnly()
.build();
}
@Override
public Metadata getMetadata() {
return RuleDefinition.Metadata.builder()
.name(NewHttpArchiveRule.NAME)
.type(RuleClass.Builder.RuleClassType.WORKSPACE)
.ancestors(WorkspaceBaseRule.class)
.factoryClass(WorkspaceConfiguredTargetFactory.class)
.build();
}
}
/*<!-- #BLAZE_RULE (NAME = new_http_archive, TYPE = OTHER, FAMILY = Workspace)[GENERIC_RULE] -->
${ATTRIBUTE_SIGNATURE}
<p>Downloads a compressed archive file, decompresses it, and creates a Bazel repository by
combining the archive with the provided BUILD file.</p>
<p>It supports Zip-formatted archives (with the .zip extension) and
tarballs (.tar.gz and .tgz extensions).</p>
${ATTRIBUTE_DEFINITION}
<h4 id="new_http_archive_examples">Examples</h4>
<p>Suppose the current repository contains the source code for a chat program, rooted at the
directory <i>~/chat-app</i>. It needs to depend on an SSL library which is available from
<i>http://example.com/openssl.zip</i>. This .zip file contains the following directory
structure:</p>
<pre class="code">
src/
openssl.cc
openssl.h
</pre>
<p>In the local repository, the user creates a <i>BUILD.ssl</i> file which contains the following
target definition:</p>
<pre class="code">
cc_library(
name = "openssl-lib",
srcs = ["src/openssl.cc"],
hdrs = ["src/openssl.h"],
)
</pre>
<p>Targets in the <i>~/chat-app</i> repository can depend on this target if the following lines are
added to <i>~/chat-app/WORKSPACE</i>:</p>
<pre class="code">
new_http_archive(
name = "my-ssl",
url = "http://example.com/openssl.zip",
sha256 = "03a58ac630e59778f328af4bcc4acb4f80208ed4",
build_file = "BUILD.ssl",
)
</pre>
<p>Targets would specify <code>@my-ssl//:openssl-lib</code> as a dependency to depend on this
jar.</p>
<!-- #END_BLAZE_RULE -->*/
|