Trying to build Ruby 3.1.0 preview1 (or the current snapshot), I observe the following issue during installation of bundled RBS:
Building native extensions. This could take a while...
/builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:95:in `run': ERROR: Failed to build gem native extension. (Gem::Ext::BuildError)
current directory: /builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/share/ruby/gems/gems/rbs-1.7.1/ext/rbs_extension
/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/bin/ruby --disable\\=gems -I/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/lib64/ruby -I /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib -r ./siteconf20211201-24852-213cgt.rb extconf.rb
creating Makefile
current directory: /builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/share/ruby/gems/gems/rbs-1.7.1/ext/rbs_extension
make DESTDIR\\= clean
make[1]: Entering directory '/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/share/ruby/gems/gems/rbs-1.7.1/ext/rbs_extension'
rm -f
rm -fr rbs_extension.so false *.o *.bak mkmf.log .*.time
make[1]: Leaving directory '/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/share/ruby/gems/gems/rbs-1.7.1/ext/rbs_extension'
current directory: /builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/share/ruby/gems/gems/rbs-1.7.1/ext/rbs_extension
make DESTDIR\\=
make[1]: Entering directory '/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/share/ruby/gems/gems/rbs-1.7.1/ext/rbs_extension'
make[1]: *** No rule to make target '/include/x86_64-linux/ruby/config.h', needed by 'constants.o'. Stop.
make[1]: Leaving directory '/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/share/ruby/gems/gems/rbs-1.7.1/ext/rbs_extension'
make failed, exit code 2
Gem files will remain installed in /builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/share/ruby/gems/gems/rbs-1.7.1 for inspection.
Results logged to /builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201git0b53a8895f.fc36.x86_64/usr/share/ruby/gems/extensions/x86_64-linux/3.1.0/rbs-1.7.1/gem_make.out
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:44:in `block in make'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:36:in `each'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:36:in `make'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/ext_conf_builder.rb:63:in `block in build'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/tempfile.rb:317:in `open'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/ext_conf_builder.rb:26:in `build'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:161:in `build_extension'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:195:in `block in build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:192:in `each'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:192:in `build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/installer.rb:837:in `build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/installer.rb:318:in `install'
from ./tool/rbinstall.rb:895:in `block in install'
from ./tool/rbinstall.rb:719:in `no_write'
from ./tool/rbinstall.rb:895:in `install'
from ./tool/rbinstall.rb:1062:in `block (2 levels) in <main>'
from ./tool/rbinstall.rb:1037:in `foreach'
from ./tool/rbinstall.rb:1037:in `block in <main>'
from ./tool/rbinstall.rb:1121:in `block in <main>'
from ./tool/rbinstall.rb:1118:in `each'
from ./tool/rbinstall.rb:1118:in `<main>'
/builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:95:in `run': make failed, exit code 2 (Gem::InstallError)
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:44:in `block in make'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:36:in `each'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:36:in `make'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/ext_conf_builder.rb:63:in `block in build'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/tempfile.rb:317:in `open'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/ext_conf_builder.rb:26:in `build'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:161:in `build_extension'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:195:in `block in build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:192:in `each'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/ext/builder.rb:192:in `build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/installer.rb:837:in `build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-0b53a8895f/lib/rubygems/installer.rb:318:in `install'
from ./tool/rbinstall.rb:895:in `block in install'
from ./tool/rbinstall.rb:719:in `no_write'
from ./tool/rbinstall.rb:895:in `install'
from ./tool/rbinstall.rb:1062:in `block (2 levels) in <main>'
from ./tool/rbinstall.rb:1037:in `foreach'
from ./tool/rbinstall.rb:1037:in `block in <main>'
from ./tool/rbinstall.rb:1121:in `block in <main>'
from ./tool/rbinstall.rb:1118:in `each'
from ./tool/rbinstall.rb:1118:in `<main>'
make: *** [uncommon.mk:383: do-install-all] Error 1
error: Bad exit status from /var/tmp/rpm-tmp.cpHVoZ (%install)
Bad exit status from /var/tmp/rpm-tmp.cpHVoZ (%install)
This is probably fault of RubyGems, but also, RBS have not contained binary extension previously, if I am not mistaken. So I am not entirely sure.
BTW there is not Ruby installed on the build system, so this should work with the Ruby being build.
I have downgraded RBS to 1.6.2, but the same issue suffers (not surprisingly) debug:
Building native extensions. This could take a while...
/builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:95:in `run': ERROR: Failed to build gem native extension. (Gem::Ext::BuildError)
current directory: /builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/share/ruby/gems/gems/debug-1.3.4/ext/debug
/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/bin/ruby --disable\\=gems -I/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/lib64/ruby -I /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib -r ./siteconf20211201-24843-jbuqiz.rb extconf.rb
creating Makefile
current directory: /builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/share/ruby/gems/gems/debug-1.3.4/ext/debug
make DESTDIR\\= clean
make[1]: Entering directory '/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/share/ruby/gems/gems/debug-1.3.4/ext/debug'
rm -f
rm -fr debug.so false *.o *.bak mkmf.log .*.time
make[1]: Leaving directory '/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/share/ruby/gems/gems/debug-1.3.4/ext/debug'
current directory: /builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/share/ruby/gems/gems/debug-1.3.4/ext/debug
make DESTDIR\\=
make[1]: Entering directory '/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/share/ruby/gems/gems/debug-1.3.4/ext/debug'
make[1]: *** No rule to make target '/include/x86_64-linux/ruby/config.h', needed by 'debug.o'. Stop.
make[1]: Leaving directory '/builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/share/ruby/gems/gems/debug-1.3.4/ext/debug'
make failed, exit code 2
Gem files will remain installed in /builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/share/ruby/gems/gems/debug-1.3.4 for inspection.
Results logged to /builddir/build/BUILDROOT/ruby-3.1.0-0.1.20211201gita84dc9d80d.fc36.x86_64/usr/share/ruby/gems/extensions/x86_64-linux/3.1.0/debug-1.3.4/gem_make.out
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:44:in `block in make'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:36:in `each'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:36:in `make'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/ext_conf_builder.rb:63:in `block in build'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/tempfile.rb:317:in `open'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/ext_conf_builder.rb:26:in `build'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:161:in `build_extension'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:195:in `block in build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:192:in `each'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:192:in `build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/installer.rb:837:in `build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/installer.rb:318:in `install'
from ./tool/rbinstall.rb:895:in `block in install'
from ./tool/rbinstall.rb:719:in `no_write'
from ./tool/rbinstall.rb:895:in `install'
from ./tool/rbinstall.rb:1062:in `block (2 levels) in <main>'
from ./tool/rbinstall.rb:1037:in `foreach'
from ./tool/rbinstall.rb:1037:in `block in <main>'
from ./tool/rbinstall.rb:1121:in `block in <main>'
from ./tool/rbinstall.rb:1118:in `each'
from ./tool/rbinstall.rb:1118:in `<main>'
/builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:95:in `run': make failed, exit code 2 (Gem::InstallError)
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:44:in `block in make'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:36:in `each'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:36:in `make'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/ext_conf_builder.rb:63:in `block in build'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/tempfile.rb:317:in `open'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/ext_conf_builder.rb:26:in `build'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:161:in `build_extension'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:195:in `block in build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:192:in `each'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/ext/builder.rb:192:in `build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/installer.rb:837:in `build_extensions'
from /builddir/build/BUILD/ruby-3.1.0-a84dc9d80d/lib/rubygems/installer.rb:318:in `install'
from ./tool/rbinstall.rb:895:in `block in install'
from ./tool/rbinstall.rb:719:in `no_write'
from ./tool/rbinstall.rb:895:in `install'
from ./tool/rbinstall.rb:1062:in `block (2 levels) in <main>'
from ./tool/rbinstall.rb:1037:in `foreach'
from ./tool/rbinstall.rb:1037:in `block in <main>'
from ./tool/rbinstall.rb:1121:in `block in <main>'
from ./tool/rbinstall.rb:1118:in `each'
from ./tool/rbinstall.rb:1118:in `<main>'
make: *** [uncommon.mk:383: do-install-all] Error 1
FYI, in my environment ruby-3.1.0-preview1 can be cross-installed without error for aarch64-linux-android target (with build host being x86_64-linux-gnu).
So I guess in your environment `arch_hdrdir` in `Makefile` for gem extension is incorrectly defined as `/include/x86_64-linux`, though I don't know why.
And this must come from here. Obviously, the condition is not met, because we are using --with-rubyhdrdir=/usr/include --with-rubyarchhdrdir=/usr/include configuration options on Fedora:
This is not unreasonable I believe. However, I am not sure what this branch is supposed to do. On top of that, the $(extout) is not set. I think that ideally, we would like to pass the first condition and the configuration options should be prefixed with $(DESTDIR).
The first branch is used for regular cases when Ruby is already installed. The second branch is used for building extensions during build of Ruby.
Unfortunately, installing gems and building their extensions is non of these. So there should be probably created some middle path. Maybe if the mkmf could be convinced that the extension is nothing different to building extensions which are part of Ruby ...
But I think that it might make difference, if there is already installed Ruby on the system, which is not my case.
Subject changed from RBS build failure: '/include/x86_64-linux/ruby/config.h', needed by 'constants.o'. to Bundle gem (RBS, debug) extension are not properly built
So the basic scenarios seem to work as expected (unexpectedly for me, sorry). But this is the failing scenario, where I am using expanded tarball:
$ history
1 cd /builddir/build/BUILD/ruby-3.1.0-74b58dd690/
2 autoconf
3 ./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info
4 make
5 make install DESTDIR=/tmp/local/
6 history
$ ruby -v
sh: ruby: command not found
Please note that these ./configure options are standard Fedora configuration options and they make the difference. With plain ./configure, the example would pass just fine. Also, as @darix pointed out, the plain make install also succeeds. But that is probably not really surprising, because in that case Ruby can already by found on the expected location prior gems are installed.
Note that we can reproduce the issue with --includedir configure option like that: ./configure --includedir=/usr/include && make -j && make install DESTDIR=/tmp/foo also on Ubuntu with git repo. @nobu (Nobuyoshi Nakada) is checking.
This is even more tricky then I initially thought, at least in the RPM context. The issue that RPM assumes there is "build" step, where everything is build and later "install" step, where everything is move into right location. Unfortunately, the way the files are currently installed mixes the two steps together, because the install steps builds the bundled gem binary extensions after the gem is installed. That in turn causes troubles with debug info stripping (which went through unnoticed for a while due to change in grep and therefore bug in RPM itself).
I starting to think that the right approach would be to build the binary extensions along the other Ruby modules and let the installer to only install the files.
Ah, now I found this git|bac6e8ca5d8f6bc45984d12ddad55d3d876d4324, so it used to be the case. I'll try to take a look what would the rbinstall.rb need to install also the binary extensions.
Not sure what $installed_list is good for, but the extensions as build currently are very likely not listed there. Just one another flaw of the current design.
For the backport, please note that with this changes, the .gemspec files for expanded gems in tarball are newly located in .bundle/specifications, but this should be just implementation detail.