Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,16 @@ jobs:

- run: echo $CGO_CFLAGS

- name: export BUILD_TAG for golangci-lint
run: echo "BUILD_TAG=$(bundle exec rake go:build_tag)" >> $GITHUB_ENV

- run: echo $BUILD_TAG

- name: golangci-lint
uses: golangci/golangci-lint-action@v6
with:
version: v1.60
args: --build-tags ${{ env.BUILD_TAG }}

- name: Slack Notification (not success)
uses: act10ns/slack@v2
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/matrix.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"1.23"
],
"ruby": [
"3.3"
"3.3",
"3.4"
]
}
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ group :development do
gem "rake"
gem "rubocop", require: false
gem "rubocop_auto_corrector", require: false
gem "ruby_header_parser", ">= 0.3.1"
gem "ruby_header_parser", ">= 0.4.1"
gem "yard"
end

Expand Down
8 changes: 4 additions & 4 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ GEM
debug_inspector (1.2.0)
diff-lcs (1.5.1)
drb (2.2.1)
ffi (1.17.0)
ffi (1.17.0-arm64-darwin)
ffi (1.17.1)
ffi (1.17.1-arm64-darwin)
fileutils (1.7.3)
i18n (1.14.6)
concurrent-ruby (~> 1.0)
Expand Down Expand Up @@ -113,7 +113,7 @@ GEM
rubocop_auto_corrector (0.5.0)
rubocop (>= 1.30.0)
ruby-progressbar (1.13.0)
ruby_header_parser (0.3.1)
ruby_header_parser (0.4.1)
securerandom (0.4.1)
serverspec (2.42.3)
multi_json
Expand Down Expand Up @@ -171,7 +171,7 @@ DEPENDENCIES
rspec-temp_dir
rubocop
rubocop_auto_corrector
ruby_header_parser (>= 0.3.1)
ruby_header_parser (>= 0.4.1)
serverspec
steep
test-unit
Expand Down
2 changes: 1 addition & 1 deletion _gem/go_gem.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
spec.description = "Helpers for compiling Go extensions for ruby"
spec.homepage = "https://github.com/ruby-go-gem/go-gem-wrapper"
spec.license = "MIT"
spec.required_ruby_version = ">= 3.3.0"
spec.required_ruby_version = [">= 3.3.0", "< 3.5.0"]

spec.metadata["homepage_uri"] = spec.homepage
spec.metadata["source_code_uri"] = "#{spec.homepage}/tree/main/_gem"
Expand Down
6 changes: 5 additions & 1 deletion _gem/lib/go_gem/mkmf.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# frozen_string_literal: true

require_relative "util"

module GoGem
# Helper module for creating Go Makefiles
module Mkmf
Expand Down Expand Up @@ -35,11 +37,13 @@ def $objs.empty?; false; end

current_dir = File.expand_path(".")

goflags = "-tags=#{GoGem::Util.ruby_minor_version_build_tag}"

File.open("Makefile", "a") do |f|
f.write <<~MAKEFILE.gsub(/^ {8}/, "\t")
$(DLLIB): Makefile $(srcdir)/*.go
cd $(srcdir); \
CGO_CFLAGS='$(INCFLAGS)' CGO_LDFLAGS='#{ldflags}' \
CGO_CFLAGS='$(INCFLAGS)' CGO_LDFLAGS='#{ldflags}' GOFLAGS='#{goflags}' \
go build -p 4 -buildmode=c-shared -o #{current_dir}/$(DLLIB)
MAKEFILE
end
Expand Down
60 changes: 45 additions & 15 deletions _gem/lib/go_gem/rake_task.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
require "rake"
require "rake/tasklib"

require_relative "util"

module GoGem
# Provides rake tasks for `go test` with CRuby
#
Expand Down Expand Up @@ -40,7 +42,7 @@ module GoGem
# end
# end
# end
class RakeTask < ::Rake::TaskLib
class RakeTask < ::Rake::TaskLib # rubocop:disable Metrics/ClassLength
DEFAULT_TASK_NAMESPACE = :go

DEFAULT_GO_BIN_PATH = "go"
Expand Down Expand Up @@ -87,27 +89,16 @@ def initialize(gem_name)
define_go_testrace_task
define_go_fmt_task
define_go_build_envs_task
define_go_build_tag_task
end
end

# Generate environment variables to build go programs in the Go gem
#
# @return [Hash<String, String>]
def self.build_env_vars
ldflags = "-L#{RbConfig::CONFIG["libdir"]} -l#{RbConfig::CONFIG["RUBY_SO_NAME"]}"

case `#{RbConfig::CONFIG["CC"]} --version` # rubocop:disable Lint/LiteralAsCondition
when /Free Software Foundation/
ldflags << " -Wl,--unresolved-symbols=ignore-all"
when /clang/
ldflags << " -undefined dynamic_lookup"
end

cflags = [
RbConfig::CONFIG["CFLAGS"],
"-I#{RbConfig::CONFIG["rubyarchhdrdir"]}",
"-I#{RbConfig::CONFIG["rubyhdrdir"]}",
].join(" ")
ldflags = generate_ldflags
cflags = generate_cflags

# FIXME: Workaround for Ubuntu (GitHub Actions)
if RUBY_PLATFORM =~ /linux/i
Expand All @@ -123,12 +114,44 @@ def self.build_env_vars
ld_library_path = RbConfig::CONFIG["libdir"].to_s

{
"GOFLAGS" => generate_goflags,
"CGO_CFLAGS" => cflags,
"CGO_LDFLAGS" => ldflags,
"LD_LIBRARY_PATH" => ld_library_path,
}
end

# @return [String]
def self.generate_goflags
"-tags=#{GoGem::Util.ruby_minor_version_build_tag}"
end
private_class_method :generate_goflags

# @return [String]
def self.generate_ldflags
ldflags = "-L#{RbConfig::CONFIG["libdir"]} -l#{RbConfig::CONFIG["RUBY_SO_NAME"]}"

case `#{RbConfig::CONFIG["CC"]} --version` # rubocop:disable Lint/LiteralAsCondition
when /Free Software Foundation/
ldflags << " -Wl,--unresolved-symbols=ignore-all"
when /clang/
ldflags << " -undefined dynamic_lookup"
end

ldflags
end
private_class_method :generate_ldflags

# @return [String]
def self.generate_cflags
[
RbConfig::CONFIG["CFLAGS"],
"-I#{RbConfig::CONFIG["rubyarchhdrdir"]}",
"-I#{RbConfig::CONFIG["rubyhdrdir"]}",
].join(" ")
end
private_class_method :generate_cflags

# @yield
def within_target_dir
Dir.chdir(target_dir) do # rubocop:disable Style/ExplicitBlockArgument
Expand Down Expand Up @@ -183,5 +206,12 @@ def define_go_build_envs_task
end
end
end

def define_go_build_tag_task
desc "Print build tag"
task(:build_tag) do
puts GoGem::Util.ruby_minor_version_build_tag
end
end
end
end
18 changes: 18 additions & 0 deletions _gem/lib/go_gem/util.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# frozen_string_literal: true

module GoGem
# Common utility methods for {GoGem::Mkmf} and {GoGem::RakeTask}
module Util
# Return ruby version build tag for `go build` and `go test`
#
# @param ruby_version [String]
# @return [String]
#
# @example
# GoGem::Util.ruby_minor_version_build_tag("3.4.1")
# #=> "ruby_3_4"
def self.ruby_minor_version_build_tag(ruby_version = RUBY_VERSION)
"ruby_#{ruby_version.to_f.to_s.gsub(".", "_")}"
end
end
end
10 changes: 9 additions & 1 deletion _gem/sig/go_gem/rake_task.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,13 @@ module GoGem

def initialize: (String gem_name) ?{ (RakeTask) -> void } -> void

def self.build_env_vars: () -> { "CGO_CFLAGS" => String, "CGO_LDFLAGS" => String, "LD_LIBRARY_PATH" => String }
def self.build_env_vars: () -> { "GOFLAGS" => String, "CGO_CFLAGS" => String, "CGO_LDFLAGS" => String, "LD_LIBRARY_PATH" => String }

def self.generate_goflags: () -> String

def self.generate_ldflags: () -> String

def self.generate_cflags: () -> String

private

Expand All @@ -40,6 +46,8 @@ module GoGem

def define_go_build_envs_task: () -> void

def define_go_build_tag_task: () -> void

def within_target_dir: () { () -> void } -> void

def ext_dir: () -> String
Expand Down
5 changes: 5 additions & 0 deletions _gem/sig/go_gem/util.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module GoGem
module Util
def self.ruby_minor_version_build_tag: (?String ruby_version) -> String
end
end
1 change: 1 addition & 0 deletions _gem/spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
require "go_gem"
require "go_gem/mkmf"
require "go_gem/rake_task"
require "go_gem/util"

require "tmpdir"
require "serverspec"
Expand Down
4 changes: 3 additions & 1 deletion _tasks/go.rake
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ namespace :go do
sh "which golangci-lint" do |ok, _|
raise "golangci-lint isn't installed. See. https://golangci-lint.run/welcome/install/" unless ok
end
sh GoGem::RakeTask.build_env_vars, "golangci-lint run"

build_tag = GoGem::Util.ruby_minor_version_build_tag
sh GoGem::RakeTask.build_env_vars, "golangci-lint run --build-tags #{build_tag}"
end
end

Expand Down
1 change: 1 addition & 0 deletions _tools/ruby_h_to_go/lib/ruby_h_to_go.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

require "forwardable"
require "ruby_header_parser"
require "go_gem/util"

require_relative "ruby_h_to_go/type_helper"

Expand Down
2 changes: 1 addition & 1 deletion _tools/ruby_h_to_go/lib/ruby_h_to_go/cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ def write_enum_definitions_to_go_file

# Clean all generated files in dist/
def clean_generated_files
FileUtils.rm_f(Dir.glob(File.join(dist_dir, "*_generated.go")))
FileUtils.rm_f(Dir.glob(File.join(dist_dir, "*_#{GoGem::Util.ruby_minor_version_build_tag}_generated.go")))
end

def copy_go_files
Expand Down
2 changes: 1 addition & 1 deletion _tools/ruby_h_to_go/lib/ruby_h_to_go/enum_definition.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def initialize(definition:)
# Write definition as go file
# @param [String] dist_dir
def write_go_file(dist_dir)
go_file_path = File.join(dist_dir, "enum_generated.go")
go_file_path = File.join(dist_dir, "enum_#{GoGem::Util.ruby_minor_version_build_tag}_generated.go")

GoUtil.generate_initial_go_file(go_file_path)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def args
# Write definition as go file
# @param [String] dist_dir
def write_go_file(dist_dir)
go_file_path = File.join(dist_dir, "function_generated.go")
go_file_path = File.join(dist_dir, "function_#{GoGem::Util.ruby_minor_version_build_tag}_generated.go")

GoUtil.generate_initial_go_file(go_file_path)

Expand Down
4 changes: 4 additions & 0 deletions _tools/ruby_h_to_go/lib/ruby_h_to_go/go_util.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,16 @@ def self.snake_to_camel(str)
def self.generate_initial_go_file(go_file_path)
return if File.exist?(go_file_path)

ruby_build_tag = GoGem::Util.ruby_minor_version_build_tag

File.binwrite(go_file_path, <<~GO)
// THE AUTOGENERATED LICENSE. ALL THE RIGHTS ARE RESERVED BY ROBOTS.

// WARNING: This file has automatically been generated
// Code generated by ruby_h_to_go. DO NOT EDIT.

//go:build #{ruby_build_tag}

package ruby

/*
Expand Down
2 changes: 1 addition & 1 deletion _tools/ruby_h_to_go/lib/ruby_h_to_go/struct_definition.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def initialize(definition:)
# Write definition as go file
# @param [String] dist_dir
def write_go_file(dist_dir)
go_file_path = File.join(dist_dir, "struct_generated.go")
go_file_path = File.join(dist_dir, "struct_#{GoGem::Util.ruby_minor_version_build_tag}_generated.go")

GoUtil.generate_initial_go_file(go_file_path)

Expand Down
2 changes: 1 addition & 1 deletion _tools/ruby_h_to_go/lib/ruby_h_to_go/type_definition.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def initialize(definition:)
# Write definition as go file
# @param [String] dist_dir
def write_go_file(dist_dir)
go_file_path = File.join(dist_dir, "type_generated.go")
go_file_path = File.join(dist_dir, "type_#{GoGem::Util.ruby_minor_version_build_tag}_generated.go")

GoUtil.generate_initial_go_file(go_file_path)

Expand Down
2 changes: 2 additions & 0 deletions ruby/enum_generated.go → ruby/enum_ruby_3_3_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading