Hey,
I've been working on and off in a port for Monero for quite some time.
Thanks to your's and byteskeptical interest, I got back to it and now I
have a working port attached here.
Honestly, I don't understand why people create ports for OpenBSD without
trying to get them added to the official ports tree. In your case, I
imagine it might be to test it more thoroughly, but it's still
beneficial to share it to receive feedback from others.
Dear all,
I am currently working on creating a port of the Monero CLI wallet for
OpenBSD, the work I have done so far is attached in this email. This project
is of personal interest to me, as well as to others who view privacy as an
essential component of cybersecurity.
First of all, it wasn't super clear to me if you only ported (or
intended to port) monero-wallet-cli. The attached port is for all the
binaries you build from upstream, and in particular monerod.
It's all part of the Monero CLI wallet, as the Monero developers
intended. I think that separating the binaries could be
counterproductive. On the other hand, my interest, along with that of
many others porting this software to OpenBSD, is primarily to host a
node. Personally, I currently host a public Monero node on a Raspberry
Pi 5 running Debian. However, once OpenBSD is compatible with this
hardware, I plan to install it and attempt to run this and other
services there.
I am in the process of learning how to create ports for OpenBSD, which is
why I have chosen to start with software that seems relatively
straightforward to port.
Hell no. ^^
I have realized this the hard way.
I think this port is complete. However, it is still a work in progress and I
am hesitant to propose it for inclusion in the ports tree due to the
following issue:
When building this software as a non-root user, the following error occurs:
LLVM ERROR: out of memory
c++: error: unable to execute command: Abort trap (core dumped)
This issue is documented in the original project, and the solution is to
increase the ulimit size to 2 GB:
ulimit -d 2000000
I would like to know if it is possible to resolve this issue within the port
itself, or if it would be acceptable to add this port to the tree despite
the problem, perhaps by including a note in the README file.
Didn't deal with this. I run with PORTS_PRIVSEP=Yes and _pbuild runs
with 8GB base in amd64.
I am glad this is not a problem.
Additionally, while working on this port and reading the documentation, I
encountered several questions that I had to deduce based on how other
OpenBSD ports handle them:
a. The directories pointed to by certain macros in bsd.port.mk, such as
PREFIX and LOCALSTATEDIR.
SUBST_VARS in bsd.port.mk(5) explains a bit, item 16 of [1] explains how
each directory is used, "make show=VAR" shows the value of VAR.
Having given that piece of information, I don't see a specific question
in your comment.
b. How to configure a port to create a new user when needed, for instance,
to run a daemon, as is the case with this port.
Take a look at pkg_create(1) @newuser. That needs to be added to
pkg/PLIST, like done in the attached port.
These have been the most challenging parts for me, and I find the
documentation unclear on these points.
It's quite spread over several manpages, so it's a bit confusing /
difficult at times.
This port has been tested on an amd64 platform. Unfortunately, I do not have
access to compatible machines with other architectures to conduct further
testing. If anyone is able to test the port on different platforms, I would
greatly appreciate it. I am currently using a virtual machine, as the only
computer I own with sufficient resources to compile this software in a
reasonable time frame is not compatible with OpenBSD.
Initially, I considered naming the port net/monero-cli since there is an
official GUI wallet. However, I decided to leave it as net/monero, as I
don't think the GUI wallet will be ported in the future due to the
dependencies that would also need to be ported. If I ever attempt to port a
GUI wallet, I would try with Feather Wallet, as it seems the most feasible
option given that it uses QT.
So, properly about David port, it's mostly fine, but
- it's uncommon to have things listed both in RDEPs and BDEPs, and in
this particular case all of the are actually LDEPs
I agree.
- you don't need the do-install target, cmake manages it fine
The modules used in OpenBSD ports handle so many tasks for you that, at
first, you might not realize you don't need to add instructions for
certain tasks because the module already takes care of them. The package
building infrastructure in OpenBSD is highly refined.
- you don't need gmake
According to the original project documentation, you do need it.
- I ran into a compilation error because hidapi was installed
Thanks, I didn't realize that. It might be because I built the software
using the "no-dev" CMake option.
About byteskeptical port:
- small detail, but REVISION isn't needed for an import
- ONLY_FOR_ARCHS is for things that actually don't build in the other
arches, not for things not tested in different arches
- upstream tarballs are preferred over GitHub-generated tarballs
- also the RDEPs and BDEPs that should be LDEPs and the do-install
target
- I run into some compilation error with this one too, but I don't want
to recompile it yet again. I believe it was a different one than the
David, but the issue is also present in here: if hidapi is detected
at configure-time, then the port fails compilation
- the patches for replacing {sprintf,strcat} with {snprintf,strncat} are
better suited for upstream, which benefits all the users
My tarball does the following:
- adds hidapi and miniupnp deps, as they are automatically picked up and
there isn't a sensible way to disable them, which means issue for
bulks (hidapi requires patching a source file)
- I do have a hardware wallet to try it out, but I haven't managed to
do so yet and is low in my priority list. I don't see much point in
having neither this nor the individual binaries as FLAVORs: OpenBSD
packages tend to be bulky and prefers something that works mostly
as expected for 80% of the users over saving space.
I think it would be beneficial to test this feature to ensure the port
provides 100% of the software's functionality.
- uses devel/readline instead of base's, as the latter results in broken
display (requires patching cmake files)
- disables liblzma, which is autodetected while looking for libunwind
(requires patching cmake files)
- disables the docs: I think they're only dev docs and nothing for
user-facing programs, and saves a dep on doxygen which tends to break
things
- dropped pkg/monerod.login. I'm currently at 38% of a full sync,
haven't run into issues with the defaults yet.
I think it would be great if you could provide updates on how it
performs once the blockchain is fully synchronized.
- don't install the example monerod.conf: it's 3 lines and the defaults
work
- OpenBSD tends to prefer /var/prog to /var/lib/prog, so the home for
_monerod is /var/monero (also means that the default location of the
blockchain is /var/monero/.bitmonero)
- I picked up UID 627 for _monerod. zarafa was replaced by kopano in
2017, so I think it should be safe to reuse it now.
- couldn't make libunwind work and pointing it to
How did you detect all these problems? What recommendations can you give
me to properly debug a port? I imagine it’s because you're a programmer,
while I’m merely a system administrator.
/usr/include/c++/v1/libunwind.h and libc++abi.so isn't enough:
Does anyone know why libunwind is not available on OpenBSD? I am
referring to the portable version, not the one included in Clang.
https://github.com/libunwind/libunwind
ld: warning: easylogging++.cc(easylogging++.cc.o:(el::base::utils::File::buildStrippedFilename(char
const*, char*, std::__1::basic_string<char, std::__1::char_traits<char>,
std::__1::allocator<char>> const&, unsigned long)) in archive
external/easylogging++/libeasylogging.a): warning: strcat() is almost always misused, please use
strlcat()
ld: error: undefined symbol: el::base::debug::StackTrace::generateNew()
referenced by stack_trace.cpp
stack_trace.cpp.o:(tools::log_stack_trace(char const*)) in
archive src/common/libcommon.a
ld: error: undefined symbol: el::base::debug::operator<<(std::__1::basic_ostream<char,
std::__1::char_traits<char>>&, el::base::debug::StackTrace const&)
referenced by stack_trace.cpp
stack_trace.cpp.o:(tools::log_stack_trace(char const*)) in
archive src/common/libcommon.a
but StackTrace::generateNew is behind a complex ifdef and I don't
feel we're missing out on much without it.
That's more than enough for a mail. Port attached. Bye.
Lucas
Thank you for your help! Hopefully this software can be added to the
OpenBSD ports tree before the next stable release.
diff refs/heads/master 9676c6688a222bd27c6b3fee2f9b2bee4297eea1
commit - 3e15eae7e00ea78227ed46a1a7153ce4d102ead1
commit + 9676c6688a222bd27c6b3fee2f9b2bee4297eea1
blob - 5104415dc091f405d9c26b9c73d49c1d2e7be77e
blob + 7ba9d8a70c4595b0489e10b1b6ccadcf749d2846
--- infrastructure/db/user.list
+++ infrastructure/db/user.list
@@ -135,7 +135,7 @@ id user group port
624 _noip _noip net/no-ip
625 _varnish _varnish www/varnish
626 _pound _pound www/pound
-#627 _zarafa _zarafa mail/zarafa/zarafa
+627 _monerod _monerod net/monero
628 _kamailio _kamailio telephony/kamailio
629 _avahi _avahi net/avahi
630 _victorialogs _victorialogs sysutils/victorialogs