Skip to content

Commit 2bae78b

Browse files
Build ext library on builder container
Since there is no guarantee that the host system and the builder container use the same Ruby ABI
1 parent acf5e12 commit 2bae78b

File tree

7 files changed

+51
-16
lines changed

7 files changed

+51
-16
lines changed

.github/workflows/build.yml

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,17 +112,24 @@ jobs:
112112
load: true
113113
cache-from: type=gha
114114
cache-to: type=gha,mode=max
115-
- uses: ruby/setup-ruby@v1
116-
with:
117-
ruby-version: "3.2"
118-
bundler-cache: true
119-
- run: ./bin/setup
120-
- run: bundle exec rake compile
115+
- name: Setup builder container
116+
run: |
117+
docker run -dit -v "$GITHUB_WORKSPACE:/home/me/build" -w /home/me/build \
118+
-e "ENABLE_GITHUB_ACTIONS_MARKUP=true" \
119+
-e "RUBYWASM_UID=$(id -u)" -e "RUBYWASM_GID=$(id -g)" \
120+
-e "GNUMAKEFLAGS=-j$((1 + $(nproc --all)))" \
121+
--name builder \
122+
${{ steps.builder-image.outputs.imageid }}
123+
echo 'docker exec -u me builder "$@"' > ./build-exec
124+
chmod +x ./build-exec
125+
- run: ./build-exec bundle config set --local without check
126+
- run: ./build-exec ./bin/setup
127+
- run: ./build-exec bundle exec rake compile
121128
- name: Pre-release configuration
122-
run: bundle exec rake ${{ matrix.entry.prerelease }}[${{ inputs.prerel_name }}]
129+
run: ./build-exec bundle exec rake ${{ matrix.entry.prerelease }}[${{ inputs.prerel_name }}]
123130
if: ${{ inputs.prerel_name != '' && matrix.entry.prerelease != '' }}
124131
- name: rake ${{ matrix.entry.task }}
125-
run: docker run -v "$GITHUB_WORKSPACE:/home/me/build" -w /home/me/build -e "ENABLE_GITHUB_ACTIONS_MARKUP=true" -e "RUBYWASM_UID=$(id -u)" -e "RUBYWASM_GID=$(id -g)" -e "GNUMAKEFLAGS=-j$((1 + $(nproc --all)))" ${{ steps.builder-image.outputs.imageid }} rake --verbose ${{ matrix.entry.task }}
132+
run: ./build-exec rake --verbose ${{ matrix.entry.task }}
126133
- name: rake ${{ matrix.entry.test }}
127134
run: rake ${{ matrix.entry.test }}
128135
if: ${{ matrix.entry.test != '' }}

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,5 @@ compile_commands.json
1414
html
1515

1616
build_manifest.json
17+
18+
vendor/bundle

Gemfile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ group :development do
88
gem "rake"
99
gem "rake-compiler"
1010
gem "rb_sys", "~> 0.9.63"
11-
gem "syntax_tree", "~> 3.5"
1211
gem "webrick"
12+
end
13+
14+
group :check do
15+
gem "syntax_tree", "~> 3.5"
1316
gem "steep"
1417
end

bin/setup

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@ set -euo pipefail
33
IFS=$'\n\t'
44
set -vx
55

6-
bundle install
6+
root="$(cd "$(dirname "$0")/.." && pwd)"
7+
8+
env BUNDLE_GEMFILE="$root/Gemfile" bundle install
9+
env BUNDLE_GEMFILE="$root/packages/npm-packages/ruby-wasm-wasi/Gemfile" bundle install
710
npm ci

builders/wasm32-unknown-wasi/Dockerfile

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ ARG NODE_MAJOR_VERSION=20
55

66
RUN set -eux; \
77
apt-get update; \
8-
apt-get install ruby ruby-bundler bison make autoconf git curl build-essential libyaml-dev zlib1g-dev gosu -y; \
98
apt-get install -y ca-certificates curl gnupg; \
109
mkdir -p /etc/apt/keyrings; \
1110
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg; \
1211
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR_VERSION.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list; \
1312
apt-get update; \
14-
apt-get install nodejs -y; \
13+
apt-get install ruby ruby-dev ruby-bundler nodejs \
14+
bison make autoconf git curl build-essential \
15+
libyaml-dev zlib1g-dev gosu \
16+
libclang-13-dev -y; \
1517
apt-get clean; \
1618
rm -r /var/lib/apt/lists/*
1719

@@ -21,6 +23,21 @@ RUN set -eux pipefail; \
2123
unzip wasi-preset-args-x86_64-unknown-linux-gnu.zip; \
2224
mv wasi-preset-args /usr/local/bin/wasi-preset-args
2325

26+
ENV RUSTUP_HOME=/usr/local/rustup \
27+
CARGO_HOME=/usr/local/cargo \
28+
PATH=/usr/local/cargo/bin:$PATH \
29+
RUST_VERSION=1.74
30+
31+
RUN set -eux pipefail; \
32+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \
33+
sh -s -- -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION; \
34+
chmod -R a+w $RUSTUP_HOME $CARGO_HOME
35+
36+
ENV BUNDLE_PATH=/usr/local/gems
37+
RUN set -eux; \
38+
mkdir -p $BUNDLE_PATH; \
39+
chmod -R 777 $BUNDLE_PATH
40+
2441
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
2542
RUN chmod +x /usr/local/bin/entrypoint.sh
2643
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

lib/ruby_wasm/packager/core.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def derive_build
8989
return @build if @build
9090
__skip__ =
9191
build ||= RubyWasm::Build.new(name, **@packager.full_build_options)
92-
build.crossruby.user_exts = user_exts
92+
build.crossruby.user_exts = user_exts(build)
9393
build.crossruby.debugflags = %w[-g]
9494
build.crossruby.wasmoptflags = %w[-O3 -g]
9595
build.crossruby.ldflags = %w[
@@ -104,7 +104,7 @@ def derive_build
104104
build
105105
end
106106

107-
def user_exts
107+
def user_exts(build)
108108
@user_exts ||=
109109
specs_with_extensions.flat_map do |spec, exts|
110110
exts.map do |ext|
@@ -113,7 +113,7 @@ def user_exts
113113
ext_relative_path = File.join(spec.full_name, ext_feature)
114114
RubyWasm::CrossRubyExtProduct.new(
115115
ext_srcdir,
116-
@build.toolchain,
116+
build.toolchain,
117117
ext_relative_path: ext_relative_path
118118
)
119119
end

packages/npm-packages/ruby-wasm-wasi/tools/pack-ruby-wasm.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@ package_dir="$(cd "$(dirname "$0")/.." && pwd)"
1818
mkdir -p "$dist_dir"
1919

2020
# Cache rubies in the package dir
21-
export RUBY_WASM_ROOT="$package_dir/../../../"
21+
export RUBY_WASM_ROOT="$package_dir/../../.."
22+
export BUNDLE_GEMFILE="$package_dir/Gemfile"
2223
cd "$package_dir"
2324

25+
echo "$0: Entering $package_dir"
26+
2427
rbwasm_options="--ruby-version $ruby_version --target wasm32-unknown-wasi --build-profile full"
2528
bundle exec rbwasm build ${rbwasm_options[@]} --no-stdlib -o "$dist_dir/ruby.wasm"
2629
"$WASMOPT" --strip-debug "$dist_dir/ruby.wasm" -o "$dist_dir/ruby.wasm"

0 commit comments

Comments
 (0)