On 11/5/25 3:33 PM, Stefan Esser wrote:
Am 05.11.25 um 12:35 schrieb Jan Henrik Sylvester:
I do not think so. Line 3913 and following of portmaster explicitly removes / usr/local/lib/compat/pkg (in many cases):

[ -z "$temp" ] && temp=`find $LOCALBASE_COMPAT -type d -empty 2>/dev/ null`
if pm_isdir "$temp"; then
     pm_sv Deleting the empty $LOCALBASE_COMPAT
     pm_rmdir_s $temp
fi
unset temp

I have no idea why this was added by the original author, but I'm going
to remove that section. In fact /usr/local/lib/compat/pkg is neither
defined in the base system's mtree files, nor included anywhere in the
*.mk files, except for

I remember that it was just a convention of different tools like portmaster before pkgng was a thing and that it was created by these tools and not by the port system itself, but I may be wrong.

Now it is created by @dir lib/compat/pkg in /usr/ports/ports-mgmt/pkg/pkg-plist and it should not be deleted by anything else.

That is the reason for:

# rmdir /usr/local/lib/compat/pkg
# pkg create pkg
Creating package for pkg-2.4.1
pkg: dir '/usr/local/lib/compat/pkg' is missing
pkg: package creation failed

Of course, running portmaster and then 'pkg create pkg' can have the same effect (maybe depending on the flags of portmaster).

But the OP did have "pkg" not "pkg-static" in the posted log message,
which seems to indicate that it was actually output from "make package",
and that command makes pkg build the package from the contents of the
work/stage directory only, with no regard to the presence of compat/pkg
on the base system.

I did say that I used 'pkg create pkg-2.4.1' after upgrading pkg from 2.3.1_1 to 2.4.1 using portmaster.

There shouldn't be any directories below compat/pkg, and therefore a
depth check would not make a difference.

That is why I said 'probably' and 'I should stop looking'. There should not be a subdirectory, but if there is one, it will be deleted, but if there are two on the same level, they will not be deleted. Really weird behavior. And if you start looking for the same construct in other places in portmaster, some have depth (the version that is incompatible with for example GNU find), some have mindepth and maxdepth, and some have none. I am not sure if all of them are on purpose. For example, line 1779 looks dangerous too me. I would never write it like that, but maybe it is fine. In line 3897, the whole mechanism fails if there is an empty subdirectory, but at least it checks if $LOCALBASE_COMPAT is a directory, not if $temp is one like in line 3913. There are so many places that you really have to look hard to understand if they are 'safe'. That is mixed with code that simply cannot work, but does no harm like pm_sv I mentioned, which was probably meant to be used for verbose messages concerning non root use, but is used for extra verbose messages.

I have been using portmaster for many years and it still works well for some tasks, but I do not think anyone will put in the effort to clean it up and really fix it. Thank you for trying to keep it usable.

Best,
Jan Henrik

Reply via email to