Skip to content

Commit 20df3a7

Browse files
Merge pull request #54 from SearchApi/fix-arm64-darwin-release
Fix arm64-darwin release build
2 parents 3103829 + 49f8f69 commit 20df3a7

File tree

3 files changed

+131
-5
lines changed

3 files changed

+131
-5
lines changed

.github/workflows/release.yml

Lines changed: 96 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ jobs:
4040
platform:
4141
- x86_64-linux
4242
- aarch64-linux
43-
- arm64-darwin
4443
steps:
4544
- uses: actions/checkout@v6
4645

@@ -57,8 +56,77 @@ jobs:
5756
path: pkg/*.gem
5857
if-no-files-found: error
5958

59+
# arm64-darwin cannot use rb-sys-dock: BoringSSL cross-compilation fails because
60+
# CMake picks up /usr/bin/ld (ELF) instead of the osxcross Mach-O linker.
61+
# No upstream project (wreq, rnet, boring) cross-compiles BoringSSL for Darwin.
62+
native-darwin:
63+
name: Build native gem (arm64-darwin)
64+
runs-on: macos-latest
65+
steps:
66+
- uses: actions/checkout@v6
67+
68+
- uses: dtolnay/rust-toolchain@stable
69+
70+
- uses: Swatinem/rust-cache@v2
71+
with:
72+
prefix-key: macos-arm64
73+
shared-key: release
74+
75+
# Compile per-Ruby-version binaries (matching rb-sys-dock behavior on Linux).
76+
# BoringSSL is compiled once and cached; only rb-sys/magnus rebuild per version.
77+
- uses: ruby/setup-ruby@v1
78+
with:
79+
ruby-version: "3.3"
80+
bundler-cache: true
81+
82+
- name: Compile for Ruby 3.3
83+
env:
84+
RB_SYS_CARGO_PROFILE: release
85+
run: |
86+
cargo clean -p rb-sys -p magnus -p serde_magnus -p wreq-ruby --release 2>/dev/null || true
87+
bundle exec rake compile
88+
mkdir -p lib/wreq_ruby/3.3
89+
cp lib/wreq_ruby/wreq_ruby.bundle lib/wreq_ruby/3.3/
90+
91+
- uses: ruby/setup-ruby@v1
92+
with:
93+
ruby-version: "3.4"
94+
bundler-cache: true
95+
96+
- name: Compile for Ruby 3.4
97+
env:
98+
RB_SYS_CARGO_PROFILE: release
99+
run: |
100+
cargo clean -p rb-sys -p magnus -p serde_magnus -p wreq-ruby --release
101+
bundle exec rake compile
102+
mkdir -p lib/wreq_ruby/3.4
103+
cp lib/wreq_ruby/wreq_ruby.bundle lib/wreq_ruby/3.4/
104+
105+
- uses: ruby/setup-ruby@v1
106+
with:
107+
ruby-version: "4.0"
108+
bundler-cache: true
109+
110+
- name: Compile for Ruby 4.0
111+
env:
112+
RB_SYS_CARGO_PROFILE: release
113+
run: |
114+
cargo clean -p rb-sys -p magnus -p serde_magnus -p wreq-ruby --release
115+
bundle exec rake compile
116+
mkdir -p lib/wreq_ruby/4.0
117+
cp lib/wreq_ruby/wreq_ruby.bundle lib/wreq_ruby/4.0/
118+
119+
- name: Build platform gem
120+
run: ruby script/build_platform_gem.rb arm64-darwin
121+
122+
- uses: actions/upload-artifact@v4
123+
with:
124+
name: native-gem-arm64-darwin
125+
path: pkg/*arm64-darwin*.gem
126+
if-no-files-found: error
127+
60128
smoke-test:
61-
name: Smoke test (Ruby ${{ matrix.ruby }})
129+
name: Smoke test Linux (Ruby ${{ matrix.ruby }})
62130
needs: [cross-compile]
63131
runs-on: ubuntu-latest
64132
strategy:
@@ -81,9 +149,33 @@ jobs:
81149
- name: Verify gem loads and prints version
82150
run: ruby -rwreq -e "puts Wreq::VERSION"
83151

152+
smoke-test-darwin:
153+
name: Smoke test macOS (Ruby ${{ matrix.ruby }})
154+
needs: [native-darwin]
155+
runs-on: macos-latest
156+
strategy:
157+
fail-fast: false
158+
matrix:
159+
ruby: ["3.3", "3.4", "4.0"]
160+
steps:
161+
- uses: ruby/setup-ruby@v1
162+
with:
163+
ruby-version: ${{ matrix.ruby }}
164+
165+
- uses: actions/download-artifact@v4
166+
with:
167+
name: native-gem-arm64-darwin
168+
path: pkg/
169+
170+
- name: Install native gem
171+
run: gem install pkg/wreq-*-arm64-darwin.gem
172+
173+
- name: Verify gem loads and prints version
174+
run: ruby -rwreq -e "puts Wreq::VERSION"
175+
84176
release:
85177
name: Release
86-
needs: [source-gem, cross-compile, smoke-test]
178+
needs: [source-gem, cross-compile, native-darwin, smoke-test, smoke-test-darwin]
87179
runs-on: ubuntu-latest
88180
if: startsWith(github.ref, 'refs/tags/v')
89181
permissions:
@@ -102,7 +194,7 @@ jobs:
102194
- uses: actions/download-artifact@v4
103195
with:
104196
path: pkg/
105-
pattern: "{cross-gem-*,source-gem}"
197+
pattern: "{cross-gem-*,native-gem-*,source-gem}"
106198
merge-multiple: true
107199

108200
- name: List gems

Rakefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ RbSys::ExtensionTask.new(CRATE_PACKAGE_NAME, GEMSPEC) do |ext|
1818
ext.ext_dir = "."
1919
ext.lib_dir = "lib/wreq_ruby"
2020
ext.cross_compile = true
21+
# arm64-darwin is built natively on macOS (see .github/workflows/release.yml)
2122
ext.cross_platform = %w[
2223
x86_64-linux
2324
aarch64-linux
24-
arm64-darwin
2525
]
2626

2727
# Override Ruby version for native gems (keep in sync with wreq.gemspec)

script/build_platform_gem.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/usr/bin/env ruby
2+
# frozen_string_literal: true
3+
4+
# Build a platform-specific gem with pre-compiled native extensions.
5+
#
6+
# Usage: ruby script/build_platform_gem.rb PLATFORM
7+
# Example: ruby script/build_platform_gem.rb arm64-darwin
8+
#
9+
# Expects compiled .bundle/.so files in version-specific directories:
10+
# lib/wreq_ruby/3.3/wreq_ruby.bundle
11+
# lib/wreq_ruby/3.4/wreq_ruby.bundle
12+
# lib/wreq_ruby/4.0/wreq_ruby.bundle
13+
14+
require "rubygems/package"
15+
require "fileutils"
16+
17+
platform = ARGV.fetch(0) { abort "Usage: #{$0} PLATFORM" }
18+
19+
spec = Gem::Specification.load("wreq.gemspec")
20+
spec.platform = Gem::Platform.new(platform)
21+
spec.extensions = []
22+
# Keep in sync with Rakefile cross_compiling block
23+
spec.required_ruby_version = Gem::Requirement.new(">= 3.3", "< 4.1.dev")
24+
25+
# Add version-specific compiled extensions
26+
binaries = Dir.glob("lib/wreq_ruby/[0-9]*/*.{bundle,so}")
27+
abort "No compiled binaries found in lib/wreq_ruby/*/. Did compilation succeed?" if binaries.empty?
28+
spec.files += binaries
29+
30+
FileUtils.mkdir_p("pkg")
31+
gem_file = Gem::Package.build(spec)
32+
FileUtils.mv(gem_file, "pkg/")
33+
34+
puts "Built: pkg/#{File.basename(gem_file)}"

0 commit comments

Comments
 (0)