rake-compiler-dock 0.7.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +4 -0
  3. data/.github/workflows/ci.yml +168 -0
  4. data/.gitignore +14 -0
  5. data/Dockerfile.jruby +12 -7
  6. data/Dockerfile.mri.erb +271 -0
  7. data/History.md +63 -0
  8. data/README.md +138 -27
  9. data/Rakefile +71 -4
  10. data/{lib/rake_compiler_dock → build}/gem_helper.rb +0 -15
  11. data/build/parallel_docker_build.rb +106 -0
  12. data/build/patches/{ruby-2.5.3 → ruby-2.5.9}/no_sendfile.patch +1 -1
  13. data/build/patches/ruby-3.1.0/no_sendfile.patch +24 -0
  14. data/build/patches2/rake-compiler-1.1.6/0004-Enable-build-of-static-libruby.patch +28 -0
  15. data/build/rcd-env.sh +6 -0
  16. data/build/runas +1 -6
  17. data/build/sudoers +1 -1
  18. data/lib/rake_compiler_dock/docker_check.rb +12 -6
  19. data/lib/rake_compiler_dock/starter.rb +69 -53
  20. data/lib/rake_compiler_dock/version.rb +2 -2
  21. data/lib/rake_compiler_dock.rb +10 -0
  22. data/mingw64-ucrt/Dockerfile +62 -0
  23. data/mingw64-ucrt/binutils-mingw-w64-ignore-check-errors.patch +13 -0
  24. data/mingw64-ucrt/gcc-mingw-w64-only-c-c++.patch +13 -0
  25. data/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
  26. data/rake-compiler-dock.gemspec +2 -2
  27. data/test/env/Dockerfile.alpine +17 -0
  28. data/test/env/Dockerfile.centos +17 -0
  29. data/test/env/Dockerfile.debian +24 -0
  30. data/test/rcd_test/Gemfile +11 -0
  31. data/test/rcd_test/Rakefile +74 -0
  32. data/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
  33. data/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
  34. data/test/rcd_test/ext/mri/extconf.rb +20 -0
  35. data/test/rcd_test/ext/mri/rcd_test_ext.c +35 -0
  36. data/test/rcd_test/ext/mri/rcd_test_ext.h +6 -0
  37. data/test/rcd_test/lib/rcd_test.rb +6 -0
  38. data/test/rcd_test/rcd_test.gemspec +27 -0
  39. data/test/rcd_test/test/test_basic.rb +22 -0
  40. data/test/test_environment_variables.rb +56 -31
  41. data/test/test_parallel_docker_build.rb +70 -0
  42. data.tar.gz.sig +1 -0
  43. metadata +83 -14
  44. metadata.gz.sig +0 -0
  45. data/Dockerfile.mri +0 -122
  46. data/build/patches/rake-compiler-1.0.7/enable-static.diff +0 -13
@@ -1,5 +1,6 @@
1
1
  require "shellwords"
2
2
  require "etc"
3
+ require "io/console"
3
4
  require "rake_compiler_dock/version"
4
5
 
5
6
  module RakeCompilerDock
@@ -9,15 +10,15 @@ module RakeCompilerDock
9
10
  class Starter
10
11
  class << self
11
12
  def sh(cmd, options={}, &block)
12
- if verbose_flag(options)
13
- $stderr.puts "rake-compiler-dock bash -c #{ cmd.inspect }"
13
+ begin
14
+ exec('bash', '-c', cmd, options, &block)
15
+ ensure
16
+ STDIN.cooked! if STDIN.tty?
14
17
  end
15
- exec('bash', '-c', cmd, options, &block)
16
18
  end
17
19
 
18
20
  def exec(*args)
19
21
  options = (Hash === args.last) ? args.pop : {}
20
- runargs = args.dup
21
22
 
22
23
  mountdir = options.fetch(:mountdir){ ENV['RCD_MOUNTDIR'] || Dir.pwd }
23
24
  workdir = options.fetch(:workdir){ ENV['RCD_WORKDIR'] || Dir.pwd }
@@ -40,49 +41,62 @@ module RakeCompilerDock
40
41
  user = options.fetch(:username){ current_user }
41
42
  group = options.fetch(:groupname){ current_group }
42
43
  rubyvm = options.fetch(:rubyvm){ ENV['RCD_RUBYVM'] } || "mri"
43
- image_name = options.fetch(:image) do
44
- ENV['RCD_IMAGE'] ||
45
- ENV['RAKE_COMPILER_DOCK_IMAGE'] ||
46
- "larskanis/rake-compiler-dock-#{rubyvm}:#{IMAGE_VERSION}"
47
- end
44
+ jrubyvm = rubyvm.to_s == "jruby"
45
+
46
+ platforms = options.fetch(:platform){ ENV['RCD_PLATFORM'] } || (jrubyvm ? "jruby" : "x86-mingw32 x64-mingw32")
47
+ platforms.split(" ").each do |platform|
48
+ image_name = options.fetch(:image) do
49
+ platform_postfix = jrubyvm ? "" : "-#{platform}"
50
+ ENV['RCD_IMAGE'] ||
51
+ ENV['RAKE_COMPILER_DOCK_IMAGE'] ||
52
+ "larskanis/rake-compiler-dock-#{rubyvm}#{platform_postfix}:#{IMAGE_VERSION}"
53
+ end
48
54
 
49
- check_docker(mountdir) if options.fetch(:check_docker){ true }
50
- runargs.unshift("sigfw") if options.fetch(:sigfw){ true }
51
- runargs.unshift("runas") if options.fetch(:runas){ true }
52
- docker_opts = options.fetch(:options) do
53
- opts = ["--rm", "-i"]
54
- opts << "-t" if $stdin.tty?
55
- opts
56
- end
55
+ check = check_docker(mountdir) if options.fetch(:check_docker){ true }
56
+ docker_opts = options.fetch(:options) do
57
+ opts = ["--rm", "-i"]
58
+ opts << "-t" if $stdin.tty?
59
+ opts
60
+ end
57
61
 
58
- cmd = ["docker", "run",
59
- "-v", "#{mountdir}:#{make_valid_path(mountdir)}",
60
- "-e", "UID=#{uid}",
61
- "-e", "GID=#{gid}",
62
- "-e", "USER=#{user}",
63
- "-e", "GROUP=#{group}",
64
- "-e", "ftp_proxy=#{ENV['ftp_proxy']}",
65
- "-e", "http_proxy=#{ENV['http_proxy']}",
66
- "-e", "https_proxy=#{ENV['https_proxy']}",
67
- "-e", "RCD_HOST_RUBY_PLATFORM=#{RUBY_PLATFORM}",
68
- "-e", "RCD_HOST_RUBY_VERSION=#{RUBY_VERSION}",
69
- "-e", "RCD_IMAGE=#{image_name}",
70
- "-w", make_valid_path(workdir),
71
- *docker_opts,
72
- image_name,
73
- *runargs]
74
-
75
- cmdline = Shellwords.join(cmd)
76
- if verbose_flag(options) == true
77
- $stderr.puts cmdline
78
- end
62
+ if verbose_flag(options) && args.size == 3 && args[0] == "bash" && args[1] == "-c"
63
+ $stderr.puts "rake-compiler-dock bash -c #{ args[2].inspect }"
64
+ end
79
65
 
80
- ok = system(*cmd)
81
- if block_given?
82
- yield(ok, $?)
83
- elsif !ok
84
- fail "Command failed with status (#{$?.exitstatus}): " +
85
- "[#{cmdline}]"
66
+ runargs = args.dup
67
+ runargs.unshift("sigfw") if options.fetch(:sigfw){ true }
68
+ runargs.unshift("runas") if options.fetch(:runas){ true }
69
+
70
+ cmd = [check.docker_command, "run",
71
+ "-v", "#{mountdir}:#{make_valid_path(mountdir)}",
72
+ "-e", "UID=#{uid}",
73
+ "-e", "GID=#{gid}",
74
+ "-e", "USER=#{user}",
75
+ "-e", "GROUP=#{group}",
76
+ "-e", "GEM_PRIVATE_KEY_PASSPHRASE",
77
+ "-e", "ftp_proxy",
78
+ "-e", "http_proxy",
79
+ "-e", "https_proxy",
80
+ "-e", "RCD_HOST_RUBY_PLATFORM=#{RUBY_PLATFORM}",
81
+ "-e", "RCD_HOST_RUBY_VERSION=#{RUBY_VERSION}",
82
+ "-e", "RCD_IMAGE=#{image_name}",
83
+ "-w", make_valid_path(workdir),
84
+ *docker_opts,
85
+ image_name,
86
+ *runargs]
87
+
88
+ cmdline = Shellwords.join(cmd)
89
+ if verbose_flag(options) == true
90
+ $stderr.puts cmdline
91
+ end
92
+
93
+ ok = system(*cmd)
94
+ if block_given?
95
+ yield(ok, $?)
96
+ elsif !ok
97
+ fail "Command failed with status (#{$?.exitstatus}): " +
98
+ "[#{cmdline}]"
99
+ end
86
100
  end
87
101
  end
88
102
 
@@ -130,20 +144,22 @@ module RakeCompilerDock
130
144
  name = name.gsub(/[ ]/i, "_")
131
145
  end
132
146
 
147
+ @@docker_checked_lock = Mutex.new
133
148
  @@docker_checked = {}
134
149
 
135
150
  def check_docker(pwd)
136
- return if @@docker_checked[pwd]
137
-
138
- check = DockerCheck.new($stderr, pwd)
139
- unless check.ok?
140
- at_exit do
141
- check.print_help_text
151
+ @@docker_checked_lock.synchronize do
152
+ @@docker_checked[pwd] ||= begin
153
+ check = DockerCheck.new($stderr, pwd)
154
+ unless check.ok?
155
+ at_exit do
156
+ check.print_help_text
157
+ end
158
+ raise DockerIsNotAvailable, "Docker is not available"
159
+ end
160
+ check
142
161
  end
143
- raise DockerIsNotAvailable, "Docker is not available"
144
162
  end
145
-
146
- @@docker_checked[pwd] = check
147
163
  end
148
164
 
149
165
  # Change Path from "C:\Path" to "/c/Path" as used by boot2docker
@@ -1,4 +1,4 @@
1
1
  module RakeCompilerDock
2
- VERSION = "0.7.2"
3
- IMAGE_VERSION = "0.7.2"
2
+ VERSION = "1.2.0"
3
+ IMAGE_VERSION = "1.2.0"
4
4
  end
@@ -21,6 +21,16 @@ module RakeCompilerDock
21
21
  # Option +:verbose+ can be set to enable printing of the command line.
22
22
  # If not set, rake's verbose flag is used.
23
23
  #
24
+ # Option +:rubyvm+ can be set to +:mri+ or +:jruby+ .
25
+ # It selects the docker image with an appropriate toolchain.
26
+ #
27
+ # Option +:platform+ can be set to a list of space separated values.
28
+ # It selects the docker image(s) with an appropriate toolchain.
29
+ # Allowed values are +:x86-mingw32+, +x64-mingw32+, +x86-linux+ or +x86_64-linux+.
30
+ # If the list contains multiple values, +cmd+ is consecutively executed in each of the docker images,
31
+ # Option +:platform+ is ignored when +:rubyvm+ is set to +:jruby+.
32
+ # Default is "x86-mingw32 x64-mingw32" .
33
+ #
24
34
  # Examples:
25
35
  #
26
36
  # RakeCompilerDock.sh 'bundle && rake cross native gem'
@@ -0,0 +1,62 @@
1
+ FROM ubuntu:20.04
2
+
3
+ ARG DEBIAN_FRONTEND=noninteractive
4
+
5
+ RUN set -ex \
6
+ && sed -i -- 's/# deb-src/deb-src/g' /etc/apt/sources.list \
7
+ && apt-get update \
8
+ && apt-get install -y --no-install-recommends \
9
+ build-essential \
10
+ cdbs \
11
+ devscripts \
12
+ equivs \
13
+ fakeroot \
14
+ pkg-config \
15
+ && apt-get clean \
16
+ && rm -rf /tmp/* /var/tmp/*
17
+
18
+ WORKDIR /build
19
+
20
+ # Download mingw sources
21
+ RUN apt-get source mingw-w64-common && \
22
+ cd mingw-w64-* && \
23
+ mk-build-deps -ir -t "apt-get -o Debug::pkgProblemResolver=yes -y --no-install-recommends"
24
+
25
+ # Patch build for UCRT and build UCRT enabled deb-packages
26
+ ADD mingw-w64-*.patch ./
27
+ RUN cd mingw-w64-* && \
28
+ cat debian/rules && \
29
+ ls ../mingw-w64-*.patch | xargs -n1 patch --verbose -p1 -i && \
30
+ dpkg-buildpackage -b && \
31
+ rm -rf ../*.ddeb ../*i686* `pwd`
32
+
33
+ # Install UCRT enabled deb-packages
34
+ RUN dpkg -i mingw-w64-common_7.0.0-2_all.deb \
35
+ mingw-w64-tools_7.0.0-2_amd64.deb \
36
+ mingw-w64-x86-64-dev_7.0.0-2_all.deb
37
+
38
+ # Download gcc-binutils sources for mingw
39
+ RUN apt-get source binutils-mingw-w64 && \
40
+ cd binutils-mingw-w64-* && \
41
+ mk-build-deps -ir -t "apt-get -o Debug::pkgProblemResolver=yes -y --no-install-recommends"
42
+
43
+ # Build gcc-binutils based on UCRT headers and crt
44
+ ADD binutils-mingw-w64-*.patch ./
45
+ RUN cd binutils-mingw-w64-* && \
46
+ ls ../binutils-mingw-w64-*.patch | xargs -n1 patch --verbose -p1 -i && \
47
+ dpkg-buildpackage -b --jobs=auto && \
48
+ rm -rf ../*.ddeb ../*i686* `pwd`
49
+
50
+ # Download gcc sources for mingw
51
+ RUN apt-get source gcc-mingw-w64 && \
52
+ cd gcc-mingw-w64-* && \
53
+ mk-build-deps -ir -t "apt-get -o Debug::pkgProblemResolver=yes -y --no-install-recommends"
54
+
55
+ # Build gcc (only C and C++) based on UCRT headers and crt
56
+ ADD gcc-mingw-w64-*.patch ./
57
+ RUN cd gcc-mingw-w64-* && \
58
+ ls ../gcc-mingw-w64-*.patch | xargs -n1 patch --verbose -p1 -i && \
59
+ dpkg-buildpackage -b --jobs=auto && \
60
+ rm -rf ../*.ddeb ../*i686* `pwd`
61
+
62
+ RUN ls -l *.deb
@@ -0,0 +1,13 @@
1
+ diff --git a/debian/rules b/debian/rules
2
+ index 4401493..62c8fe4 100755
3
+ --- a/debian/rules
4
+ +++ b/debian/rules
5
+ @@ -91,7 +91,7 @@ override_dh_auto_test-arch:
6
+ unset CFLAGS CPPFLAGS LDFLAGS; \
7
+ env > $(build_dir)/env; \
8
+ for target in $(targets); do \
9
+ - dh_auto_test -B$(build_dir)/$$target; \
10
+ + dh_auto_test -B$(build_dir)/$$target || true; \
11
+ done
12
+
13
+ override_dh_auto_install-arch:
@@ -0,0 +1,13 @@
1
+ diff --git a/debian/rules b/debian/rules
2
+ index 9e7e40c..fa9a8a2 100755
3
+ --- a/debian/rules
4
+ +++ b/debian/rules
5
+ @@ -58,7 +58,7 @@ ifneq ($(filter stage1,$(DEB_BUILD_PROFILES)),)
6
+ INSTALL_TARGET := install-gcc
7
+ else
8
+ # Build the full GCC.
9
+ - languages := c,c++,fortran,objc,obj-c++,ada
10
+ + languages := c,c++
11
+ BUILD_TARGET :=
12
+ INSTALL_TARGET := install install-lto-plugin
13
+ endif
@@ -0,0 +1,22 @@
1
+ diff --git a/debian/rules b/debian/rules
2
+ index 9fb970c..5473839 100755
3
+ --- a/debian/rules
4
+ +++ b/debian/rules
5
+ @@ -94,7 +94,7 @@ build-arch-stamp: $(patsubst %,$(host)~$(host)~tools-%-install-stamp,$(HOST_TOOL
6
+ %~headers-configure-stamp: autoreconf-stamp
7
+ mkdir -p $(call buildfolder,$*~headers) && \
8
+ cd $(call buildfolder,$*~headers) && \
9
+ - $(call sourcefolder,$*~headers)/configure --prefix=/usr/$(call ruletarget,$*~headers) --host=$(call rulehost,$*~headers) --enable-sdk=all --enable-secure-api
10
+ + $(call sourcefolder,$*~headers)/configure --prefix=/usr/$(call ruletarget,$*~headers) --host=$(call rulehost,$*~headers) --enable-sdk=all --with-default-msvcrt=ucrt
11
+ touch $*-headers-configure-stamp
12
+
13
+ # Override CRT configuration to avoid multilib builds
14
+ @@ -108,7 +108,7 @@ target64crt := $(target64)~$(target64)~crt
15
+ $(target64crt)-configure-stamp: $(target64)~$(target64)~headers-install-stamp autoreconf-stamp
16
+ mkdir -p $(call buildfolder,$(target64crt)) && \
17
+ cd $(call buildfolder,$(target64crt)) && \
18
+ - $(call sourcefolder,$(target64crt))/configure --prefix=/usr/$(call ruletarget,$(target64crt)) --host=$(call rulehost,$(target64crt)) --target=$(call ruletarget,$(target64crt)) --disable-lib32 --enable-lib64 CPPFLAGS="$(CPPFLAGS) -I$(top_dir)/debian/tmp/usr/$(call ruletarget,$(target64crt))/include"
19
+ + $(call sourcefolder,$(target64crt))/configure --prefix=/usr/$(call ruletarget,$(target64crt)) --host=$(call rulehost,$(target64crt)) --target=$(call ruletarget,$(target64crt)) --disable-lib32 --enable-lib64 --with-default-msvcrt=ucrt CPPFLAGS="$(CPPFLAGS) -I$(top_dir)/debian/tmp/usr/$(call ruletarget,$(target64crt))/include"
20
+ touch $@
21
+
22
+ build-indep-stamp: $(foreach target,$(targets),$(patsubst %,$(target)~$(target)~%-install-stamp,$(TARGET_PROJECTS))) $(patsubst %,$(target32)~$(target32)~%-install-stamp,$(TARGET32_PROJECTS))
@@ -22,7 +22,7 @@ Use rake-compiler-dock to enter an interactive shell session or add a task to yo
22
22
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
23
  spec.require_paths = ["lib"]
24
24
 
25
- spec.add_development_dependency "bundler", "~> 1.7"
26
- spec.add_development_dependency "rake", "~> 12.0"
25
+ spec.add_development_dependency "bundler", ">= 1.7", "< 3.0"
26
+ spec.add_development_dependency "rake", ">= 12"
27
27
  spec.add_development_dependency "test-unit", "~> 3.0"
28
28
  end
@@ -0,0 +1,17 @@
1
+ ARG from_image
2
+ FROM ${from_image}
3
+
4
+ RUN uname -a
5
+ RUN apk add ruby ruby-etc ruby-rake git
6
+
7
+ RUN ruby --version
8
+ RUN gem env
9
+ RUN gem inst bundler
10
+
11
+ WORKDIR /build
12
+
13
+ CMD ruby -e "puts Gem::Platform.local.to_s" && \
14
+ gem install --local *.gem --verbose --no-document && \
15
+ cd test/rcd_test/ && \
16
+ bundle install && \
17
+ rake test
@@ -0,0 +1,17 @@
1
+ ARG from_image
2
+ FROM ${from_image}
3
+
4
+ RUN uname -a
5
+ RUN yum install -y ruby git
6
+
7
+ RUN ruby --version
8
+ RUN gem env
9
+ RUN gem inst bundler
10
+
11
+ WORKDIR /build
12
+
13
+ CMD ruby -e "puts Gem::Platform.local.to_s" && \
14
+ gem install --local *.gem --verbose --no-document && \
15
+ cd test/rcd_test/ && \
16
+ bundle install && \
17
+ rake test
@@ -0,0 +1,24 @@
1
+ ARG from_image
2
+ FROM ${from_image}
3
+
4
+ # To prevent installed tzdata deb package to show interactive dialog.
5
+ ENV DEBIAN_FRONTEND noninteractive
6
+
7
+ RUN uname -a
8
+ RUN apt-get update -qq && \
9
+ apt-get install -yq \
10
+ -o Dpkg::Options::='--force-confnew' \
11
+ ruby \
12
+ git
13
+
14
+ RUN ruby --version
15
+ RUN gem env
16
+ RUN gem inst bundler
17
+
18
+ WORKDIR /build
19
+
20
+ CMD ruby -e "puts Gem::Platform.local.to_s" && \
21
+ gem install --local *.gem --verbose --no-document && \
22
+ cd test/rcd_test/ && \
23
+ bundle install && \
24
+ rake test
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in rcd_test.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+ gem "rake-compiler"
10
+ gem "rake-compiler-dock"
11
+ gem "minitest", "~> 5.0"
@@ -0,0 +1,74 @@
1
+ require "bundler/gem_tasks"
2
+ require "rubygems/package_task"
3
+ require "rake/testtask"
4
+
5
+ rcd_test_spec = Bundler.load_gemspec("rcd_test.gemspec")
6
+
7
+ if RUBY_ENGINE == "jruby"
8
+ require "rake/javaextensiontask"
9
+
10
+ Rake::JavaExtensionTask.new("rcd_test_ext", rcd_test_spec) do |ext|
11
+ ext.ext_dir = 'ext/java'
12
+ ext.lib_dir = 'lib/rcd_test'
13
+ end
14
+ else
15
+ require "rake/extensiontask"
16
+
17
+ exttask = Rake::ExtensionTask.new('rcd_test_ext', rcd_test_spec) do |ext|
18
+ ext.ext_dir = 'ext/mri'
19
+ ext.lib_dir = 'lib/rcd_test'
20
+ ext.cross_compile = true
21
+ ext.cross_platform = %w[x86-mingw32 x64-mingw-ucrt x64-mingw32 x86-linux x86_64-linux aarch64-linux arm-linux x86_64-darwin arm64-darwin]
22
+ end
23
+ end
24
+
25
+ namespace "gem" do
26
+ if exttask
27
+ task 'prepare' do
28
+ require 'rake_compiler_dock'
29
+ require 'io/console'
30
+ sh "bundle package --all"
31
+ sh "mkdir -p tmp/gem"
32
+ sh "cp ~/.gem/gem-*.pem tmp/gem/ || true"
33
+ unless ENV['CI']
34
+ ENV["GEM_PRIVATE_KEY_PASSPHRASE"] = STDIN.getpass("Enter passphrase of gem signature key: ")
35
+ end
36
+ end
37
+
38
+ exttask.cross_platform.each do |plat|
39
+ desc "Build all native binary gems"
40
+ multitask 'native' => plat
41
+
42
+ desc "Build the native gem for #{plat}"
43
+ task plat => 'prepare' do
44
+ # Set mountdir of the directory where .git resides, so that git ls-files in the gemspec works
45
+ RakeCompilerDock.sh <<-EOT, platform: plat, mountdir: Dir.pwd + "/../.."
46
+ (cp tmp/gem/gem-*.pem ~/.gem/ || true) &&
47
+ bundle --local &&
48
+ rake native:#{plat} pkg/#{exttask.gem_spec.full_name}-#{plat}.gem
49
+ EOT
50
+ end
51
+ end
52
+ end
53
+
54
+ desc "Build a jruby gem"
55
+ task "jruby" do
56
+ require 'rake_compiler_dock'
57
+ sh "bundle package --all"
58
+ RakeCompilerDock.sh <<-EOT, rubyvm: "jruby", platform: "jruby", mountdir: Dir.pwd + "/../.."
59
+ bundle --local &&
60
+ bundle exec rake java gem
61
+ EOT
62
+ end
63
+ end
64
+
65
+ Rake::TestTask.new(:test) do |t|
66
+ t.libs << "test"
67
+ t.libs << "lib"
68
+ t.test_files = FileList["test/**/test_*.rb"]
69
+ end
70
+
71
+ task default: [:clobber, :compile, :test]
72
+ task gem: :build
73
+
74
+ CLEAN.add("{ext,lib}/**/*.{o,so}", "pkg", "tmp")
@@ -0,0 +1,19 @@
1
+ package rcd_test;
2
+
3
+ import org.jruby.Ruby;
4
+ import org.jruby.RubyClass;
5
+ import org.jruby.RubyModule;
6
+ import org.jruby.runtime.ObjectAllocator;
7
+ import org.jruby.runtime.builtin.IRubyObject;
8
+ import org.jruby.runtime.load.BasicLibraryService;
9
+
10
+ import java.io.IOException;
11
+
12
+ public class RcdTestExtService implements BasicLibraryService {
13
+ @Override
14
+ public boolean basicLoad(final Ruby ruby) throws IOException {
15
+ RubyModule rb_mRcdTest = ruby.defineModule("RcdTest");
16
+ rb_mRcdTest.defineAnnotatedMethods(RubyRcdTest.class);
17
+ return true;
18
+ }
19
+ }
@@ -0,0 +1,16 @@
1
+ package rcd_test;
2
+
3
+ import org.jruby.Ruby;
4
+ import org.jruby.anno.JRubyMethod;
5
+ import org.jruby.runtime.builtin.IRubyObject;
6
+ import org.jruby.anno.JRubyModule;
7
+ import org.jruby.runtime.ThreadContext;
8
+
9
+ @JRubyModule(name = "RcdTest")
10
+ public class RubyRcdTest {
11
+ @JRubyMethod(name = "do_something", module = true, meta = true)
12
+ public static IRubyObject buildSelfString(ThreadContext context, IRubyObject recv) {
13
+ Ruby runtime = context.getRuntime();
14
+ return runtime.newString("something has been done");
15
+ }
16
+ }
@@ -0,0 +1,20 @@
1
+ if RUBY_ENGINE == "jruby"
2
+ File.open("Makefile", "w") do |mf|
3
+ mf.puts "# Dummy makefile for JRuby"
4
+ mf.puts "all install::\n"
5
+ end
6
+ else
7
+ require "mkmf"
8
+
9
+ include RbConfig
10
+
11
+ puts "-"*70
12
+ puts "CONFIG['arch']: #{CONFIG['arch'].inspect}"
13
+ puts "CONFIG['sitearch']: #{CONFIG['sitearch'].inspect}"
14
+ puts "CONFIG['RUBY_SO_NAME']: #{CONFIG['RUBY_SO_NAME'].inspect}"
15
+ puts "RUBY_PLATFORM: #{RUBY_PLATFORM.inspect}"
16
+ puts "Gem::Platform.local.to_s: #{Gem::Platform.local.to_s.inspect}"
17
+ puts "-"*70
18
+
19
+ create_makefile("rcd_test/rcd_test_ext")
20
+ end
@@ -0,0 +1,35 @@
1
+ #include "rcd_test_ext.h"
2
+
3
+ #ifndef __has_builtin
4
+ #define __has_builtin(x) 0
5
+ #endif
6
+
7
+ VALUE rb_mRcdTest;
8
+
9
+ static VALUE
10
+ rcdt_do_something(VALUE self)
11
+ {
12
+ return rb_str_new_cstr("something has been done");
13
+ }
14
+
15
+ static VALUE
16
+ rcdt_darwin_builtin_available_eh(VALUE self)
17
+ {
18
+ #if __has_builtin(__builtin_available)
19
+ // This version must be higher than MACOSX_DEPLOYMENT_TARGET to prevent clang from optimizing it away
20
+ if (__builtin_available(macOS 10.14, *)) {
21
+ return Qtrue;
22
+ }
23
+ return Qfalse;
24
+ #else
25
+ rb_raise(rb_eRuntimeError, "__builtin_available is not defined");
26
+ #endif
27
+ }
28
+
29
+ void
30
+ Init_rcd_test_ext(void)
31
+ {
32
+ rb_mRcdTest = rb_define_module("RcdTest");
33
+ rb_define_singleton_method(rb_mRcdTest, "do_something", rcdt_do_something, 0);
34
+ rb_define_singleton_method(rb_mRcdTest, "darwin_builtin_available?", rcdt_darwin_builtin_available_eh, 0);
35
+ }
@@ -0,0 +1,6 @@
1
+ #ifndef RCD_TEST_EXT_H
2
+ #define RCD_TEST_EXT_H 1
3
+
4
+ #include "ruby.h"
5
+
6
+ #endif /* RCD_TEST_EXT_H */
@@ -0,0 +1,6 @@
1
+ begin
2
+ RUBY_VERSION =~ /(\d+\.\d+)/
3
+ require "rcd_test/#{$1}/rcd_test_ext"
4
+ rescue LoadError
5
+ require 'rcd_test/rcd_test_ext'
6
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "rcd_test"
5
+ spec.version = "1.0.0"
6
+ spec.authors = ["Lars Kanis"]
7
+ spec.email = ["lars@greiz-reinsdorf.de"]
8
+
9
+ spec.summary = "C extension for testing rake-compiler-dock"
10
+ spec.description = "This gem has no real use other than testing builds of binary gems."
11
+ spec.homepage = "https://github.com/rake-compiler/rake-compiler-dock"
12
+ spec.required_ruby_version = ">= 2.0.0"
13
+ spec.license = "MIT"
14
+
15
+ # Specify which files should be added to the gem when it is released.
16
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
17
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+ spec.extensions = ["ext/mri/extconf.rb"]
24
+
25
+ # Uncomment to register a new dependency of your gem
26
+ # spec.add_dependency "example-gem", "~> 1.0"
27
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "minitest/autorun"
4
+ require "rcd_test"
5
+
6
+ class TestBasic < Minitest::Test
7
+
8
+ def test_do_something
9
+ assert_equal "something has been done", RcdTest.do_something
10
+ end
11
+
12
+ def test_check_darwin_compiler_rt_symbol_resolution
13
+ skip("jruby should not run libc-specific tests") if RUBY_ENGINE == "jruby"
14
+
15
+ if RUBY_PLATFORM.include?("darwin")
16
+ assert(RcdTest.darwin_builtin_available?)
17
+ else
18
+ e = assert_raises(RuntimeError) { RcdTest.darwin_builtin_available? }
19
+ assert_equal("__builtin_available is not defined", e.message)
20
+ end
21
+ end
22
+ end