[Railsチュートリアル] Rails環境構築でsasscのエラーにハマった時の解決法

## 概要
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`のコンパイルがうまくいかなくてエラーが出ている。

```bash
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に辿り着いた。

https://github.com/sass/sassc-rails/issues/182#issuecomment-2389715505

`/ruby`にある`rbconfig.rb`というファイルでCとC++のコンパイラを設定している場所がある。
そこで`CONFIG["CXX"] = "false"`となっているからMakefileでコンパイラがないということで実行できなかったとのこと。[^issuesScssc]

[^issuesScssc]: "Install fails on macOS 15", URL: https://github.com/sass/sassc-rails/issues/182#issuecomment-2389715505

なるほどなぁと思いつつ実際に見にいってみる。
パス：`.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"`になっている。[^rubyTickets]

[^rubyTickets]: "RbConfig::CONFIG['CXX'] quietly set to "false" when Ruby cannot build C++ programs", URL: https://bugs.ruby-lang.org/issues/21111

https://github.com/ruby/ruby/blob/7317f96727725ca37ddb06011918deb841de371c/configure.ac#L1333-L1343

Autoconfはパッケージの構成スクリプトを作成するビルドツールである。[^Autoconf]

[^Autoconf]: "Autoconfの紹介", URL: https://www.gnu.org/software/autoconf/

この中で

```m4
[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++)
    ])
])
```

というコードがある。
何しているのか簡単に説明すると
1. `@include <cstdio>`という単純なプログラムを用意する
1. 用意したプログラムをコンパイルする
    a. 成功の場合：yesを返すだけ
    b. 失敗の場合：noを返しCXXにfalseを代入

つまりrubyのビルド時、ローカル環境でなんでかわからんけどコンパイルが失敗して、`CONFIG["CXX"] = "false"`になった可能性が高い。

## 対処法
### C, C++のコンパイラを直接指定してRubyを再インストールする
指定したバージョンのrubyをrbenvで一旦アンインストールして、コンパイラ指定して再度インストールする。
個人的にはこれが手っ取り早いと思う。
```bash
# 変にキャッシュが残っているかもしれないのでアンインストール
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++のコンパイルがうまくいっていない可能性がある。
この解決策としてコンパイラを直接指定してあげる方法を紹介した。

なお、調べながらバグを紐解いていったので、間違っている解釈もあるかもしれない。
もしここ違うでってところがあったら、コメントで教えていただきたい。
(自分も勉強になるので...)

最後にこの記事を読んでいただきありがとうございました。
また共有できそうなネタがあれば記事を書こうと思います。