Skip to content

Commit ad90910

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 ad90910

File tree

9 files changed

+72
-20
lines changed

9 files changed

+72
-20
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 }} /bin/sh
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-emscripten/Dockerfile

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,33 @@ ARG NODE_MAJOR_VERSION=20
44

55
RUN set -eux; \
66
apt-get update; \
7-
apt-get install ruby ruby-bundler bison make autoconf git curl build-essential libyaml-dev zlib1g-dev gosu -y; \
87
apt-get install -y ca-certificates curl gnupg; \
98
mkdir -p /etc/apt/keyrings; \
109
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg; \
1110
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; \
1211
apt-get update; \
13-
apt-get install nodejs -y; \
12+
apt-get install ruby ruby-dev ruby-bundler nodejs \
13+
bison make autoconf git curl build-essential \
14+
libyaml-dev zlib1g-dev gosu \
15+
libclang-13-dev -y; \
1416
apt-get clean; \
1517
rm -r /var/lib/apt/lists/*
1618

19+
ENV RUSTUP_HOME=/usr/local/rustup \
20+
CARGO_HOME=/usr/local/cargo \
21+
PATH=/usr/local/cargo/bin:$PATH \
22+
RUST_VERSION=1.74
23+
24+
RUN set -eux pipefail; \
25+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \
26+
sh -s -- -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION; \
27+
chmod -R a+w $RUSTUP_HOME $CARGO_HOME
28+
29+
ENV BUNDLE_PATH=/usr/local/gems
30+
RUN set -eux; \
31+
mkdir -p $BUNDLE_PATH; \
32+
chmod -R 777 $BUNDLE_PATH
33+
1734
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
1835
RUN chmod +x /usr/local/bin/entrypoint.sh
1936
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

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"

sig/ruby_wasm/packager.rbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class RubyWasm::Packager
5555
@build: RubyWasm::Build
5656
def derive_build: () -> RubyWasm::Build
5757
@user_exts: Array[RubyWasm::CrossRubyExtProduct]?
58-
def user_exts: () -> Array[RubyWasm::CrossRubyExtProduct]
58+
def user_exts: (RubyWasm::Build) -> Array[RubyWasm::CrossRubyExtProduct]
5959

6060
def name: () -> string
6161
end
@@ -88,4 +88,4 @@ class RubyWasm::Packager
8888
def ruby_version: () -> String
8989
def rubyarchdir: () -> String
9090
end
91-
end
91+
end

0 commit comments

Comments
 (0)