diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d1d901df..340edb3f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,11 +8,20 @@ jobs: strategy: fail-fast: false matrix: - ruby: ['2.7', '3.0', '3.1', '3.2', '3.3'] # 3.4+ is not yet supported by google-protobuf - os: ['ubuntu-latest', 'windows-latest'] + ruby: + - '2.7' + - '3.0' + - '3.1' + - '3.2' + - '3.3' + # When 3.4 is released, replace `ruby-head` with `3.4`, `3.4.0-rc1` can't be used on `windows-latest` + - 'ruby-head' + os: + - 'ubuntu-latest' + - 'windows-latest' runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} @@ -21,4 +30,4 @@ jobs: run: bundle exec rake test - name: RuboCop run: bundle exec rake lint - if: matrix.ruby != '3.1' && matrix.ruby != '3.2' && matrix.ruby != '3.3' + if: matrix.ruby != '3.1' && matrix.ruby != '3.2' && matrix.ruby != '3.3' && matrix.ruby != 'ruby-head' diff --git a/Gemfile.lock b/Gemfile.lock index 891b3df2..9ccf6c33 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,32 +7,35 @@ PATH GEM remote: https://rubygems.org/ specs: - ast (2.4.1) - diff-lcs (1.5.0) - docile (1.4.0) - google-protobuf (3.25.5) - parallel (1.20.1) + ast (2.4.2) + bigdecimal (3.1.8) + diff-lcs (1.5.1) + docile (1.4.1) + google-protobuf (4.29.2) + bigdecimal + rake (>= 13) + parallel (1.26.3) parser (2.7.2.0) ast (~> 2.4.1) powerpack (0.1.3) rainbow (2.2.2) rake - rake (13.0.3) + rake (13.2.1) rake-compiler (0.9.9) rake - rspec (3.12.0) - rspec-core (~> 3.12.0) - rspec-expectations (~> 3.12.0) - rspec-mocks (~> 3.12.0) - rspec-core (3.12.2) - rspec-support (~> 3.12.0) - rspec-expectations (3.12.3) + rspec (3.13.0) + rspec-core (~> 3.13.0) + rspec-expectations (~> 3.13.0) + rspec-mocks (~> 3.13.0) + rspec-core (3.13.2) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.3) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-mocks (3.12.6) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-support (3.12.1) + rspec-support (~> 3.13.0) + rspec-support (3.13.2) rubocop (0.49.1) parallel (~> 1.10) parser (>= 2.3.3.1, < 3.0) @@ -42,14 +45,14 @@ GEM unicode-display_width (~> 1.0, >= 1.0.1) rubocop-rspec (1.15.1) rubocop (>= 0.42.0) - ruby-progressbar (1.10.1) + ruby-progressbar (1.13.0) simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) - simplecov-html (0.12.3) + simplecov-html (0.13.1) simplecov_json_formatter (0.1.4) - unicode-display_width (1.7.0) + unicode-display_width (1.8.0) PLATFORMS ruby diff --git a/ext/pg_query/extconf.rb b/ext/pg_query/extconf.rb index cf7feb51..9739f27c 100644 --- a/ext/pg_query/extconf.rb +++ b/ext/pg_query/extconf.rb @@ -21,12 +21,36 @@ $INCFLAGS = "-I#{File.join(__dir__, 'include', 'postgres', 'port', 'win32_msvc')} " + $INCFLAGS end -SYMFILE = - if RUBY_PLATFORM =~ /freebsd/ - File.join(__dir__, 'pg_query_ruby_freebsd.sym') +def have_ruby_abi_version() + # ruby_abi_version is only available in development versions: https://github.com/ruby/ruby/pull/6231 + return false if RUBY_PATCHLEVEL >= 0 + + m = /(\d+)\.(\d+)/.match(RUBY_VERSION) + if m.nil? + puts "Failed to parse ruby version: #{RUBY_VERSION}. Assuming ruby_abi_version symbol is NOT present." + return false + end + major = m[1].to_i + minor = m[2].to_i + if major >= 3 and minor >= 2 + puts "Ruby version #{RUBY_VERSION} >= 3.2. Assuming ruby_abi_version symbol is present." + return true + end + puts "Ruby version #{RUBY_VERSION} < 3.2. Assuming ruby_abi_version symbol is NOT present." + false +end + +def ext_export_filename() + name = if RUBY_PLATFORM =~ /freebsd/ + 'pg_query_ruby_freebsd' elsif RUBY_PLATFORM !~ /cygwin|mswin|mingw|bccwin|wince|emx/ - File.join(__dir__, 'pg_query_ruby.sym') + 'pg_query_ruby' end + name += '-with-ruby-abi-version' if have_ruby_abi_version() + "#{name}.sym" +end + +SYMFILE = File.join(__dir__, ext_export_filename()) if RUBY_PLATFORM =~ /darwin/ $DLDFLAGS << " -Wl,-exported_symbols_list #{SYMFILE}" unless defined?(::Rubinius) diff --git a/ext/pg_query/pg_query_ruby-with-ruby-abi-version.sym b/ext/pg_query/pg_query_ruby-with-ruby-abi-version.sym new file mode 100644 index 00000000..05fcbdf4 --- /dev/null +++ b/ext/pg_query/pg_query_ruby-with-ruby-abi-version.sym @@ -0,0 +1,2 @@ +_Init_pg_query +_ruby_abi_version diff --git a/ext/pg_query/pg_query_ruby_freebsd-with-ruby-abi-version.sym b/ext/pg_query/pg_query_ruby_freebsd-with-ruby-abi-version.sym new file mode 100644 index 00000000..ba6b96f8 --- /dev/null +++ b/ext/pg_query/pg_query_ruby_freebsd-with-ruby-abi-version.sym @@ -0,0 +1,2 @@ +Init_pg_query +_ruby_abi_version