Ruby FFI implementation (#13343)

Supersedes #11483.

Closes #13343

COPYBARA_INTEGRATE_REVIEW=https://github.com/protocolbuffers/protobuf/pull/13343 from protocolbuffers:simultaneous_ffi bcb4bb7842e672acf1a803fbd9abc6a27d00c020
PiperOrigin-RevId: 550782245
diff --git a/ruby/google-protobuf.gemspec b/ruby/google-protobuf.gemspec
index fbf0631..296cdb2 100644
--- a/ruby/google-protobuf.gemspec
+++ b/ruby/google-protobuf.gemspec
@@ -10,15 +10,31 @@
   s.email       = "protobuf@googlegroups.com"
   s.metadata    = { "source_code_uri" => "https://github.com/protocolbuffers/protobuf/tree/#{git_tag}/ruby" }
   s.require_paths = ["lib"]
-  s.files       = Dir.glob('lib/**/*.rb')
+  s.files       = Dir.glob('lib/**/*.{rb,rake}')
   if RUBY_PLATFORM == "java"
     s.platform  = "java"
-    s.files     += ["lib/google/protobuf_java.jar"]
+    s.files     += ["lib/google/protobuf_java.jar"] +
+      Dir.glob('ext/**/*').reject do |file|
+        File.basename(file) =~ /^((convert|defs|map|repeated_field)\.[ch]|
+                                   BUILD\.bazel|extconf\.rb|wrap_memcpy\.c)$/x
+      end
+    s.extensions = ["ext/google/protobuf_c/Rakefile"]
+    s.add_dependency "ffi", "~>1"
+    s.add_dependency "ffi-compiler", "~>1"
   else
-    s.files     += Dir.glob('ext/**/*')
-    s.extensions= ["ext/google/protobuf_c/extconf.rb"]
-    s.add_development_dependency "rake-compiler-dock", "= 1.2.1"  end
+    s.files     += Dir.glob('ext/**/*').reject do |file|
+      File.basename(file) =~ /^(BUILD\.bazel)$/
+    end
+    s.extensions = %w[
+      ext/google/protobuf_c/extconf.rb
+      ext/google/protobuf_c/Rakefile
+    ]
+    s.add_development_dependency "rake-compiler-dock", "= 1.2.1"
+  end
   s.required_ruby_version = '>= 2.5'
+  s.add_development_dependency "rake", "~> 13"
+  s.add_development_dependency "ffi", "~>1"
+  s.add_development_dependency "ffi-compiler", "~>1"
   s.add_development_dependency "rake-compiler", "~> 1.1.0"
   s.add_development_dependency "test-unit", '~> 3.0', '>= 3.0.9'
 end