Project

General

Profile

Actions

Bug #19403

closed

Unable to Build Native Gems on Mac with Ruby 3.1.0+

Added by jcouball@yahoo.com (James Couball) about 1 year ago. Updated about 1 year ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:112187]

Description

Unable to Build Native Gems on Mac with Ruby 3.1.0+

Problem

In Ruby 3.1 and later installed by rvm or asdf on a Mac, require 'mkmf' aborts
the script and reports the following error (the reported path is different depending
on the Ruby install manager and the version of Ruby):

mkmf.rb can't find header files for ruby at /Users/couballj/.asdf/installs/ruby/3.2.0/lib/ruby/include/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.

and RbConfig::CONFIG["rubyhdrdir"] is set to an incorrect path:

"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Users/couballj/.asdf/installs/ruby/3.2.0/include/ruby-3.2.0"

Expected Behavior

Running require 'mkmf' should not abort and for my system/user using asdf installed
Ruby 3.2.0 RbConfig::CONFIG["rubyhdrdir"] should be set to:

"/Users/couballj/.asdf/installs/ruby/3.2.0/include/ruby-3.2.0"

Details

In Ruby 3.1 and later I can no longer build native gems (like nokoguru or redcarpet)
on my Mac.

I have tried this by installing Ruby with both rvm and asdf, both which have
the same results.

I receive the following error when trying to install (and build) these gems. For
example, here is the error message when I try to run gem install redcarpet:

mkmf.rb can't find header files for ruby at /Users/couballj/.asdf/installs/ruby/3.2.0/lib/ruby/include/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.

I found that this error could be triggered just by running a Ruby script that requires
mkmf. If test.rb contains this:

require 'mkmf'

Running this script:

ruby test.rb

Results in this output:

mkmf.rb can't find header files for ruby at /Users/couballj/.asdf/installs/ruby/3.2.0/lib/ruby/include/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.

Curiously, the reported directory does not exist. On my system, the path to ruby.h
is /Users/couballj/.asdf/installs/ruby/3.2.0/include/ruby-3.2.0/ruby.h

I found where in the Ruby code this error is reported in mkmf.rb line 233.

This code is trying to find ruby.h based on the value of RbConfig::CONFIG["rubyhdrdir"].
On my system, this value is:

"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Users/couballj/.asdf/installs/ruby/3.2.0/include/ruby-3.2.0"

This value is a concatenation of ENV['SDKROOT'] (which on my system is /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk)
and the correct include directory path /Users/couballj/.asdf/installs/ruby/3.2.0/include/ruby-3.2.0.

When I run the same code with Ruby 2.7.7, RbConfig::CONFIG["rubyhdrdir"] is set to the correct path:

"/Users/couballj/.asdf/installs/ruby/3.2.0/include/ruby-3.2.0"

Possible Cause

I have found a possible cause in commit fd97862
in line 127 of mkconfig.rb. This change prepends ENV['SDKROOT'] to the include directory that
is used to build RbConfig::CONFIG["rubyhdrdir"].

While there may have been good reason for that change, in my case this change causes
require 'mkmf' to fail in my use case.

Work Around

I have been able to work around this issue by creating a symbolic link from
/Users /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Users to /Users
with the following command:

sudo ln -s /Users /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Users

This change will works for both rvm and asdf no matter what version of Ruby is
installed.

Actions

Also available in: Atom PDF

Like1
Like0Like0Like0Like0Like0Like0Like0Like0Like0