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

Reply via email to