blob: 2952a03e6535f2fa7aa5d241e7f39a2183eb7c54 [file] [log] [blame]
# Copyright (C) 2017 The Android Open Source Project
#
# 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.
# War packaging.
def _add_context(in_file, output):
input_path = in_file.path
return [
"unzip -qd %s %s" % (output, input_path),
]
def _add_file(name, in_file, output):
output_path = output
input_path = in_file.path
short_path = in_file.short_path
n = in_file.basename
if n != "web.xml" and short_path.startswith("%s-" % name):
n = short_path.split("/")[0] + "-" + n
output_path = output_path + n
return [
"test -L %s || ln -s $(pwd)/%s %s" % (output_path, input_path, output_path),
]
def _make_war(input_dir, output):
return "(%s)" % " && ".join([
"root=$(pwd)",
"cd %s" % input_dir,
"find . -exec touch -t 198001010000 '{}' ';' 2> /dev/null",
"zip -9qr ${root}/%s ." % (output.path),
])
def _war_impl(ctx):
war = ctx.outputs.war
build_output = war.path + ".build_output"
inputs = []
cmd = [
"set -e;rm -rf " + build_output,
"mkdir -p " + build_output,
"mkdir -p %s/WEB-INF/lib" % build_output,
]
transitive_libs = []
for l in ctx.attr.libs:
if JavaInfo in l:
transitive_libs.append(l[JavaInfo].transitive_runtime_deps)
elif hasattr(l, "files"):
transitive_libs.append(l.files)
transitive_lib_deps = depset(transitive = transitive_libs)
for dep in transitive_lib_deps.to_list():
cmd = cmd + _add_file(ctx.attr.name, dep, build_output + "/WEB-INF/lib/")
inputs.append(dep)
if ctx.attr.web_xml:
for web_xml in ctx.attr.web_xml.files.to_list():
inputs.append(web_xml)
cmd = cmd + _add_file(ctx.attr.name, web_xml, build_output + "/WEB-INF/")
transitive_context_libs = []
if ctx.attr.context:
for jar in ctx.attr.context:
if JavaInfo in jar:
transitive_context_libs.append(jar[JavaInfo].transitive_runtime_deps)
elif hasattr(jar, "files"):
transitive_context_libs.append(jar.files)
transitive_context_deps = depset(transitive = transitive_context_libs)
for dep in transitive_context_deps.to_list():
cmd = cmd + _add_context(dep, build_output)
inputs.append(dep)
# Add zip war
cmd.append(_make_war(build_output, war))
ctx.actions.run_shell(
inputs = inputs,
outputs = [war],
mnemonic = "WAR",
command = "\n".join(cmd),
use_default_shell_env = True,
)
# context: go to the root directory
# libs: go to the WEB-INF/lib directory
# web_xml: go to the WEB-INF directory
_pkg_war = rule(
attrs = {
"context": attr.label_list(allow_files = True),
"libs": attr.label_list(allow_files = [".jar"]),
"web_xml": attr.label(allow_files = True),
},
outputs = {"war": "%{name}.war"},
implementation = _war_impl,
)
def pkg_war(name, context = [], **kwargs):
_pkg_war(
name = name,
context = context,
**kwargs
)