概要
Rubyチュートリアルの1.2.1, 1.2.2を読んで、ローカルにRailsの環境を構築しようとしたらsassc-rails
の導入でエラーが起きハマってしまった。その時の状況、および解決した方法を記載する。
環境
私の開発環境下記の通りである。
- PC: MacBook Pro
- プロセッサ:Intel Core i5
- OS:macOS Sequoia version 15.4
エラー内容
sassc-rails2.1.2
で使用されているsassc 2.4.0
のコンパイルがうまくいかなくてエラーが出ている。
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory: /Users/ユーザ名/.rbenv/versions/3.2.8/lib/ruby/gems/3.2.0/gems/sassc-2.4.0/ext
/Users/ユーザ名/.rbenv/versions/3.2.8/bin/ruby extconf.rb
creating Makefile
current directory: /Users/ユーザ名/.rbenv/versions/3.2.8/lib/ruby/gems/3.2.0/gems/sassc-2.4.0/ext
make DESTDIR\= sitearchdir\=./.gem.20250405-40148-xf17vs sitelibdir\=./.gem.20250405-40148-xf17vs clean
current directory: /Users/ユーザ名/.rbenv/versions/3.2.8/lib/ruby/gems/3.2.0/gems/sassc-2.4.0/ext
make DESTDIR\= sitearchdir\=./.gem.20250405-40148-xf17vs sitelibdir\=./.gem.20250405-40148-xf17vs
compiling ./libsass/src/ast.cpp
make: *** [ast.o] Error 1
make failed, exit code 2
...省略...
An error occurred while installing sassc (2.4.0), and Bundler cannot continue.
原因
C++のコンパイラがうまく指定できていないから
rbconfig.rbで指定されているC++のコンパイラがfalseになっていてうまく読み込めていないのが原因だった。
エラーについて調べたところ、同じエラーでつまづいている人のissuesに辿り着いた。
/ruby
にあるrbconfig.rb
というファイルでCとC++のコンパイラを設定している場所がある。
そこでCONFIG["CXX"] = "false"
となっているからMakefileでコンパイラがないということで実行できなかったとのこと。1
なるほどなぁと思いつつ実際に見にいってみる。
パス:.rbenv/versions/3.3.2/lib/ruby/3.3.0/x86_64-darwin23/rbconfig.rb
するとなんとCONFIG["CXX"] = "false"
になっていた。
だからscsscでC++のコンパイルがうまくできていなかったのである。
どこでCONFIG["CXX"] = "false"
になっているのか
configure.acで行っているコンパイラのチェックが失敗してCONFIG["CXX"] = "false"
になっている。2
Autoconfはパッケージの構成スクリプトを作成するビルドツールである。3
この中で
[test -n "${CXX}"], [
RUBY_WERROR_FLAG([
AC_MSG_CHECKING([whether CXXFLAGS is valid])
AC_LANG_PUSH(C++)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <cstdio>]], [[]])],
[AC_MSG_RESULT(yes)],[
AC_MSG_RESULT(no)
# The message mentions CXXFLAGS, but CPPFLAGS might also affects.
AC_MSG_WARN([something wrong with CXXFLAGS="$CXXFLAGS"])
CXX=false
])
AC_LANG_POP(C++)
])
])
というコードがある。
何しているのか簡単に説明すると
-
@include <cstdio>
という単純なプログラムを用意する - 用意したプログラムをコンパイルする
a. 成功の場合:yesを返すだけ
b. 失敗の場合:noを返しCXXにfalseを代入
つまりrubyのビルド時、ローカル環境でなんでかわからんけどコンパイルが失敗して、CONFIG["CXX"] = "false"
になった可能性が高い。
対処法
C, C++のコンパイラを直接指定してRubyを再インストールする
指定したバージョンのrubyをrbenvで一旦アンインストールして、コンパイラ指定して再度インストールする。
個人的にはこれが手っ取り早いと思う。
# 変にキャッシュが残っているかもしれないのでアンインストール
rbenv uninstall 3.2.8
# C, C++のコンパイラを直接指定して3.2.8をインストール
CC="clang" CXX="clang++" rbenv install 3.2.8
直接rbconfig.rbをいじってもいいと思うがrbconfig.rb
まで辿るのがめんどくさい。
あと変なキャッシュが残っていたりしてbundle install
が動かないってことがたまにある。
なので一旦Ruby自体をリセットして再度インストールするのが吉だと思う。
まとめ
今回sasscのエラーについてまとめた。
Macでsasscのエラーが起きた場合、C++のコンパイルがうまくいっていない可能性がある。
この解決策としてコンパイラを直接指定してあげる方法を紹介した。
なお、調べながらバグを紐解いていったので、間違っている解釈もあるかもしれない。
もしここ違うでってところがあったら、コメントで教えていただきたい。
(自分も勉強になるので...)
最後にこの記事を読んでいただきありがとうございました。
また共有できそうなネタがあれば記事を書こうと思います。
-
"Install fails on macOS 15", URL: https://github.com/sass/sassc-rails/issues/182#issuecomment-2389715505 ↩
-
"RbConfig::CONFIG['CXX'] quietly set to "false" when Ruby cannot build C++ programs", URL: https://bugs.ruby-lang.org/issues/21111 ↩
-
"Autoconfの紹介", URL: https://www.gnu.org/software/autoconf/ ↩