Skip to content

Commit

Permalink
Build ext library on builder container
Browse files Browse the repository at this point in the history
Since there is no guarantee that the host system and the builder
container use the same Ruby ABI
  • Loading branch information
kateinoigakukun committed Jan 3, 2024
1 parent acf5e12 commit c6f2adc
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 18 deletions.
23 changes: 15 additions & 8 deletions .github/workflows/build.yml
Expand Up @@ -112,17 +112,24 @@ jobs:
load: true
cache-from: type=gha
cache-to: type=gha,mode=max
- uses: ruby/setup-ruby@v1
with:
ruby-version: "3.2"
bundler-cache: true
- run: ./bin/setup
- run: bundle exec rake compile
- name: Setup builder container
run: |
docker run -dit -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)))" \
--name builder \
${{ steps.builder-image.outputs.imageid }} /bin/sh
echo 'docker exec -u me builder "$@"' > ./build-exec
chmod +x ./build-exec
- run: ./build-exec bundle config set --local without check
- run: ./build-exec ./bin/setup
- run: ./build-exec bundle exec rake compile
- name: Pre-release configuration
run: bundle exec rake ${{ matrix.entry.prerelease }}[${{ inputs.prerel_name }}]
run: ./build-exec bundle exec rake ${{ matrix.entry.prerelease }}[${{ inputs.prerel_name }}]
if: ${{ inputs.prerel_name != '' && matrix.entry.prerelease != '' }}
- name: rake ${{ matrix.entry.task }}
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 }}
run: ./build-exec rake --verbose ${{ matrix.entry.task }}
- name: rake ${{ matrix.entry.test }}
run: rake ${{ matrix.entry.test }}
if: ${{ matrix.entry.test != '' }}
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -14,3 +14,5 @@ compile_commands.json
html

build_manifest.json

vendor/bundle
5 changes: 4 additions & 1 deletion Gemfile
Expand Up @@ -8,7 +8,10 @@ group :development do
gem "rake"
gem "rake-compiler"
gem "rb_sys", "~> 0.9.63"
gem "syntax_tree", "~> 3.5"
gem "webrick"
end

group :check do
gem "syntax_tree", "~> 3.5"
gem "steep"
end
5 changes: 4 additions & 1 deletion bin/setup
Expand Up @@ -3,5 +3,8 @@ set -euo pipefail
IFS=$'\n\t'
set -vx

bundle install
root="$(cd "$(dirname "$0")/.." && pwd)"

env BUNDLE_GEMFILE="$root/Gemfile" bundle install
env BUNDLE_GEMFILE="$root/packages/npm-packages/ruby-wasm-wasi/Gemfile" bundle install
npm ci
21 changes: 19 additions & 2 deletions builders/wasm32-unknown-wasi/Dockerfile
Expand Up @@ -5,13 +5,15 @@ ARG NODE_MAJOR_VERSION=20

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

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

ENV RUSTUP_HOME=/usr/local/rustup \
CARGO_HOME=/usr/local/cargo \
PATH=/usr/local/cargo/bin:$PATH \
RUST_VERSION=1.74

RUN set -eux pipefail; \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \
sh -s -- -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION; \
chmod -R a+w $RUSTUP_HOME $CARGO_HOME

ENV BUNDLE_PATH=/usr/local/gems
RUN set -eux; \
mkdir -p $BUNDLE_PATH; \
chmod -R 777 $BUNDLE_PATH

COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
Expand Down
6 changes: 3 additions & 3 deletions lib/ruby_wasm/packager/core.rb
Expand Up @@ -89,7 +89,7 @@ def derive_build
return @build if @build
__skip__ =
build ||= RubyWasm::Build.new(name, **@packager.full_build_options)
build.crossruby.user_exts = user_exts
build.crossruby.user_exts = user_exts(build)
build.crossruby.debugflags = %w[-g]
build.crossruby.wasmoptflags = %w[-O3 -g]
build.crossruby.ldflags = %w[
Expand All @@ -104,7 +104,7 @@ def derive_build
build
end

def user_exts
def user_exts(build)
@user_exts ||=
specs_with_extensions.flat_map do |spec, exts|
exts.map do |ext|
Expand All @@ -113,7 +113,7 @@ def user_exts
ext_relative_path = File.join(spec.full_name, ext_feature)
RubyWasm::CrossRubyExtProduct.new(
ext_srcdir,
@build.toolchain,
build.toolchain,
ext_relative_path: ext_relative_path
)
end
Expand Down
5 changes: 4 additions & 1 deletion packages/npm-packages/ruby-wasm-wasi/tools/pack-ruby-wasm.sh
Expand Up @@ -18,9 +18,12 @@ package_dir="$(cd "$(dirname "$0")/.." && pwd)"
mkdir -p "$dist_dir"

# Cache rubies in the package dir
export RUBY_WASM_ROOT="$package_dir/../../../"
export RUBY_WASM_ROOT="$package_dir/../../.."
export BUNDLE_GEMFILE="$package_dir/Gemfile"
cd "$package_dir"

echo "$0: Entering $package_dir"

rbwasm_options="--ruby-version $ruby_version --target wasm32-unknown-wasi --build-profile full"
bundle exec rbwasm build ${rbwasm_options[@]} --no-stdlib -o "$dist_dir/ruby.wasm"
"$WASMOPT" --strip-debug "$dist_dir/ruby.wasm" -o "$dist_dir/ruby.wasm"
Expand Down
4 changes: 2 additions & 2 deletions sig/ruby_wasm/packager.rbs
Expand Up @@ -55,7 +55,7 @@ class RubyWasm::Packager
@build: RubyWasm::Build
def derive_build: () -> RubyWasm::Build
@user_exts: Array[RubyWasm::CrossRubyExtProduct]?
def user_exts: () -> Array[RubyWasm::CrossRubyExtProduct]
def user_exts: (RubyWasm::Build) -> Array[RubyWasm::CrossRubyExtProduct]

def name: () -> string
end
Expand Down Expand Up @@ -88,4 +88,4 @@ class RubyWasm::Packager
def ruby_version: () -> String
def rubyarchdir: () -> String
end
end
end

0 comments on commit c6f2adc

Please sign in to comment.