[cmake][AArch64] AArch64環境かつAlpine Linuxだとgnutlsライブラリを見つけられない?

AIX、UNIX、LinuxContainer

相変わらずAArch64環境でDocker containerイメージを作成しているのですが、そのうちの一つであるstubbyが次期バージョンからcmakeでbuildするように変わるそうです。

そのため移行のための準備をしていたのですが、とあるオプションを有効にするとライブラリが正しく検索されない問題に遭遇しました。

stubbyのレポジトリ

GitHub - getdnsapi/getdns: A modern asynchronous DNS API https://getdnsapi.net/
A modern asynchronous DNS API - getdnsapi/getdns

確認環境

  • Alpine linux 3.11.3 AArch64

発生している問題

-- Found Threads: TRUE
-- Found Libidn2: /usr/lib/libidn2.so (found suitable version "2.3.0", minimum required is "2.0.0")
CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find GnuTLS (missing: GNUTLS_LIBRARIES) (Required is at least
  version "3.5.0")
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  cmake/modules/FindGnuTLS.cmake:80 (find_package_handle_standard_args)
  CMakeLists.txt:367 (find_package)

エラーメッセージ部分を抜粋しています。上記のようにGnuTLSライブラリが見つからない、というエラーメッセージだと認識しています。

しかし以下のようにインストールしています。

/usr/src/build # apk info | grep gnutls
WARNING: Ignoring APKINDEX.70f61090.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.ca2fea5b.tar.gz: No such file or directory
gnutls
gnutls-c++
gnutls-dev

該当のcmakeモジュール

FindGnuTLS — CMake 3.16.9 Documentation
CMake / CMake · GitLab
CMake, the cross-platform, open-source build system.

といってもモジュールドキュメントを確認しても、公式サイトを確認してみてもよくわかっていないのですが・・・。なんにせよ今回のfind_packageが正しくGnuTLSライブラリを検索していないというのはわかります。

調べてみるとfind_packagepkg_check_modules を大体に使えることがわかりました。

自分なりの対策をしてみた

その1

ということで、上記のWebサイトの情報を参考にパッチを作りそれで問題が回避できないか試してみました。

--- CMakeLists.txt.bak  2020-02-23 09:33:05.735484712 +0900
+++ CMakeLists.txt      2020-02-23 09:37:04.087814273 +0900
@@ -364,7 +364,8 @@
 # GnuTLS and Nettle. If using GnuTLS, we need the Nettle dev stuff to
 # handle digital signature algorithms. GnuTLS uses Nettle internally.
 if (USE_GNUTLS)
-  find_package(GnuTLS "3.5.0" REQUIRED)
+  find_package(PkgConfig REQUIRED)
+  pkg_check_modules(GnuTLS REQUIRED gnutls>=3.5)
   find_package(Nettle REQUIRED)

   set(tlsdir "gnutls")
   set(HAVE_NETTLE 1)

結果は?

-- Looking for os/log.h - not found
-- Looking for getopt
-- Looking for getopt - found
-- Configuring done
CMake Error at CMakeLists.txt:914 (add_executable):
  Target "check_getdns_event" links to target "GnuTLS::GnuTLS" but the target
  was not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?


CMake Error at CMakeLists.txt:914 (add_executable):
  Target "check_getdns_event" links to target "GnuTLS::Dane" but the target  
  was not found.  Perhaps a find_package() call is missing for an IMPORTED   
  target, or an ALIAS target is missing?  

さらに関連するライブラリ(getdns_event?)がtargetとしての”GnuTLS::GnuTLS“や”GnuTLS::Dane“を見つけることが出来なかった?という理解でいいんでしょうか? 付け焼き刃的な対応ではうまく行かないようです。

その2

そもそもGnuTLSライブラリのPATHが見つからない感じなので、いくつかの変数を指定してみることにしました。

cmake \
       -DENABLE_STATIC=OFF \
       -DBUILD_STUBBY=ON \
       -DSTUB_NATIVE_DNSSEC=ON \
       -DEDNS_COOKIES=ON \
       -DBUILD_LIBEV=ON \
       -DBUILD_LIBEVENT2=ON \
       -DBUILD_LIBUV=ON \
       -DUSE_LIBIDN2=ON \
       -DUSE_GNUTLS=ON \
       -DGNUTLS_DIR=/usr \
       -DGNUTLS_LIBRARIES=/usr/lib \
       -DGNUTLS_INCLUDE_DIR=/usr/inclue \
       -DCMAKE_INSTALL_PREFIX=/usr/local \
       ..

結果は?

-- Found Libidn2: /usr/lib/libidn2.so (found suitable version "2.3.0", minimum required is "2.0.0") 
CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find GnuTLS (missing: GNUTLS_LIBRARIES) (Required is at least
  version "3.5.0")
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  cmake/modules/FindGnuTLS.cmake:80 (find_package_handle_standard_args) 
  CMakeLists.txt:367 (find_package)


-- Configuring incomplete, errors occurred!
See also "/usr/src/build/CMakeFiles/CMakeOutput.log".
See also "/usr/src/build/CMakeFiles/CMakeError.log". 

こちらについても結果は変わりませんでした。

cmakeについての学習が必要なようです。

仕方がないのでgetdnsへissueを立てることにしました。

cmake cannot find gnutls library (-DUSE_GNUTLS=ON) · Issue #457 · getdnsapi/getdns
Even though the gnutls-dev package is installed, it seems that cmake fails to find the gnutls library. -- Found Threads:...

このあたりの問題についてご存じの方、アドバイスなどあれば教えていただけないでしょうか?

この記事を書いた人

kometchtech

うつ病を患いながら、IT業界の末席にいるおっさんエンジニア。科学計算をしたことがないのに、HPC分野にお邪魔している。興味のある分野で学習したことをblogにまとめつつ、うつ病の経過症状のメモも置いておく日々。じつはRouterboard User Group JPの中の人でもある。 Amazon欲しいものリスト / Arm板を恵んでくれる人募集中

kometchtechをフォローする
タイトルとURLをコピーしました