環境
- cmake version 2.8.12.2
- OpenSSL 1.1.1b 26 Feb 2019(ソースコンパイル)
OpenSSLをインストールしてあるのに、なぜかfind_packageで見つからない
毎回cmakeのパッケージ検索をするのが面倒だったのでfind_packageを仕込んだはいいんですが、以下のようなエラーが出てしまい見つかりませんでした。
ちゃんと対象のファイルは環境下にインストールされているのに。。。
-- Configuring incomplete, errors occurred!
See also "/home/developer/work/EncryptedEditor/build/CMakeFiles/CMakeOutput.log".
CMake Error at /usr/share/cmake/Modules/FindOpenSSL.cmake:278 (list):
list GET given empty list
Call Stack (most recent call first):
lib/src/CMakeLists.txt:5 (find_package)
CMake Error at /usr/share/cmake/Modules/FindOpenSSL.cmake:279 (list):
list GET given empty list
Call Stack (most recent call first):
lib/src/CMakeLists.txt:5 (find_package)
CMake Error at /usr/share/cmake/Modules/FindOpenSSL.cmake:281 (list):
list GET given empty list
Call Stack (most recent call first):
lib/src/CMakeLists.txt:5 (find_package)
CMake Error at /usr/share/cmake/Modules/FindOpenSSL.cmake:283 (list):
list GET given empty list
Call Stack (most recent call first):
lib/src/CMakeLists.txt:5 (find_package)
原因
エラー箇所の/usr/share/cmake/Modules/FindOpenSSL.cmake
を覗いてみたところ、ヘッダーパス/openssl/opensslv.h
内のOPENSSL_VERSION_NUMBERをパースしてバージョン情報を取得していました。
しかし定義を見比べるとdefineの前にスペースのあるなしという違いが。何それ(-_-;)
header/openssl/opensslv.h
# define OPENSSL_VERSION_NUMBER 0x1010102fL
//#とdefineの間にスペースがある
/usr/share/cmake/Modules/FindOpenSSL.cmake
file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str
REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*")
##とdefineの間が詰まっていることを想定している
対処
その1. cmakeのversionを上げる
cmake 3.10の場合は、ちゃんとスペースのありなしが判別できるようになっています。なのでcmakeのversionが上げるのがベターですね。
/usr/share/cmake-3.10/Modules/FindOpenSSL.cmake
file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str
REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*")
その2. FindOpenSSL.cmakeを修正する。
cmakeのversionを変えなくても、その1の処理と同じように#とdefineの間にタブ、スペースがある場合を想定した正規表現に変えてあげればOKです。
環境によるツールバージョンの違いはこういったことが起こるのが嫌ですね(-_-;)