diff options
author | 2016-02-18 16:44:29 +0000 | |
---|---|---|
committer | 2016-02-19 08:56:47 +0000 | |
commit | 8ec3866d9e5d28f6c09546269ec82731c45c28ad (patch) | |
tree | 4379317b76f263193d97f513e169b082c950e2eb /tools/build_rules | |
parent | 432d715c2189ca772c96b102a1c2bc2a063988fa (diff) |
Split out Java proto compilation logic to a helper script.
This is just for clarity and should be a no-op. Maintaining long shell
command lines embedded in genrules is not pretty.
--
MOS_MIGRATED_REVID=114967410
Diffstat (limited to 'tools/build_rules')
-rw-r--r-- | tools/build_rules/BUILD | 6 | ||||
-rw-r--r-- | tools/build_rules/genproto.bzl | 32 | ||||
-rwxr-xr-x | tools/build_rules/gensrcjar.sh | 64 |
3 files changed, 85 insertions, 17 deletions
diff --git a/tools/build_rules/BUILD b/tools/build_rules/BUILD index 1184bb1895..a00791e4eb 100644 --- a/tools/build_rules/BUILD +++ b/tools/build_rules/BUILD @@ -1,5 +1,11 @@ licenses(["notice"]) # Apache 2.0 +sh_binary( + name = "gensrcjar", + srcs = ["gensrcjar.sh"], + visibility = ["//visibility:public"], +) + filegroup( name = "srcs", srcs = glob(["**"]), diff --git a/tools/build_rules/genproto.bzl b/tools/build_rules/genproto.bzl index 17177dda5f..4ba5463fb5 100644 --- a/tools/build_rules/genproto.bzl +++ b/tools/build_rules/genproto.bzl @@ -19,23 +19,20 @@ proto_filetype = FileType([".proto"]) def gensrcjar_impl(ctx): out = ctx.outputs.srcjar - proto_output = out.path + ".proto_output" - proto_compiler = ctx.file._proto_compiler - sub_commands = [ - "rm -rf " + proto_output, - "mkdir " + proto_output, - ' '.join([proto_compiler.path, "--java_out=" + proto_output, - ctx.file.src.path]), - "touch -t 198001010000 $(find " + proto_output + ")", - ctx.file._jar.path + " cMf " + out.path + " -C " + proto_output + " .", - ] ctx.action( - command=" && ".join(sub_commands), - inputs=[ctx.file.src, proto_compiler, ctx.file._jar] + ctx.files._jdk, + command=' '.join([ + "JAR='%s'" % ctx.file._jar.path, + "OUTPUT='%s'" % out.path, + "PROTO_COMPILER='%s'" % ctx.file._proto_compiler.path, + "SOURCE='%s'" % ctx.file.src.path, + ctx.executable._gensrcjar.path, + ]), + inputs=([ctx.file.src] + ctx.files._gensrcjar + ctx.files._jar + + ctx.files._proto_compiler), outputs=[out], mnemonic="GenProtoSrcJar", - use_default_shell_env = True) + use_default_shell_env=True) gensrcjar = rule( gensrcjar_impl, @@ -44,6 +41,11 @@ gensrcjar = rule( allow_files = proto_filetype, single_file = True, ), + "_gensrcjar": attr.label( + default = Label("@bazel_tools//tools/build_rules:gensrcjar"), + allow_files = True, + executable = True, + ), # TODO(bazel-team): this should be a hidden attribute with a default # value, but Skylark needs to support select first. "_proto_compiler": attr.label( @@ -56,10 +58,6 @@ gensrcjar = rule( allow_files = True, single_file = True, ), - "_jdk": attr.label( - default = Label("@bazel_tools//tools/jdk:jdk"), - allow_files = True, - ), }, outputs = {"srcjar": "lib%{name}.srcjar"}, ) diff --git a/tools/build_rules/gensrcjar.sh b/tools/build_rules/gensrcjar.sh new file mode 100755 index 0000000000..365aaa86e3 --- /dev/null +++ b/tools/build_rules/gensrcjar.sh @@ -0,0 +1,64 @@ +#! /bin/sh +# 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. + +# List of environment variables that must be defined as input. +# +# We use environment variables instead of positional arguments or flags for +# clarity in the caller .bzl file and for simplicity of processing. There is no +# need to implement a full-blown argument parser for this simple script. +INPUT_VARS="JAR OUTPUT PROTO_COMPILER SOURCE" + +# Basename of the script for error reporting purposes. +PROGRAM_NAME="${0##*/}" + +# A timestamp to mark all generated files with to get deterministic JAR outputs. +TIMESTAMP=198001010000 + +# Prints an error and exits. +# +# Args: +# ...: list(str). Parts of the message to print; all of them are joined +# with a single space in between. +err() { + echo "${PROGRAM_NAME}: ${*}" 1>&2 + exit 1 +} + +# Entry point. +main() { + [ ${#} -eq 0 ] || err "No arguments allowed; set the following environment" \ + "variables for configuration instead: ${INPUT_VARS}" + for var in ${INPUT_VARS}; do + local value + eval "value=\"\$${var}\"" + [ -n "${value}" ] || err "Input environment variable ${var} is not set" + done + + rm -f "${OUTPUT}" + + local proto_output="${OUTPUT}.proto_output" + rm -rf "${proto_output}" + mkdir -p "${proto_output}" + + "${PROTO_COMPILER}" --java_out="${proto_output}" "${SOURCE}" \ + || err "proto_compiler failed" + find "${proto_output}" -exec touch -t "${TIMESTAMP}" '{}' \; \ + || err "Failed to reset timestamps" + "${JAR}" cMf "${OUTPUT}.tmp" -C "${proto_output}" . \ + || err "jar failed" + mv "${OUTPUT}.tmp" "${OUTPUT}" +} + +main "${@}" |