Mac OS X El Capitanにcaffeを入れる時の試行錯誤:エラーが出た時に打てる手

#背景
これまでTensorFlowやChainer、Theanoはwindows、Ubuntu、Mac OS、はたまたDockerやVMWare上で動く環境を構築してきましたが、上記が(今思うと比較的)簡単に構築できた事もありcaffeを試してみました。ゴールはpythonでimport caffeが出来るところまでです。  
が、これが非常に曲者でとてもしんどく辛い三日三晩になってしまい挙句の果てに結局(今現在:2016/8/31)環境構築できず、という事態に。。。

caffeの環境構築の困難さは様々語られているところですが、特に私が感じた事として、

- El Capitanにcaffeを入れる記事が少ない
- make runtestでエラーが出た場合の対処法に関する情報がほとんどない
- 記事によって言っていることがけっこう違う

なんかが挙げられました。それでもネット漁って打てる手は打ったつもりなので一度まとめておこうと思います。後進の方のなにか参考にでもなれば。。。
というかこれ以外の手があれば是非教えていただきたいです。

#環境

- MacBookAir 11インチ
- Mac OS X El Capitan
- CPU　1.7GHz Intel Core i5
- Memory 4g 1600MHz DDR3
- Homebrew、pyenv、gitインストール済
- pyenvでanaconda2-4.1.0のvirtualenvを想定

※今回はGPUの使用は想定していません。

#環境構築の大まかな流れ

1. pyenvでvirtualenv環境設定
2. brew install "packages"
3. git clone -> edit Makefile_config
4. build -> make all, make test, make runtest
5. make pycaffe

※詳細なインストール方法についてはここでは省きます。
　以下のサイトなどを参考にしてください。

- [OS X 10.11 (El Capitan)にcaffeをインストールする](http://blog.livedoor.jp/tyamada22/archives/1915029.html)
- [CaffeをCPU ModeでMac OS X 10.10に入れる手順](http://qiita.com/knao124/items/c76e974cfbaabb5542e8)
- [Mac OS X 10.10にCaffeをインストールするまで](http://smrmkt.hatenablog.jp/entry/2015/02/11/195213)

#第一の躓き:brewの挙動がなんかおかしい
もうちょっとかなり初期のエラーだったのでエラーログも流れていってしまいましたが、

```
$ brew update
```
とやっても必要なファイルが読み込めない等のエラーが発生。
uninstall後、再度installすることで解決
(どうやらずっと前に入れたbrewのためOSアップデートの影響受けたっぽい)。

- uninstallコマンド:

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
```
- installコマンド:

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

#第二の躓き:make allでhdf5のエラー 
これはinstall時に参考にしたサイトが古いと、brewでインストールするhdf5のバージョンを変える必要があると書いてあります。が、El Capitanでanacondaを使ってる限りはこの操作は不要です。私は設定変更してしまったがためにエラーとなってしまいましたので、これは元の設定のままで良いはずです。
#第三の躓き:make allでwarning※未解決
buildには気にしなくてよいものらしいです。ひとまず放置。
参考　[clang: warning: argument unused during compilation: '-pthread' ](https://github.com/BVLC/caffe/issues/3608)

#第四の躓き:make runtestでエラー※未解決
ただし、build自体は出来ている(?)。
エラーログ：

```
[----------] Global test environment tear-down
[==========] 1096 tests from 150 test cases ran. (77287 ms total)
[  PASSED  ] 1091 tests.
[  FAILED  ] 5 tests, listed below:
[  FAILED  ] SGDSolverTest/1.TestSnapshotShare, where TypeParam = N5caffe9CPUDeviceIdEE
[  FAILED  ] AdaGradSolverTest/1.TestSnapshotShare, where TypeParam = N5caffe9CPUDeviceIdEE
[  FAILED  ] AdaDeltaSolverTest/1.TestSnapshotShare, where TypeParam = N5caffe9CPUDeviceIdEE
[  FAILED  ] AdamSolverTest/1.TestSnapshotShare, where TypeParam = N5caffe9CPUDeviceIdEE
[  FAILED  ] RMSPropSolverTest/1.TestSnapshotShare, where TypeParam = N5caffe9CPUDeviceIdEE

 5 FAILED TESTS
make: *** [runtest] Error 1
```
make allではwarningだけで乗り切れるものの、make runtestでエラーがいくつか出る状態になりました。そこで試しに下記サイトを参考にしてサンプルプログラムを実行してみました。

[Mac OSX 10.11でDeepLearningフレームワークCaffeのサンプルを動かすまで](http://hack-le.com/47695407-2/)

「4.サンプルプログラムを実行」に従って動かしてみると時間はかかりましたが見事にプログラムは実行完了しました。どうやらbuildはできている？？

#第五の躓き:make pycaffeでエラー※未解決
エラーログ内容:

```
(caffe) macbookair:caffe <username>$ make pycaffe
CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
python/caffe/_caffe.cpp:1:10: fatal error: 'Python.h' file not found
#include <Python.h>  // NOLINT(build/include_alpha)
         ^
1 error generated.
make: *** [python/caffe/_caffe.so] Error 1
```
##やってみたこと以下5つ（いずれも失敗）
ちなみに1~4まではまずbuild

```
$ make clean
$ make all -j4
$ make test -j4
$ make runtest
```
5つ全てで

```
$ make pycaffe
```
###1. CPLUS_INCLUDE_PATH設定

```
$ find / -name Python.h
```
でPython.hの場所を確認

```
$ vi ~/.bash_profile
```
で

```
CPLUS_INCLUDE_PATH=/Users/<username>/.pyenv/versions/anaconda-2.1.0/include/python2.7
```
を追加。(上記は一例。＜username＞は自分の環境に置換)

```
$ source ~/.bash_profile
```
で有効化
###2. brewで入れたもの全て再install

```
$ brew uninstall "packages"
```
で一旦uninstallした後、

```
$ brew install "packages"
```
特に'boost'を再installした直後はmake runtestのエラー数が5 -> 4に減少
その後色々installしたらまた5に戻った。。。
###3. anacondaのバージョン変更
anaconda2-4.1.0 -> anaconda-2.4.0
既にvirtualenv環境に入っていたら

```
$ pyenv deactivate
```
で一旦仮想環境抜け出して

```
$ pyenv install anaconda-2.4.0
```
(けっこう時間掛かるので要注意)


```
$ pyenv virtualenv anaconda-2.4.0 caffe2
```
とかでcaffe2って名前(なんでも可)の仮想環境構築

```
$ pyenv activate caffe2
```
で変更したanaconda環境へ侵入。
いちおう全部pip install

```
$ pip install -r caffe/python/python/requirements.txt
```

###4. PYTHONPATH設定 
ファイル編集

```
$ vi ~/.bash_profile
```
で

```
export PYTHONPATH=${PYTHONPATH}:/Users/<username>/caffe/python
```
(＜username＞の部分は自分の環境に置換)
を追加。
追加したら

```$ source ~/.bash_profile```か、サインアウト->サインイン
で有効化
###5. findコマンドで見つけたPython.hをコピィ 
1.でfindしたPython.hのディレクトリから

```
cp xxx/xxx/Python.h /Users/<username>/caffe/python/caffe/
```
でPython.hをコピィ(xxx/xxxは見つけたディレクトリ)
make pycaffe実行したところ、エラーログの内容が更新
エラーログ：

```
(caffe) macbookair:caffe <username>$ make pycaffe
CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
python/caffe/_caffe.cpp:1:10: error: 'Python.h' file not found with <angled> include; use "quotes" instead
#include <Python.h>  // NOLINT(build/include_alpha)
         ^~~~~~~~~~
         "Python.h"
In file included from python/caffe/_caffe.cpp:1:
python/caffe/Python.h:7:10: fatal error: 'patchlevel.h' file not found
#include "patchlevel.h"
         ^
2 errors generated.
make: *** [python/caffe/_caffe.so] Error 1
```
内容見る感じやっぱbuildミスってんのかな -> 無限ループ
ちなみにこの他にも

```
$ brew update
```
とか

```
$ brew install python-dev
```
とかやってましたが、ことごとく効果なし。
###以下、今回のMakefile.configの設定内容

```
## Refer to http://caffe.berkeleyvision.org/installation.html
# Contributions simplifying and improving our build system are welcome!

# cuDNN acceleration switch (uncomment to build with cuDNN).
# USE_CUDNN := 1

# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1

# uncomment to disable IO dependencies and corresponding data layers
# USE_OPENCV := 0
# USE_LEVELDB := 0
# USE_LMDB := 0

# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)
#       You should not set this flag if you will be reading LMDBs with any
#       possibility of simultaneous read and write
# ALLOW_LMDB_NOLOCK := 1

# Uncomment if you're using OpenCV 3
# OPENCV_VERSION := 3

# To customize your choice of compiler, uncomment and set the following.
# N.B. the default for Linux is g++ and the default for OSX is clang++
CUSTOM_CXX := /usr/bin/clang++

# CUDA directory contains bin/ and lib/ directories that we need.
CUDA_DIR := /usr/local/cuda
# On Ubuntu 14.04, if cuda tools are installed via
# "sudo apt-get install nvidia-cuda-toolkit" then use this instead:
# CUDA_DIR := /usr

# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 lines for compatibility.
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
                -gencode arch=compute_20,code=sm_21 \
                -gencode arch=compute_30,code=sm_30 \
                -gencode arch=compute_35,code=sm_35 \
                -gencode arch=compute_50,code=sm_50 \
                -gencode arch=compute_50,code=compute_50

# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
# BLAS := atlas
BLAS := open
# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.
# Leave commented to accept the defaults for your choice of BLAS
# (which should work)!
# BLAS_INCLUDE := /path/to/your/blas
# BLAS_LIB := /path/to/your/blas


# Homebrew puts openblas in a directory that is not on the standard search path
BLAS_INCLUDE := $(shell brew --prefix openblas)/include
BLAS_LIB := $(shell brew --prefix openblas)/lib

# This is required only if you will compile the matlab interface.
# MATLAB directory should contain the mex binary in /bin.
# MATLAB_DIR := /usr/local
# MATLAB_DIR := /Applications/MATLAB_R2012b.app

# NOTE: this is required only if you will compile the python interface.
# We need to be able to find Python.h and numpy/arrayobject.h.
# PYTHON_INCLUDE := /usr/include/python2.7 \
#               /usr/lib/python2.7/dist-packages/numpy/core/include
# Anaconda Python distribution is quite popular. Include path:
# Verify anaconda location, sometimes it's in root.
ANACONDA_HOME := $(HOME)/anaconda
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
                $(ANACONDA_HOME)/include/python2.7 \
                $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \

# Uncomment to use Python 3 (default is Python 2)
# PYTHON_LIBRARIES := boost_python3 python3.5m
# PYTHON_INCLUDE := /usr/include/python3.5m \
#                 /usr/lib/python3.5/dist-packages/numpy/core/include

# We need to be able to find libpythonX.X.so or .dylib.
# PYTHON_LIB := /usr/lib
PYTHON_LIB := $(ANACONDA_HOME)/lib

# Homebrew installs numpy in a non standard path (keg only)
# PYTHON_INCLUDE += $(dir $(shell python -c 'import numpy.core; print(numpy.core.__file__)'))/include
# PYTHON_LIB += $(shell brew --prefix numpy)/lib

# Uncomment to support layers written in Python (will link against Python libs)
# WITH_PYTHON_LAYER := 1

# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

# If Homebrew is installed at a non standard location (for example your home directory) and you use it for general dependencies
# INCLUDE_DIRS += $(shell brew --prefix)/include
# LIBRARY_DIRS += $(shell brew --prefix)/lib

# Uncomment to use `pkg-config` to specify OpenCV library paths.
# (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.)
# USE_PKG_CONFIG := 1

# N.B. both build and distribute dirs are cleared on `make clean`
BUILD_DIR := build
DISTRIBUTE_DIR := distribute

# Uncomment for debugging. Does not work on OSX due to https://github.com/BVLC/caffe/issues/171
# DEBUG := 1

# The ID of the GPU that 'make runtest' will use to run unit tests.
TEST_GPUID := 0

# enable pretty build (comment to see full commands)
Q ?= @
```

#成れの果て
VMWareでLinux上にcaffe環境構築(イマココ