1# Protobuf Ruby runtime 2# 3# See also code generation logic under /src/google/protobuf/compiler/ruby. 4 5load("@bazel_skylib//lib:selects.bzl", "selects") 6load("@bazel_skylib//rules:common_settings.bzl", "string_flag") 7load("@rules_pkg//pkg:mappings.bzl", "pkg_files", "strip_prefix") 8load("@rules_ruby//ruby:defs.bzl", "ruby_library") 9load("//:protobuf_version.bzl", "PROTOBUF_RUBY_VERSION") 10load("//conformance:defs.bzl", "conformance_test") 11load("//python:internal.bzl", "internal_copy_files") 12load("//ruby:defs.bzl", "internal_ruby_proto_library") 13 14################################################################################ 15# Ruby Runtime 16################################################################################ 17 18string_flag( 19 name = "ffi", 20 build_setting_default = "disabled", 21 values = [ 22 "enabled", 23 "disabled", 24 ], 25) 26 27config_setting( 28 name = "ffi_enabled", 29 flag_values = { 30 ":ffi": "enabled", 31 }, 32) 33 34config_setting( 35 name = "ffi_disabled", 36 flag_values = { 37 ":ffi": "disabled", 38 }, 39) 40 41selects.config_setting_group( 42 name = "jruby_ffi", 43 match_all = [ 44 ":ffi_enabled", 45 "@rules_ruby//ruby/runtime:config_jruby", 46 ], 47) 48 49selects.config_setting_group( 50 name = "jruby_native", 51 match_all = [ 52 ":ffi_disabled", 53 "@rules_ruby//ruby/runtime:config_jruby", 54 ], 55) 56 57selects.config_setting_group( 58 name = "ruby_ffi", 59 match_all = [ 60 ":ffi_enabled", 61 "@rules_ruby//ruby/runtime:config_ruby", 62 ], 63) 64 65selects.config_setting_group( 66 name = "ruby_native", 67 match_all = [ 68 ":ffi_disabled", 69 "@rules_ruby//ruby/runtime:config_ruby", 70 ], 71) 72 73selects.config_setting_group( 74 name = "macos_ffi_enabled", 75 match_all = [ 76 ":ffi_enabled", 77 "@platforms//os:osx", 78 ], 79) 80 81selects.config_setting_group( 82 name = "linux_ffi_enabled", 83 match_all = [ 84 ":ffi_enabled", 85 "@platforms//os:linux", 86 ], 87) 88 89internal_copy_files( 90 name = "copied_wkt_proto_files", 91 srcs = [ 92 "//:well_known_type_protos", 93 "//src/google/protobuf:descriptor_proto_srcs", 94 "//src/google/protobuf/compiler:plugin.proto", 95 ], 96 strip_prefix = "src", 97) 98 99internal_ruby_proto_library( 100 name = "well_known_ruby_protos", 101 srcs = [":copied_wkt_proto_files"], 102 default_runtime = "", 103 includes = ["."], 104 visibility = [ 105 "//conformance:__pkg__", 106 "//ruby:__subpackages__", 107 ], 108) 109 110internal_copy_files( 111 name = "copied_conformance_test_files", 112 testonly = 1, 113 srcs = [ 114 "//src/google/protobuf:test_messages_proto2.proto", 115 "//src/google/protobuf:test_messages_proto3.proto", 116 ], 117 strip_prefix = "src", 118) 119 120internal_ruby_proto_library( 121 name = "conformance_test_ruby_proto", 122 testonly = 1, 123 srcs = [":copied_conformance_test_files"], 124 includes = ["."], 125 visibility = [ 126 "//conformance:__pkg__", 127 "//ruby:__subpackages__", 128 ], 129 deps = [":well_known_ruby_protos"], 130) 131 132internal_copy_files( 133 name = "copied_conformance_editions_test_files", 134 testonly = 1, 135 srcs = [ 136 "//editions:golden/test_messages_proto2_editions.proto", 137 "//editions:golden/test_messages_proto3_editions.proto", 138 ], 139 strip_prefix = "editions/golden/", 140) 141 142internal_ruby_proto_library( 143 name = "conformance_editions_test_ruby_proto", 144 testonly = 1, 145 srcs = [":copied_conformance_editions_test_files"], 146 includes = ["."], 147 visibility = ["//conformance:__pkg__"], 148 deps = [":well_known_ruby_protos"], 149) 150 151ruby_library( 152 name = "protobuf", 153 visibility = [ 154 "//visibility:public", 155 ], 156 deps = ["//ruby/lib/google:protobuf_lib"], 157) 158 159# Note: these can be greatly simplified using inline_sh_binary in Bazel 6, 160# but doesn't work prior to that due to https://github.com/bazelbuild/bazel/issues/15043. 161# Instead, we need to manually copy all of the srcs into gendir from a genrule. 162genrule( 163 name = "jruby_release", 164 srcs = [ 165 "//third_party/utf8_range:utf8_range_srcs", 166 "//third_party/utf8_range:LICENSE", 167 "//ruby/lib/google:copy_jar", 168 "//ruby/lib/google:dist_files", 169 "//ruby/ext/google/protobuf_c:dist_files", 170 ":well_known_ruby_protos", 171 "google-protobuf.gemspec", 172 ], 173 outs = ["google-protobuf-" + PROTOBUF_RUBY_VERSION + "-java.gem"], 174 cmd = """ 175 set -eux 176 mkdir tmp 177 for src in $(SRCS); do 178 cp --parents -L "$$src" tmp 179 done 180 mkdir -p "tmp/ruby/ext/google/protobuf_c/third_party/utf8_range" 181 for utf in $(execpaths //third_party/utf8_range:utf8_range_srcs) $(execpath //third_party/utf8_range:LICENSE); do 182 mv "tmp/$$utf" "tmp/ruby/ext/google/protobuf_c/third_party/utf8_range" 183 done 184 for wkt in $(execpaths :well_known_ruby_protos); do 185 mv "tmp/$$wkt" "tmp/ruby/lib/google/protobuf/" 186 done 187 mv "tmp/$(execpath //ruby/lib/google:copy_jar)" "tmp/ruby/lib/google" 188 cd tmp/ruby 189 chmod -R 777 ./ 190 gem build google-protobuf.gemspec 191 cd ../.. 192 mv tmp/ruby/google-protobuf-*.gem $@ 193 """, 194 tags = ["manual"], 195 target_compatible_with = select({ 196 "@rules_ruby//ruby/runtime:config_jruby": [], 197 "//conditions:default": ["@platforms//:incompatible"], 198 }), 199) 200 201genrule( 202 name = "ruby_release", 203 srcs = [ 204 "//third_party/utf8_range:utf8_range_srcs", 205 "//third_party/utf8_range:LICENSE", 206 "//ruby/ext/google/protobuf_c:dist_files", 207 "//ruby/lib/google:dist_files", 208 ":well_known_ruby_protos", 209 "google-protobuf.gemspec", 210 ], 211 outs = ["google-protobuf-" + PROTOBUF_RUBY_VERSION + ".gem"], 212 cmd = """ 213 set -eux 214 mkdir tmp 215 for src in $(SRCS); do 216 cp --parents -L "$$src" "tmp" 217 done 218 mkdir -p "tmp/ruby/ext/google/protobuf_c/third_party/utf8_range" 219 for utf in $(execpaths //third_party/utf8_range:utf8_range_srcs) $(execpath //third_party/utf8_range:LICENSE); do 220 mv "tmp/$$utf" "tmp/ruby/ext/google/protobuf_c/third_party/utf8_range" 221 done 222 for wkt in $(execpaths :well_known_ruby_protos); do 223 mv "tmp/$$wkt" "tmp/ruby/lib/google/protobuf/" 224 done 225 cd tmp/ruby 226 chmod -R 777 ./ 227 gem build google-protobuf.gemspec 228 cd ../.. 229 mv tmp/ruby/google-protobuf-*.gem $@ 230 """, 231 tags = ["manual"], 232 target_compatible_with = select({ 233 "@rules_ruby//ruby/runtime:config_ruby": [], 234 "//conditions:default": ["@platforms//:incompatible"], 235 }), 236) 237 238filegroup( 239 name = "release", 240 srcs = select({ 241 "@rules_ruby//ruby/runtime:config_jruby": [":jruby_release"], 242 "//conditions:default": [":ruby_release"], 243 }), 244 tags = ["manual"], 245) 246 247################################################################################ 248# Tests 249################################################################################ 250 251conformance_test( 252 name = "conformance_test", 253 failure_list = "//conformance:failure_list_ruby.txt", 254 maximum_edition = "2023", 255 target_compatible_with = select({ 256 ":ruby_native": [], 257 "//conditions:default": ["@platforms//:incompatible"], 258 }), 259 testee = "//conformance:conformance_ruby", 260) 261 262conformance_test( 263 name = "conformance_test_ffi", 264 env = { 265 "PROTOCOL_BUFFERS_RUBY_IMPLEMENTATION": "ffi", 266 }, 267 failure_list = "//conformance:failure_list_ruby.txt", 268 maximum_edition = "2023", 269 target_compatible_with = select({ 270 ":ruby_ffi": [], 271 "//conditions:default": ["@platforms//:incompatible"], 272 }), 273 testee = "//conformance:conformance_ruby", 274) 275 276conformance_test( 277 name = "conformance_test_jruby", 278 failure_list = "//conformance:failure_list_jruby.txt", 279 maximum_edition = "2023", 280 target_compatible_with = select({ 281 ":jruby_native": [], 282 "//conditions:default": ["@platforms//:incompatible"], 283 }), 284 testee = "//conformance:conformance_ruby", 285) 286 287conformance_test( 288 name = "conformance_test_jruby_ffi", 289 env = { 290 "PROTOCOL_BUFFERS_RUBY_IMPLEMENTATION": "ffi", 291 }, 292 failure_list = "//conformance:failure_list_jruby_ffi.txt", 293 maximum_edition = "2023", 294 target_compatible_with = select({ 295 ":jruby_ffi": [], 296 "//conditions:default": ["@platforms//:incompatible"], 297 }), 298 testee = "//conformance:conformance_ruby", 299) 300 301################################################################################ 302# Distribution files 303################################################################################ 304 305pkg_files( 306 name = "dist_files", 307 srcs = [ 308 ".gitignore", 309 "BUILD.bazel", 310 "Gemfile", 311 "README.md", 312 "Rakefile", 313 "//ruby/ext/google/protobuf_c:dist_files", 314 "//ruby/lib/google:dist_files", 315 "//ruby/src/main/java:dist_files", 316 "//ruby/tests:dist_files", 317 ], 318 strip_prefix = strip_prefix.from_root(""), 319 visibility = ["//pkg:__pkg__"], 320) 321