fatal error: 'LAPACKE_H_PATH-NOTFOUND/lapacke.h' file not found: opencv 3.2.0 のビルドにコケる on osx 10.12

3.2.0がリリースされてすぐにビルドしようとして失敗して、しばらく放置していたのですが、気が向いて再トライしました。今のところ二つ解決方法を見つけたので、書いておきます。

## まとめ

- macOSだと（おそらく）システムのOpenBLAS (`/opt/OpenBLAS`) を使う設定になっていると思うので、brew でいれた OpenBLAS[^1] (`/usr/local/opt/OpenBLAS`) を使うように変更する（詳細後述）
- cmakeで `-DWITH_LAPACK=OFF` オプションを追加する（根本的な解決にはなっていないが、エラーは消える）

[^1]: 現在のバージョンは 0.2.18_2

## 問題

```bash
% make -j4
...
[ 42%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/src/matmul.cpp.o
In file included from /Users/ryuyamamoto/cv/opencv/modules/core/src/hal_internal.cpp:49:
In file included from /Users/ryuyamamoto/cv/opencv/build/opencv_lapack.h:1:
In file included from /opt/OpenBLAS/include/cblas.h:5:
/opt/OpenBLAS/include/openblas_config.h:100:43: warning: '__STDC_VERSION__' is not defined, evaluates to 0 [-Wundef]
#if (defined(__STDC_IEC_559_COMPLEX__) || __STDC_VERSION__ >= 199901L || \
                                          ^
In file included from /Users/ryuyamamoto/cv/opencv/modules/core/src/hal_internal.cpp:49:
/Users/ryuyamamoto/cv/opencv/build/opencv_lapack.h:2:10: fatal error: 'LAPACKE_H_PATH-NOTFOUND/lapacke.h' file not found
#include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning and 1 error generated.
make[2]: *** [modules/core/CMakeFiles/opencv_core.dir/src/hal_internal.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
make: *** [all] Error 2
```

システムにプリインストールされた `/opt/OpenBLAS` を見にいってコケています。実際、

```bash
ls -l /opt/OpenBLAS/include/                                                                           (git)-[3.2.0]
total 200
-rw-r--r--  1 ryuyamamoto  1000  44433 11  7  2014 cblas.h
-rw-r--r--  1 ryuyamamoto  1000  46918 11  7  2014 f77blas.h
-rw-r--r--  1 ryuyamamoto  1000   4632 11  7  2014 openblas_config.h
```

lapacke.h は存在していません。brew で入れた OpenBLASはどうかなぁと思って調べてみると、lapacke.h は存在いしているので、そちらを使うようにビルドオプションを変更すれば良さそうです。

```bash
% ls -l /usr/local/opt/openblas/include/                                                                 (git)-[3.2.0]
total 2544
-rw-r--r--  1 ryuyamamoto  admin    45648 12 30 21:11 cblas.h
-rw-r--r--  1 ryuyamamoto  admin    47356 12 30 21:11 f77blas.h
-rw-r--r--  1 ryuyamamoto  admin  1144601  4 13  2016 lapacke.h
-rw-r--r--  1 ryuyamamoto  admin     4388  4 13  2016 lapacke_config.h
-rw-r--r--  1 ryuyamamoto  admin      474  4 13  2016 lapacke_mangling.h
-rw-r--r--  1 ryuyamamoto  admin    33161  4 13  2016 lapacke_utils.h
-rw-r--r--  1 ryuyamamoto  admin     4680 12 30 21:11 openblas_config.h
```

## 解決方法

brewでいれたOpenBLASを見つけるように `cmake/OpenCVFindOpenBLAS.cmake` を修正します。

```diff
diff --git a/cmake/OpenCVFindOpenBLAS.cmake b/cmake/OpenCVFindOpenBLAS.cmake
index 60594de..19a9165 100644
--- a/cmake/OpenCVFindOpenBLAS.cmake
+++ b/cmake/OpenCVFindOpenBLAS.cmake
@@ -50,6 +50,7 @@ SET(Open_BLAS_INCLUDE_SEARCH_PATHS
   /usr/local/include
   /usr/local/include/openblas
   /usr/local/include/openblas-base
+  /usr/local/opt/openblas/include
   /opt/OpenBLAS/include
   $ENV{OpenBLAS_HOME}
   $ENV{OpenBLAS_HOME}/include
@@ -64,6 +65,7 @@ SET(Open_BLAS_LIB_SEARCH_PATHS
         /usr/lib64
         /usr/local/lib
         /usr/local/lib64
+        /usr/local/opt/openblas/lib
         /opt/OpenBLAS/lib
         $ENV{OpenBLAS}cd
         $ENV{OpenBLAS}/lib
```

これで、ビルドが通るようになりました。めでたし。

`OpenCVFindOpenBLAS.cmake ` をいじらずに、適当な変数をoverrideする方がいいと思うのですが（`-D_OPENBLAS_PATH=/usr/local/opt/OpenBLAS`的な）、いまいちやり方がわからずズルをしました。

あと、最初に書きましたが、`-DWITH_LAPACK=OFF` とすれば、エラー事態は回避できます。ただし、パフォーマンスは落ちると思います。

## 参考

- [fata error: LAPACKE_H_PATH-NOTFOUND when building OpenCV 3.2](http://answers.opencv.org/question/121651/fata-error-lapacke_h_path-notfound-when-building-opencv-32/)

## ビルドコマンド

参考までに、僕が使っているビルドオプションを貼っておきます。

```
% CC=/usr/local/bin/clang CXX=/usr/local/bin/clang++ cmake -DBUILD_TIFF=ON \
-DBUILD_opencv_java=OFF \
-DWITH_CUDA=OFF \
-DENABLE_AVX=ON \
-DWITH_OPENGL=ON \
-DWITH_OPENCL=OFF \
-DWITH_IPP=ON \
-DWITH_TBB=ON \
-DWITH_EIGEN=ON \
-DWITH_V4L=ON \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
-DCMAKE_BUILD_TYPE=RELEASE \
-DBUILD_opencv_viz=OFF \
-DCMAKE_INSTALL_PREFIX=$(python -c "import sys; print(sys.prefix)") -DPYTHON_EXECUTABLE=$(which python) \
-DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-DPYTHON_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-DWITH_OPENMP=ON \
-DWITH_QT=ON \
-DWITH_VTK=OFF \
-DWITH_LAPACK=ON ..
```