summaryrefslogtreecommitdiff
path: root/vendor/bundle/ruby/3.4.0/gems/google-protobuf-4.35.1-arm64-darwin/lib/google/tasks
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/bundle/ruby/3.4.0/gems/google-protobuf-4.35.1-arm64-darwin/lib/google/tasks')
-rwxr-xr-xvendor/bundle/ruby/3.4.0/gems/google-protobuf-4.35.1-arm64-darwin/lib/google/tasks/ffi.rake100
1 files changed, 100 insertions, 0 deletions
diff --git a/vendor/bundle/ruby/3.4.0/gems/google-protobuf-4.35.1-arm64-darwin/lib/google/tasks/ffi.rake b/vendor/bundle/ruby/3.4.0/gems/google-protobuf-4.35.1-arm64-darwin/lib/google/tasks/ffi.rake
new file mode 100755
index 0000000..e983c1a
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/google-protobuf-4.35.1-arm64-darwin/lib/google/tasks/ffi.rake
@@ -0,0 +1,100 @@
+# # @param task [FFI::Compiler::CompileTask] task to configure
+def configure_common_compile_task(task)
+ if FileUtils.pwd.include? 'ext'
+ src_dir = '.'
+ third_party_path = 'third_party/utf8_range'
+ else
+ src_dir = 'ext/google/protobuf_c'
+ third_party_path = 'ext/google/protobuf_c/third_party/utf8_range'
+ end
+
+ task.add_include_path third_party_path
+ task.add_define 'NDEBUG'
+ task.cflags << "-std=gnu99 -O3"
+ [
+ :convert, :defs, :map, :message, :protobuf, :repeated_field
+ ].each { |file| task.exclude << "/#{file}.c" }
+ task.ext_dir = src_dir
+ task.source_dirs = [src_dir]
+ if RbConfig::CONFIG['target_os'] =~ /darwin|linux/
+ task.cflags << "-Wall -Wsign-compare -Wno-declaration-after-statement"
+ end
+end
+
+# FFI::CompilerTask's constructor walks the filesystem at task definition time
+# to create subtasks for each source file, so files from third_party must be
+# copied into place before the task is defined for it to work correctly.
+# TODO Is there a sane way to check for generated protos under lib too?
+def with_generated_files
+ expected_path = FileUtils.pwd.include?('ext') ? 'third_party/utf8_range' : 'ext/google/protobuf_c/third_party/utf8_range'
+ if File.directory?(expected_path)
+ yield
+ else
+ task :default do
+ # It is possible, especially in cases like the first invocation of
+ # `rake test` following `rake clean` or a fresh checkout that the
+ # `copy_third_party` task has been executed since initial task definition.
+ # If so, run the task definition block now and invoke it explicitly.
+ if File.directory?(expected_path)
+ yield
+ Rake::Task[:default].invoke
+ else
+ raise "Missing directory #{File.absolute_path(expected_path)}." +
+ " Did you forget to run `rake copy_third_party` before building" +
+ " native extensions?"
+ end
+ end
+ end
+end
+
+begin
+ require "ffi-compiler/compile_task"
+
+ desc "Compile Protobuf library for FFI"
+ namespace "ffi-protobuf" do
+ with_generated_files do
+ # Compile Ruby UPB separately in order to limit use of -DUPB_BUILD_API to one
+ # compilation unit.
+ desc "Compile UPB library for FFI"
+ namespace "ffi-upb" do
+ with_generated_files do
+ FFI::Compiler::CompileTask.new('ruby-upb') do |c|
+ configure_common_compile_task c
+ c.add_define "UPB_BUILD_API"
+ c.exclude << "/glue.c"
+ c.exclude << "/shared_message.c"
+ c.exclude << "/shared_convert.c"
+ if RbConfig::CONFIG['target_os'] =~ /darwin|linux/
+ c.cflags << "-fvisibility=hidden"
+ end
+ end
+ end
+ end
+
+ FFI::Compiler::CompileTask.new 'protobuf_c_ffi' do |c|
+ configure_common_compile_task c
+ # Ruby UPB was already compiled with different flags.
+ c.exclude << "/utf8_range.c"
+ c.exclude << "/ruby-upb.c"
+ end
+
+ # Setup dependencies so that the .o files generated by building ffi-upb are
+ # available to link here.
+ # TODO Can this be simplified? Can the single shared library be used
+ # instead of the object files?
+ protobuf_c_task = Rake::Task[:default]
+ protobuf_c_shared_lib_task = Rake::Task[protobuf_c_task.prereqs.last]
+ ruby_upb_shared_lib_task = Rake::Task[:"ffi-upb:default"].prereqs.first
+ Rake::Task[ruby_upb_shared_lib_task].prereqs.each do |dependency|
+ protobuf_c_shared_lib_task.prereqs.prepend dependency
+ end
+ end
+ end
+rescue LoadError
+ desc "Compile Protobuf library for FFI"
+ namespace "ffi-protobuf" do
+ task :default do
+ warn "Skipping build of FFI; `gem install ffi-compiler` to enable."
+ end
+ end
+end