Linuxbrew on CentOS 6 で system の gcc を使用する方法


tl;dr
=====

```symbolic_link_gcc_version.sh
#! /bin/bash

target_files="c++ cpp g++ gcc x86_64-redhat-linux-c++ x86_64-redhat-linux-g++ x86_64-redhat-linux-gcc"

gcc_version=`gcc -dumpversion | cut -d. -f1,2`

if [[ -z "$gcc_version" ]]; then
    echo "Don't get GCC version."
    exit 1
fi

if [[ -x `which brew` ]]; then
    brew_prefix_dir=`brew --prefix`
    for target_file in $target_files; do
        target_path=`which $target_file`
        link_path=${brew_prefix_dir}/bin/${target_file}-${gcc_version}
        if [[ -x $target_path && ! -e $link_path ]]; then
            ln -s -v $target_path $link_path
        fi
    done
fi
```

上記のファイルを作って実行すればおけ。

```
$ ./symbolic_link_gcc_version.sh
`/home/example/.linuxbrew/bin/c++-4.4' -> `/usr/bin/c++'
`/home/example/.linuxbrew/bin/cpp-4.4' -> `/usr/bin/cpp'
`/home/example/.linuxbrew/bin/g++-4.4' -> `/usr/bin/g++'
`/home/example/.linuxbrew/bin/gcc-4.4' -> `/usr/bin/gcc'
`/home/example/.linuxbrew/bin/x86_64-redhat-linux-c++-4.4' -> `/usr/bin/x86_64-redhat-linux-c++'
`/home/example/.linuxbrew/bin/x86_64-redhat-linux-g++-4.4' -> `/usr/bin/x86_64-redhat-linux-g++'
`/home/example/.linuxbrew/bin/x86_64-redhat-linux-gcc-4.4' -> `/usr/bin/x86_64-redhat-linux-gcc'
```

What's Linuxbrew
================

"A fork of Homebrew for Linux" by [Linuxbrew](https://github.com/Homebrew/linuxbrew) というわけで OS X の Homebrew を Linux 環境でも使えるようにしたものです。とても便利。

何が起きたの?
=============

CentOS 6.4 で Linuxbrew を快適に使用していたところ、あるときから突然…

```
$ brew install lv
Error: lv cannot be built with any available compilers.
To install this formula, you may need to:
  brew install gcc
```

ってなってしまったのでした。

ちなみに素直に brew install gcc すると…

```
$ brew install gcc
==> Installing dependencies for gcc: gmp, mpfr, libmpc, isl, cloog
==> Installing gcc dependency: gmp
Error: gmp cannot be built with any available compilers.
To install this formula, you may need to:
  brew install gcc
```

gcc が使えないので gcc の make に必要な package も当然 install できないという悲しい現実。

どうしてこうなった
==================

"gcc-4\\.[3-9]" というファイルがあるかどうかで gcc の存在確認をしているためだと思われる。

詳細は検証していないけど [Replace CompilerQueue with predetermined priority lists](https://github.com/Homebrew/linuxbrew/commit/8b902c764cb39aaad41baeb229ce5f1d0a9a9bfc) という 2014/09/19 辺りの commit の結果っぽい。

解決策
======

とにかく gcc があることを認識してもらえばいいので [Standalone Installation of Linuxbrew](https://github.com/Homebrew/linuxbrew/wiki/Standalone-Installation) にある [Create symlinks for gcc](https://github.com/Homebrew/linuxbrew/wiki/Standalone-Installation#create-symlinks-for-gcc) を参考に ~/.linuxbrew/bin に gcc-4.4 といった symbolic link を作れば良い。

まず gcc の version を調べる。

```
$ gcc -dumpversion
4.4.7
```

だとしたら

```
$ ln -s `which gcc` `brew --prefix`/bin/gcc-4.4
```

これで解決。

上記した script では念の為 gcc 以外の cpp, g++ あたりも同様の処理しています。

Plan B
======

[Standalone Installation of Linuxbrew](https://github.com/Homebrew/linuxbrew/wiki/Standalone-Installation) ← system の gcc の力を借りて、結果的に Linuxbrew 自体で gcc を入れてしまう方法もアリ。

一応実際に試してみたけど、$HOME/.linuxbrew がとても大きい(一通り入れて 1.1GB ほど)ことになってしまい切ない。

See Also
========

* [Unable to bootstrap gcc #137](https://github.com/Homebrew/linuxbrew/issues/137)
* [linuxbrew on CentOS machine without root. #153](https://github.com/Homebrew/linuxbrew/issues/153)