• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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