From 68deee0252035b97c12d1e6cc7f2d51be88dcf71 Mon Sep 17 00:00:00 2001 From: Mike Kruskal Date: Fri, 20 Jan 2023 15:08:14 -0800 Subject: [PATCH] Migrate ruby release targets to genrule to work around Bazel 5 bug --- ruby/BUILD.bazel | 52 +++++++++++++++++----- ruby/build_jruby_release.sh | 63 -------------------------- ruby/build_release.sh | 88 ------------------------------------- 3 files changed, 40 insertions(+), 163 deletions(-) delete mode 100755 ruby/build_jruby_release.sh delete mode 100755 ruby/build_release.sh diff --git a/ruby/BUILD.bazel b/ruby/BUILD.bazel index b469bc8fc4..3c22730c36 100755 --- a/ruby/BUILD.bazel +++ b/ruby/BUILD.bazel @@ -4,6 +4,7 @@ load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix") load("@rules_ruby//ruby:defs.bzl", "ruby_library") +load("//build_defs:internal_shell.bzl", "inline_sh_binary") load("//:protobuf.bzl", "internal_ruby_proto_library") load("//conformance:defs.bzl", "conformance_test") load("//:protobuf_version.bzl", "PROTOBUF_RUBY_VERSION") @@ -20,27 +21,39 @@ ruby_library( ], ) -sh_binary( +# Note: these can be greatly simplified using inline_sh_binary in Bazel 6, +# but doesn't work prior to that due to https://github.com/bazelbuild/bazel/issues/15043. +# Instead, we need to manually copy all of the srcs into gendir from a genrule. +genrule( name = "jruby_release", - data = [ + srcs = [ "//ruby/lib/google:copy_jar", "//ruby/lib/google:dist_files", "//:well_known_ruby_protos", "google-protobuf.gemspec", ], - srcs = [ - "build_jruby_release.sh", - ], - deps = ["@bazel_tools//tools/bash/runfiles"], + outs = ["google-protobuf-"+PROTOBUF_RUBY_VERSION+"-java.gem"], + cmd = """ + set -eux + for src in $(SRCS); do + cp --parents "$$src" "$(GENDIR)" + done + for wkt in $(execpaths //:well_known_ruby_protos); do + cp "$$wkt" "$(GENDIR)/ruby/lib/google/protobuf/" + done + cd $(GENDIR)/ruby + chmod -R 777 ./ + gem build google-protobuf.gemspec + """, target_compatible_with = select({ "@rules_ruby//ruby/runtime:config_jruby": [], "//conditions:default": ["@platforms//:incompatible"], }), ) -sh_binary( +genrule( name = "release", - data = [ + srcs = [ "@utf8_range//:utf8_range_srcs", "@utf8_range//:LICENSE", "//:well_known_ruby_protos", @@ -48,16 +61,31 @@ sh_binary( "//ruby/lib/google:dist_files", "google-protobuf.gemspec", ], - srcs = [ - "build_release.sh", - ], - deps = ["@bazel_tools//tools/bash/runfiles"], + outs = ["google-protobuf-"+PROTOBUF_RUBY_VERSION+".gem"], + cmd = """ + set -eux + for src in $(SRCS); do + cp --parents "$$src" "$(GENDIR)" + done + mkdir -p "$(GENDIR)/ruby/ext/google/protobuf_c/third_party/utf8_range" + for utf in $(execpaths @utf8_range//:utf8_range_srcs) $(execpath @utf8_range//:LICENSE); do + cp "$$utf" "$(GENDIR)/ruby/ext/google/protobuf_c/third_party/utf8_range" + done + for wkt in $(execpaths //:well_known_ruby_protos); do + cp "$$wkt" "$(GENDIR)/ruby/lib/google/protobuf/" + done + cd $(GENDIR)/ruby + chmod -R 777 ./ + gem build google-protobuf.gemspec + pwd + """, target_compatible_with = select({ "@rules_ruby//ruby/runtime:config_ruby": [], "//conditions:default": ["@platforms//:incompatible"], }), ) + ################################################################################ # Tests ################################################################################ diff --git a/ruby/build_jruby_release.sh b/ruby/build_jruby_release.sh deleted file mode 100755 index 9ff66d680a..0000000000 --- a/ruby/build_jruby_release.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -# This file should be executed with jruby - -set -ex - -# --- begin runfiles.bash initialization --- -# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash). -set -euo pipefail -if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then - if [[ -f "$0.runfiles_manifest" ]]; then - export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest" - elif [[ -f "$0.runfiles/MANIFEST" ]]; then - export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST" - elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then - export RUNFILES_DIR="$0.runfiles" - fi -fi -if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then - source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash" -elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then - source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \ - "$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)" -else -echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash" -exit 1 -fi -# --- end runfiles.bash initialization --- - -# Make a temporary directory and move to it to do all packaging work -mkdir -p tmp -cd tmp - -# Move all generated files to lib/google/protobuf -mkdir -p lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/any_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/api_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/descriptor_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/duration_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/empty_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/field_mask_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/source_context_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/struct_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/timestamp_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/type_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/wrappers_pb.rb)" lib/google/protobuf - -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf_java.jar)" lib/google - -# Move all source files to the correct location -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf.rb)" lib/google -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf/descriptor_dsl.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf/message_exts.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf/repeated_field.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf/well_known_types.rb)" lib/google/protobuf - -# Move gemspec file to current directory -cp "$(rlocation com_google_protobuf/ruby/google.protobuf.gemspec)" . - -# Make all files global readable/writable/executable -chmod -R 777 ./ - -# Build gem -gem build google-protobuf.gemspec diff --git a/ruby/build_release.sh b/ruby/build_release.sh deleted file mode 100755 index c9b68d1514..0000000000 --- a/ruby/build_release.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash -# This file should be executed with ruby - -set -ex - -# --- begin runfiles.bash initialization --- -# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash). -set -euo pipefail -if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then - if [[ -f "$0.runfiles_manifest" ]]; then - export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest" - elif [[ -f "$0.runfiles/MANIFEST" ]]; then - export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST" - elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then - export RUNFILES_DIR="$0.runfiles" - fi -fi -if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then - source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash" -elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then - source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \ - "$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)" -else -echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash" -exit 1 -fi -# --- end runfiles.bash initialization --- - -# rvm use ruby-3.0 - -# Make a temporary directory and move to it to do all packaging work -mkdir -p tmp -cd tmp - -# Move all generated files to lib/google/protobuf -mkdir -p lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/any_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/api_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/descriptor_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/duration_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/empty_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/field_mask_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/source_context_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/struct_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/timestamp_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/type_pb.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/src/google/protobuf/wrappers_pb.rb)" lib/google/protobuf - -# Move all utf-8 files to ext/google/protobuf_c/third_party/utf8_range -UTF8_DIR=ext/google/protobuf_c/third_party/utf8_range -mkdir -p $UTF8_DIR -cp "$(rlocation utf8_range/LICENSE)" $UTF8_DIR/LICENSE -cp "$(rlocation utf8_range/naive.c)" $UTF8_DIR -cp "$(rlocation utf8_range/range2-neon.c)" $UTF8_DIR -cp "$(rlocation utf8_range/range2-sse.c)" $UTF8_DIR -cp "$(rlocation utf8_range/utf8_range.h)" $UTF8_DIR - -# Move all source files to the correct location -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/convert.c)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/convert.h)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/defs.c)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/defs.h)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/extconf.rb)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/map.c)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/map.h)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/message.c)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/message.h)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/protobuf.c)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/protobuf.h)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/repeated_field.c)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/repeated_field.h)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/ruby-upb.c)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/ruby-upb.h)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/ext/google/protobuf_c/wrap_memcpy.c)" ext/google/protobuf_c -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf.rb)" lib/google -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf/descriptor_dsl.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf/message_exts.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf/repeated_field.rb)" lib/google/protobuf -cp "$(rlocation com_google_protobuf/ruby/lib/google/protobuf/well_known_types.rb)" lib/google/protobuf - -# Move gemspec file to current directory -cp "$(rlocation com_google_protobuf/ruby/google.protobuf.gemspec)" . - -# Make all files global readable/writable/executable -chmod -R 777 ./ - -# Build gem -gem build google-protobuf.gemspec