VMware GemFire(旧Tanzu GemFire)のC++NativeClientをRHEL8上で動かそうとしたら、少し罠があったので備忘録がてら残す。
C++NativeClientのインストール
TanzuNetworkからVMware GemFire Native Client RHEL 8
をダウンロードし、RHEL8上で解凍する。
tar xvzfp vmware-gemfire-native-10.4.3-build.9-Rhel8-64bit.tar.gz
ドキュメントの記載に従って移動し、環境変数にパスを設定する。(この環境変数はビルドするまでのところでは使っていないかも。サンプル内のスクリプトでは見ている模様)
sudo mv vmware-gemfire-native /usr/local/nativeclient
echo "export GEODE_HOME=/opt/vmware/vmware-gemfire-10.0.1/" >> ~/.bashrc
. ~/.bashrc
OpenSSLのインストール
RHEL8用のOpenSSL3のライブラリが配布されていないようなので自作する。
ソースをダウンロードしてmake install
する。
./Configure
のオプションはこちらの記事を参考にした。
wget https://www.openssl.org/source/openssl-3.0.11.tar.gz
tar xvzf openssl-3.0.11.tar.gz
cd ./openssl-3.0.11
sudo yum install perl-IPC-Cmd perl-Pod-Html
./Configure --prefix=/usr --openssldir=/usr/local/ssl '-Wl,-rpath,$(LIBRPATH)'
make -j9
sudo make install
サンプルのビルド
ビルドのためにcmakeをインストールする。
sudo yum install cmake -y
サンプルコードを手元に展開する。
mkdir -p workspace/build
cp -r ./nativeclient/examples/ ./workspace
ビルドする。
cd workspace/build/
cmake .. -DVMwareGemFireNative_ROOT="/usr/local/nativeclient"
cmake --build .
問題なければ各サンプルディレクトリの下にバイナリが生成されており、実行できる。
$./cpp/transaction/cpp-transaction
Created cache
Created region 'exampleRegion'
Rolled back transaction - retrying(4)
躓いたところ
サンプルのBUILD-EXAMPLES.md
に従ってビルドすると、以下のエラーで失敗する。
$ cmake .. -DGeodeNative_ROOT="/usr/local/nativeclient"
:(省略)
CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find VMwareGemFireNative (missing:
VMwareGemFireNative_CPP_LIBRARY VMwareGemFireNative_CPP_INCLUDE_DIR) (found
version "1.0")
これはGeodeNative_ROOT
がGeode用の定義であるため。
エラーに従ってVMwareGemFireNative_ROOT
に置き換えれば動く。
あと、OpenSSLを入れていないと以下のエラーとなる。
$ cmake --build .
:
/usr/bin/ld: warning: libssl.so.3, needed by /usr/local/nativeclient/lib/libvmware-gemfire.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libcrypto.so.3, needed by /usr/local/nativeclient/lib/libvmware-gemfire.so, not found (try using -rpath or -rpath-link)
Requirementには載っておらず見落としやすいため注意が必要となる。
付録:スクラッチ開発用の雛形
exampleをコピーして開発するのはやりづらいので、ゼロから開発する際にテンプレートとして使えそうな雛形を以下に用意した。
構成は以下。
gemfire-client-sample
|-- CMakeLists.txt
|-- Makefile
|-- cmake
| `-- FindVMwareGemFireNative.cmake
|-- main.cpp
`-- script
|-- startserver.ps1
|-- startserver.sh
|-- stopserver.ps1
`-- stopserver.sh
スクリプトはサンプルのものを流用した。
/usr/local/nativeclinentにGemFire Clientがインストールされていれば、makeするだけで動くはず。