gerbera-1.4.0のemergeエラー

今までDLNAサーバーとして長年mediatombを使ってきましたが、今となってはアップデートされず、先日のemerge -uDN @worldでライブラリとの整合性も合わなくなり、ついに起動すらしなくなりました。
で、mediatombの後継、Gerberaを使おうとしてハマったので、防備録。

GerberaそのものもStableになっておりませんし、Gerbera-1.4.0が要求するlibupnpのバージョンが1.8.6以上と言うことで、それもTest中。ついでにduktapeも。そこで、これら3つに~amd64のキーワードを与えます。

# cat /etc/portage/package.accept_keywords
=net-misc/gerbera-1.4.0 ~amd64
>=net-libs/libupnp-1.8.3 ~amd64
dev-lang/duktape ~amd64

v
で、emerge =net-misc/gerbera-1.4.0すると、libupnpが最新版のnet-libs/libupnp-1.12.0-r1がemergeされ、Gerberaのコンパイル時にこんなエラーが出ます。

In file included from /var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/server.h:38,
                 from /var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/main.cc:47:
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:41:26: エラー: ‘IN’ has not been d  eclared
   41 |     virtual void getInfo(IN const char *filename, OUT UpnpFileInfo *info) = 0;
      |                          ^~
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:41:41: エラー: two or more data type  s in declaration of ‘filename’
   41 |     virtual void getInfo(IN const char *filename, OUT UpnpFileInfo *info) = 0;
      |                                         ^~~~~~~~
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:41:49: エラー: expected ‘)’ before   ‘,’ token
   41 |     virtual void getInfo(IN const char *filename, OUT UpnpFileInfo *info) = 0;
      |                         ~                       ^
      |                                                 )
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:41:51: エラー: 変数またはフィールド   ‘OUT’ が void と宣言されています
   41 |     virtual void getInfo(IN const char *filename, OUT UpnpFileInfo *info) = 0;
      |                                                   ^~~
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:41:51: エラー: メンバ宣言の最後には   ‘;’ が予期されます
   41 |     virtual void getInfo(IN const char *filename, OUT UpnpFileInfo *info) = 0;
      |                                                   ^~~
      |                                                      ;
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:41:69: エラー: メンバ宣言の最後には   ‘;’ が予期されます
   41 |     virtual void getInfo(IN const char *filename, OUT UpnpFileInfo *info) = 0;
      |                                                                     ^~~~
      |                                                                         ;
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:41:73: エラー: expected unqualified-  id before ‘)’ token
   41 |     virtual void getInfo(IN const char *filename, OUT UpnpFileInfo *info) = 0;
      |                                                                         ^
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:43:38: エラー: ‘IN’ has not been d  eclared
   43 |     virtual zmm::Ref<IOHandler> open(IN const char* filename, IN enum UpnpOpenFileMode mode, IN zmm::String r  ange) = 0;
      |                                      ^~
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:43:53: エラー: two or more data type  s in declaration of ‘filename’
   43 |     virtual zmm::Ref<IOHandler> open(IN const char* filename, IN enum UpnpOpenFileMode mode, IN zmm::String r  ange) = 0;
      |                                                     ^~~~~~~~
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:43:61: エラー: expected ‘)’ before   ‘,’ token
   43 |     virtual zmm::Ref<IOHandler> open(IN const char* filename, IN enum UpnpOpenFileMode mode, IN zmm::String r  ange) = 0;
      |                                     ~                       ^
      |                                                             )
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:43:5: エラー: ‘IN’ declared as a    ‘virtual’ field
   43 |     virtual zmm::Ref<IOHandler> open(IN const char* filename, IN enum UpnpOpenFileMode mode, IN zmm::String r  ange) = 0;
      |     ^~~~~~~
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:43:63: エラー: メンバ宣言の最後には   ‘;’ が予期されます
   43 |     virtual zmm::Ref<IOHandler> open(IN const char* filename, IN enum UpnpOpenFileMode mode, IN zmm::String r  ange) = 0;
      |                                                               ^~
      |                                                                 ;
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:43:94: エラー: メンバ宣言の最後には   ‘;’ が予期されます
   43 |     virtual zmm::Ref<IOHandler> open(IN const char* filename, IN enum UpnpOpenFileMode mode, IN zmm::String r  ange) = 0;
      |                                                                                              ^~
      |                                                                                                ;
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:43:94: エラー: redeclaration of ‘Up  npOpenFileMode RequestHandler::IN’
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:43:63: 備考: previous declaration ‘  zmm::Ref<IOHandler> RequestHandler::IN’
   43 |     virtual zmm::Ref<IOHandler> open(IN const char* filename, IN enum UpnpOpenFileMode mode, IN zmm::String r  ange) = 0;
      |                                                               ^~
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:43:109: エラー: メンバ宣言の最後には   ‘;’ が予期されます
   43 |     virtual zmm::Ref<IOHandler> open(IN const char* filename, IN enum UpnpOpenFileMode mode, IN zmm::String r  ange) = 0;
      |                                                                                                             ^  ~~~~
      |                                                                                                                    ;
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/request_handler.h:43:114: エラー: expected unqualified  -id before ‘)’ token
   43 |     virtual zmm::Ref<IOHandler> open(IN const char* filename, IN enum UpnpOpenFileMode mode, IN zmm::String r  ange) = 0;
      |                                                                                                                    ^
[7/116] /usr/bin/x86_64-pc-linux-gnu-g++ -DHAVE_AVSTREAM_CODECPAR -DHAVE_FFMPEG -DHAVE_INOTIFY -DHAVE_JS -DHAVE_LIBEX  IF -DHAVE_MAGIC -DHAVE_MATROSKA -DHAVE_MYSQL -DHAVE_NL_LANGINFO -DHAVE_SETLOCALE -DHAVE_SQLITE3 -DHAVE_TAGLIB -DPACKA  GE_DATADIR=\"/usr/share/gerbera\" -DPACKAGE_NAME=\"Gerbera\" -DUPNP_HAS_EXTRA_HEADERS_LIST -DUPNP_HAS_REQUEST_COOKIES   -DVERSION=\"1.4.0\" -D__FILENAME__=\"src/autoscan_inotify.cc\" -I/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerber  a-1.4.0/src -I/usr/include/upnp -I/usr/include/mysql -I/usr/include/ffmpeg -I/usr/include/libexif -I/usr/include/ebml   -I/usr/include/matroska  -DNDEBUG -march=btver2 -mtune=btver2 -O3 -pipe -fomit-frame-pointer -Wall   -std=c++17 -MD   -MT CMakeFiles/libgerbera.dir/src/autoscan_inotify.cc.o -MF CMakeFiles/libgerbera.dir/src/autoscan_inotify.cc.o.d -o   CMakeFiles/libgerbera.dir/src/autoscan_inotify.cc.o -c /var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src  /autoscan_inotify.cc
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/autoscan_inotify.cc: コンストラクタ ‘AutoscanInotify:  :AutoscanInotify()’ 内:
/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0/src/autoscan_inotify.cc:53:17: 警告: unused variable ‘max  _watches’ [-Wunused-variable]
   53 |             int max_watches = trim_string(read_text_file(_(INOTIFY_MAX_USER_WATCHES_FILE))).toInt();
      |                 ^~~~~~~~~~~
ninja: build stopped: subcommand failed.
 * ERROR: net-misc/gerbera-1.4.0::gentoo failed (compile phase):
 *   ninja -v -j2 -l0 failed
 *
 * Call stack:
 *     ebuild.sh, line  125:  Called src_compile
 *   environment, line 2600:  Called cmake_src_compile
 *   environment, line  931:  Called cmake_build
 *   environment, line  910:  Called eninja
 *   environment, line 1369:  Called die
 * The specific snippet of code:
 *       "$@" || die "${nonfatal_args[@]}" "${*} failed"
 *
 * If you need support, post the output of `emerge --info '=net-misc/gerbera-1.4.0::gentoo'`,
 * the complete build log and the output of `emerge -pqv '=net-misc/gerbera-1.4.0::gentoo'`.
 * The complete build log is located at '/var/tmp/portage/net-misc/gerbera-1.4.0/temp/build.log'.
 * The ebuild environment file is located at '/var/tmp/portage/net-misc/gerbera-1.4.0/temp/environment'.
 * Working directory: '/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0_build'
 * S: '/var/tmp/portage/net-misc/gerbera-1.4.0/work/gerbera-1.4.0'

これは、libupnpの1.8.6を使うことでエラーが出ずにemerge出来ます。

# emerge -C =net-libs/libupnp-1.12.0-r1
# emerge =net-libs/libupnp--1.8.6-r1

これで強力なインポート機能を持つmediatombの後継、Gerberaを利用することが出来るようになりました!