Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 45 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,10 @@ jobs:
- x86-mingw32
- x64-mingw-ucrt
- x64-mingw32
- x86-linux
- x86_64-linux
- x86-linux-gnu
- x86_64-linux-gnu
- x86-linux-musl
- x86_64-linux-musl

runs-on: ubuntu-latest
env:
Expand Down Expand Up @@ -74,10 +76,10 @@ jobs:
platform: x64-mingw-ucrt
- os: ubuntu
ruby: "2.5"
platform: x86_64-linux
platform: x86_64-linux-gnu
- os: ubuntu
ruby: "3.3"
platform: x86_64-linux
platform: x86_64-linux-gnu

runs-on: ${{ matrix.os }}-latest
steps:
Expand All @@ -90,6 +92,11 @@ jobs:
uses: actions/download-artifact@v4
with:
name: gem-${{ matrix.platform }}
- name: Update rubygems - ruby-2.5
if: matrix.ruby == '2.5'
run: |
gem install --no-doc rubygems-update -v 3.3.27
update_rubygems
- name: Install gem-${{matrix.platform}}
run: gem install *.gem --verbose
- name: bundle install
Expand All @@ -102,6 +109,40 @@ jobs:
run: |
bundle exec rake ci


job_binary_multiarch:
name: multiarch (${{matrix.platform}} on ${{matrix.from_image}} ${{matrix.image_platform}})
needs: docker_build
strategy:
fail-fast: false
matrix:
include:
- from_image: centos
image_platform: linux/x86_64
gem_platform: x86_64-linux-gnu
dockerfile: centos
- from_image: alpine
image_platform: linux/386
gem_platform: x86-linux-musl
dockerfile: alpine
- from_image: alpine
image_platform: linux/x86_64
gem_platform: x86_64-linux-musl
dockerfile: alpine

runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download gem-${{matrix.gem_platform}}
uses: actions/download-artifact@v4
with:
name: gem-${{ matrix.gem_platform }}
- name: Build image and Run tests
run: |
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker build --rm --platform ${{matrix.image_platform}} --build-arg from_image=${{matrix.from_image}} -t ruby-test -f test/env/Dockerfile.${{matrix.dockerfile}} .
docker run --rm -t --network=host -v `pwd`:/build ruby-test

# These jobs use Buildx layer caching
source_gem:
name: Source gem
Expand Down
8 changes: 5 additions & 3 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@ source "http://rubygems.org"
# Specify your gem's dependencies in libusb.gemspec
gemspec

group :test do
group :eventmachine do
gem 'eventmachine'
end
group :test do
gem 'minitest'
end

gem 'rake-compiler-dock', '~> 1.1'
gem 'rake-compiler-dock', '~> 1.5-rc1'
gem 'rake-compiler', '~> 1.0'
gem 'bundler', '>= 1', '< 3'
gem 'yard', '~> 0.6', '>= 0.9.36'

# For some reason this is required in addition to the gemspec
# when 'bundle config force_ruby_platform true' is active:
gem 'ffi'
gem 'ffi', '~> 1.17.0.rc1'
gem 'mini_portile2'
9 changes: 6 additions & 3 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,10 @@ CrossLibraries = [
['x86-mingw32', 'i686-w64-mingw32', 'bin/libusb-1.0.dll'],
['x64-mingw32', 'x86_64-w64-mingw32', 'bin/libusb-1.0.dll'],
['x64-mingw-ucrt', 'x86_64-w64-mingw32', 'bin/libusb-1.0.dll'],
['x86-linux', 'i686-linux-gnu', 'lib/libusb-1.0.so'],
['x86_64-linux', 'x86_64-linux-gnu', 'lib/libusb-1.0.so'],
['x86-linux-gnu', 'i686-linux-gnu', 'lib/libusb-1.0.so'],
['x86_64-linux-gnu', 'x86_64-linux-gnu', 'lib/libusb-1.0.so'],
['x86-linux-musl', 'i686-linux-gnu', 'lib/libusb-1.0.so'],
['x86_64-linux-musl', 'x86_64-linux-gnu', 'lib/libusb-1.0.so'],
].map do |ruby_platform, host_platform, libusb_dll|
LIBUSB::CrossLibrary.new ruby_platform, host_platform, libusb_dll
end
Expand All @@ -70,7 +72,8 @@ CrossLibraries.map(&:ruby_platform).each do |platform|
sh "bundle package"
RakeCompilerDock.sh <<-EOT, platform: platform
bundle --local &&
#{ "sudo yum install -y libudev-devel &&" if platform=~/linux/ }
#{ "sudo yum install -y libudev-devel &&" if platform=~/linux-gnu/ }
#{ "sudo apt-get update && sudo apt-get install -y libudev-dev &&" if platform=~/linux-musl/ }
bundle exec rake --trace cross:#{platform} gem "MAKE=make V=1 -j`nproc`" || cat tmp/*/ports/libusb/*/*.log
EOT
end
Expand Down
4 changes: 2 additions & 2 deletions libusb.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Gem::Specification.new do |s|
s.extensions = ['ext/extconf.rb']
s.metadata["yard.run"] = "yri"

s.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
s.add_runtime_dependency 'ffi', '~> 1.0'
s.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
s.add_runtime_dependency 'ffi', '~> 1.0.dev'
s.add_runtime_dependency 'mini_portile2', LIBUSB::MINI_PORTILE_VERSION
end
20 changes: 20 additions & 0 deletions test/env/Dockerfile.alpine
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
ARG from_image
FROM ${from_image}

RUN uname -a
RUN apk add ruby ruby-etc ruby-rake git gcc make musl-dev gcompat

RUN ruby --version
RUN ruby -e 'puts File.read("/proc/#{Process.pid}/maps")'
RUN gem env
RUN gem inst bundler --conservative

WORKDIR /build

CMD ruby -v && \
ruby -e "puts Gem::Platform.local.to_s" && \
gem install ffi --pre --no-document && \
gem install --local *.gem --verbose --no-document && \
bundle config set --local without 'eventmachine' && \
bundle install && \
ruby -rlibusb -S rake test
28 changes: 28 additions & 0 deletions test/env/Dockerfile.centos
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
ARG from_image
FROM ${from_image}

RUN uname -a

# Change download address of Centos-8 which is EOL
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

RUN yum install -y ruby git gcc make

RUN ruby --version
RUN gem env

RUN gem install rubygems-update:3.3.26 --no-doc && \
update_rubygems
# centos-8 comes with Ruby 2.5, and this is the last version of bundler that supports it
RUN gem install bundler -v2.2.28

WORKDIR /build

CMD ruby -v && \
ruby -e "puts Gem::Platform.local.to_s" && \
gem install ffi --pre --no-document && \
gem install --local *.gem --verbose --no-document && \
bundle config set --local without 'eventmachine' && \
bundle install && \
ruby -rlibusb -S rake test