Hi tech@,

I have been working recently on packaging a shared library for the
first time and hit a stumbling block yesterday.

$ make package
`/usr/ports/pobj/libwebsockets-1.5/fake-amd64/.fake_done' is up to date.
===>  Building package for libwebsockets-1.5
Create /usr/ports/packages/amd64/all/libwebsockets-1.5.tgz
reading plist|
Error: Invalid shared library @lib lib/libwebsockets.so.5

This error message made me think that I either generated the .so
incorrectly or that it's format is not a valid shared library. I went
to bed and tackled the issue again today.

Quick look at PkgCreate revealed that the error is generated by
PkgCreate in check_version:

 
https://github.com/lattera/openbsd/blob/master/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm#L618

The error is a result of $self->parse returning undef as it's result.
Parse resolves to:

 
https://github.com/lattera/openbsd/blob/master/usr.sbin/pkg_add/OpenBSD/PackingElement.pm#L659

and the result is just based on a regexp match & extract:
 $filename =~ m/^(.*?)\/?lib([^\/]+)\.so\.(\d+)\.(\d+)$/o

Now in my case after seeing the above it is obvious that the packaging
fails due to the lib not following lib$NAME.so.$major.$minor naming
scheme.

I would like to suggest a small change to the reported error to make
the cause of the problem more apparent.

Current : Error: Invalid shared library @lib lib/libwebsockets.so.5
Proposed: Error: Shared library name doesn't match
lib/lib$name.so.$major.$minor naming scheme @lib lib/libwebsockets.so.5

I did confirm that not existing files are handeled later on:

$ make package
`/usr/ports/pobj/libwebsockets-1.5/fake-amd64/.fake_done' is up to date.
===>  Building package for libwebsockets-1.5
Create /usr/ports/packages/amd64/all/libwebsockets-1.5.tgz
checksumming|**************************************************************************************
| 91%
Error: 
/usr/ports/pobj/libwebsockets-1.5/fake-amd64/usr/local/lib/libwebsockets.so.5.0
does not exist Fatal error: can't continue


of course the error message is just a suggestion, maybe someone can
come up with a better/less verbose one.

Here's the output after the patch:
# make package
`/usr/ports/pobj/libwebsockets-1.5/fake-amd64/.fake_done' is up to date.
===>  Building package for libwebsockets-1.5
Create /usr/ports/packages/amd64/all/libwebsockets-1.5.tgz
reading plist|
Error: Shared library name doesn't match lib/lib$name.so.$major.$minor
naming scheme @lib lib/libwebsockets.so.5

checking dependencies...
checksumming
Fatal error: can't continue
 at /usr/libdata/perl5/OpenBSD/PkgCreate.pm line 1543.
*** Error 1 in . (/usr/ports/infrastructure/mk/bsd.port.mk:1959
'/usr/ports/packages/amd64/all/libwebsockets-1.5.tgz') *** Error 1 in .
(/usr/ports/infrastructure/mk/bsd.port.mk:2511 '_internal-package') ***
Error 1 in /usr/ports/mystuff/devel/libwebsockets
(/usr/ports/infrastructure/mk/bsd.port.mk:2491 'package')


Small offtopic question before the patch:
I noticed that the regexp in PackingElement.pm uses the /o flag.
Actually a lot of regexp in pkg_add subtree use them. The perlre(1)
docs have this to say about this flag:

           Substitution-specific modifiers described in

           "s/PATTERN/REPLACEMENT/msixpodualgcer" in perlop are:
             o  - pretend to optimize your code, but actually introduce
           bugs

Quick search on perlmonks yields:
http://www.perlmonks.org/?node_id=256053

Guess it's mostly harmless just wanted to know if there are plans to
kill them off?

Error message patch:

Index: OpenBSD/PkgCreate.pm
===================================================================
RCS file: /cvs/src/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm,v
retrieving revision 1.118
diff -u -p -r1.118 PkgCreate.pm
--- OpenBSD/PkgCreate.pm        6 Nov 2015 08:53:12 -0000       1.118
+++ OpenBSD/PkgCreate.pm        11 Nov 2015 16:07:33 -0000
@@ -674,7 +674,7 @@ sub check_version
                        $state->error("Incorrectly versioned shared library: 
#1", $unsubst);
                }
        } else {
-               $state->error("Invalid shared library #1", $unsubst);
+               $state->error("Shared library name doesn't match 
lib/lib\$name.so.\$major.\$minor naming scheme #1", $unsubst);
        }
        $state->{has_libraries} = 1;
 }

Reply via email to