Bug #21692
openBasic gems like `date` require a compiler
Description
I'm trying to use Ruby in a high security environment which does not allow a compiler to be installed. This was easy years ago when all of standard library was included with Ruby itself and I could use apt install ruby. But as the standard library has broken off into separate, optional gems it has become impossible to bundle a reasonable pure Ruby application without requiring basic gems like date which require a compiler to install.
Are there any plans to make native extensions optional for gems? With tools like ZJIT it can be better to use pure Ruby for performance; I would like to see Ruby encourage fewer native extensions and/or make them optional.
Updated by mame (Yusuke Endoh) 21 days ago
I think what you want is bundle install --prefer-local. (I wonder why this option is not the default.)
Updated by getajobmike (Mike Perham) 20 days ago
· Edited
- ruby -v changed from 3.4.5 to 3.2.3
mame (Yusuke Endoh) wrote in #note-1:
I think what you want is
bundle install --prefer-local. (I wonder why this option is not the default.)
Unfortunately this does not seem to work for me.
$ gem list | grep date
date (default: 3.3.3)
$ more Gemfile
source "https://rubygems.org"
gem "net-imap"
gem "date", "3.3.3"
$ bundle version
Bundler version 2.5.23 (2024-11-05 commit 35f4611265e)
$ ruby -v
ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux-gnu]
$ bundle install --prefer-local
Fetching gem metadata from https://rubygems.org/...
Resolving dependencies...
Installing date 3.3.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory: /var/lib/gems/3.2.0/gems/date-3.3.3/ext/date
/usr/bin/ruby3.2 -I/usr/lib/ruby/vendor_ruby extconf.rb
checking for rb_category_warn()... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
[...]
/usr/lib/ruby/3.2.0/mkmf.rb:490:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
Updated by mame (Yusuke Endoh) 20 days ago
Ah, it seems this happens on Ubuntu 24.04, without a Gemfile.lock, and when the Gemfile does not list the indirect dependencies.
I found three workarounds.
1. Add a Gemfile.lock
¶
If a proper Gemfile.lock is present, --prefer-local seems to avoid the installation.
$ ls
Gemfile Gemfile.lock
$ cat Gemfile
source "https://rubygems.org"
gem "net-imap"
gem "date", "3.3.3"
$ cat Gemfile.lock
GEM
remote: https://rubygems.org/
specs:
date (3.3.3)
net-imap (0.3.4.1)
date
net-protocol
net-protocol (0.2.1)
timeout
timeout (0.3.1)
PLATFORMS
x86_64-linux-gnu
DEPENDENCIES
date (= 3.3.3)
net-imap
BUNDLED WITH
2.4.20
$ bundle install --prefer-local
Bundle complete! 2 Gemfile dependencies, 5 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
2. List all dependencies in the Gemfile¶
If the Gemfile lists all dependencies, including the indirect ones, --prefer-local also seems to avoid the installation.
$ ls
Gemfile
$ cat Gemfile
source "https://rubygems.org"
gem "timeout"
gem "net-protocol"
gem "net-imap"
gem "date", "3.3.3"
$ bundle install --prefer-local
Resolving dependencies...
Bundle complete! 4 Gemfile dependencies, 5 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
3. Use bundler from a newer Ubuntu release¶
I think this behavior is a bug in the older version of bundler. With Ubuntu 25.10, it works well as expected, as shown below:
$ ls
Gemfile
$ cat Gemfile
source "https://rubygems.org"
gem "net-imap"
gem "date", "3.3.4"
$ bundle install --prefer-local
Fetching gem metadata from https://rubygems.org/...
Resolving dependencies...
Bundle complete! 2 Gemfile dependencies, 5 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
Updated by vo.x (Vit Ondruch) 20 days ago
This might be related to the --prefer-local issue:
https://github.com/ruby/rubygems/issues/8750
I suspect there is some problem with the arches of the gems. But I might be wrong.