KeePassXCを起動してみると、なぜか設定画面に「ブラウザー統合」がありません。調べてみたところ、どうやらpkgsrcから作成すると「ブラウザー統合」が無効になっていることが分かりました。そこで「ブラウザー統合」を有効にしたものをpkgsrcから自前でビルドしてみようと思います。
ところがビルドしようとしたらエラーが出ました。
[ 5%] Built target keepassxcbrowser_autogen
[ 5%] Building CXX object src/browser/CMakeFiles/keepassxcbrowser.dir/NativeMessagingBase.cpp.o
In file included from /usr/include/stddef.h:37:0,
from /usr/include/g++/cstddef:50,
from /usr/pkg/qt5/include/QtCore/qglobal.h:46,
from /usr/pkg/qt5/include/QtCore/qatomic.h:41,
from /usr/pkg/qt5/include/QtCore/QAtomicInteger:1,
from /usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/src/browser/NativeMessagingBase.h:22,
from /usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/src/browser/NativeMessagingBase.cpp:19:
/usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/src/browser/NativeMessagingBase.cpp: In member function 'void NativeMessagingBase::newNativeMessage()':
/usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/src/browser/NativeMessagingBase.cpp:65:5: error: invalid static_cast from type 'std::nullptr_t' to type 'intptr_t {aka int}'
EV_SET(ev, fileno(stdin), EVFILT_READ, EV_ADD, 0, 0, nullptr);
^
*** Error code 1
Stop.
make[2]: stopped in /usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/build
*** Error code 1
このエラーを見るとEV_SET()に問題がありそうです。調べてみると、EV_SET()が使われているのは、どうやらここだけのようです。
% find work/keepassxc-2.4.0/src -type f | xargs grep EV_SET
work/keepassxc-2.4.0/src/browser/NativeMessagingBase.cpp: EV_SET(ev, fileno(stdin), EVFILT_READ, EV_ADD, 0, 0, nullptr);
しかも、この箇所はLINUX以外のUNIX系OSにしか影響がないようです。ソースの変更状況を確認するとKeePassXC 2.3.0-betaの頃に入ったコードのようです。
53 void NativeMessagingBase::newNativeMessage()
54 {
55 #if defined(Q_OS_UNIX) && !defined(Q_OS_LINUX)
56 struct kevent ev[1];
57 struct timespec ts = {5, 0};
58
59 int fd = kqueue();
60 if (fd == -1) {
61 m_notifier->setEnabled(false);
62 return;
63 }
64
65 EV_SET(ev, fileno(stdin), EVFILT_READ, EV_ADD, 0, 0, NULL);
66 if (kevent(fd, ev, 1, nullptr, 0, &ts) == -1) {
67 m_notifier->setEnabled(false);
68 ::close(fd);
69 return;
70 }
71
72 int ret = kevent(fd, NULL, 0, ev, 1, &ts);
73 if (ret < 1) {
74 m_notifier->setEnabled(false);
75 ::close(fd);
76 return;
77 }
78 #elif defined(Q_OS_LINUX)
79 int fd = epoll_create(5);
80 struct epoll_event event;
81 event.events = EPOLLIN;
82 event.data.fd = 0;
83 if (epoll_ctl(fd, EPOLL_CTL_ADD, 0, &event) != 0) {
84 m_notifier->setEnabled(false);
85 ::close(fd);
86 return;
87 }
88
89 if (epoll_wait(fd, &event, 1, 5000) < 1) {
90 m_notifier->setEnabled(false);
91 ::close(fd);
92 return;
93 }
94 #endif
95 readLength();
96 #ifndef Q_OS_WIN
97 ::close(fd);
98 #endif
99 }
EV_SET()に問題がありそうだという事、またLINUX系ディストリビューションには影響がない(から、そちらからのフィードバックで修正される)事は分かりましたが、どのように直したら良いのかわかりません。ただしエラーメッセージを見る分にはキャスト絡みのようです。Webを検索したら「*BSD で kqueue・kevent を使ってみよう」というページが見つかりました。それを見ると、EV_SET()の最後のパラメータはNULLが指定されています。これが問題の原因なのでしょうか。
試しにnullptrをNULLに書き換えてみたところ、エラーが消えてビルドに成功しました。ただし、このような変更が正しいのかは、確信がありません。nullptrというのはC++11で導入されたようですが、次のような情報も見つかりました。
ビルド出来ましたが、keepassxc-proxyというのも出来ていました。このためPLISTを変更する必要がありました。
--- PLIST.org 2019-03-23 00:56:41.000000000 +0900
+++ PLIST.new 2019-07-10 09:31:09.155023065 +0900
@@ -1,5 +1,6 @@
@comment $NetBSD: PLIST,v 1.4 2019/03/22 15:56:41 ryoon Exp $
bin/keepassxc
+bin/keepassxc-proxy
bin/keepassxc-cli
lib/keepassxc/libkeepassx-autotype-xcb.so
man/man1/keepassxc-cli.1
ちなみにMakefileは次のように変更しました。
--- Makefile.org 2019-03-23 00:56:41.000000000 +0900
+++ Makefile.new 2019-07-10 15:29:19.274685074 +0900
@@ -18,7 +18,7 @@
USE_CMAKE= yes
USE_LANGUAGES= c c++
CMAKE_ARG_PATH= ..
-CMAKE_ARGS+= -DKEEPASSXC_BUILD_TYPE=Release
+CMAKE_ARGS+= -DKEEPASSXC_BUILD_TYPE=Release -DWITH_XC_BROWSER=ON -DWITH_XC_NETWORKING=ON
CONFIGURE_DIRS= build
NOT_PAX_MPROTECT_SAFE+= bin/keepassxc
@@ -36,6 +36,7 @@
.include "../../devel/zlib/buildlink3.mk"
.include "../../graphics/hicolor-icon-theme/buildlink3.mk"
.include "../../security/libgcrypt/buildlink3.mk"
+.include "../../security/libsodium/buildlink3.mk"
.include "../../security/argon2/buildlink3.mk"
.include "../../sysutils/desktop-file-utils/desktopdb.mk"
.include "../../x11/qt5-qtbase/buildlink3.mk"
0 件のコメント:
コメントを投稿