Re: Help with shlib
Alexander Hansen <[email protected]> Mon, 26 Jun 2017 08:46:10 -0700
| Newsgroups | gmane.os.apple.fink.devel |
|---|---|
| Message-ID | <[email protected]> |
> On Jun 25, 2017, at 17:39, Scott Hannahs <[email protected]> wrote: > >> >> On Jun 25, 2017, at 7:27 AM, Hanspeter Niederstrasser <[email protected]> wrote: >> >> On 6/24/17 5:19 PM, Scott Hannahs via Fink-devel wrote: >>> I need a bit of help with a fink package. I don’t fully understand the Shlibs: tag in a fink package. I am trying to create a package for a dynamic library. The library builds correctly. However it just builds the library as cryptopp.dylib in the midst of the source files. >>> The discussion of the SHLIBS tag in the packaging manual seems a bit obscure to me. >>> Here is the relevant part of the package as I have it now following another library package as a template. >>> NoSourceDirectory: True >>> CompileScript: make dynamic >>> InfoTest: << >>> TestScript: make test || exit2 >>> << >>> DocFiles: Install.txt License.txt Readme.txt >>> InstallScript: make install PREFIX=%i >>> SplitOff: << >>> Package: %N-shlibs >>> Files: << >>> lib/libcryptopp.dylib >>> << >>> Shlibs: << >>> %p/lib/libcryptopp.dylib 5.6.0 %n (>= 5.6.5-5) >>> << >>> << >>> SplitOff2: << >>> Package: %N-dev >>> Depends: %N-shlibs (= %v-%r) >>> BuildDependsOnly: true >>> Files: << >>> include >>> << >>> << >>> the package goes and build both the dylib and .a libraries, but has a problem installing them. The deb file does not pass authentication when I run fink in -m mode. >>> When I try to build with the -km flags, I get the following: >>> Validating .deb dir /sw/src/fink.build/root-libcryptopp-shlibs-5.6.5-13... >>> Error: Name '/sw/lib/libcryptopp.dylib' specified in Shlibs does not match install_name '/sw/src/fink.build/root-libcryptopp-5.6.5-13/sw/lib/libcryptopp.dylib' >>> Error: package contains the shared library >>> /sw/lib/libcryptopp.dylib >>> but the corresponding install_name and compatibility_version >>> %p/src/fink.build/root-libcryptopp-5.6.5-13/sw/lib/libcryptopp.dylib 5.6.0 >>> are not listed in the Shlibs field. See the packaging manual. >> >> Your Shlibs: field is OK given what the library is giving you, but the problem is that upstream is not handling their library in a useful way. >> >> 1) Their library is not versioned. It is named 'librcrypto.dylib', but should be 'libcrypto.N.dylib', where N is the library version (not necessarily the zipfile version). This can be fixed by modifying the makefile and adding $(LIB_MAJOR) to the install_name bits. >> >> 2) The makefile uses install_name_tool to change the install name of the library but uses $(DESTDIR) badly in setting the new -id of the library. This incorrectly adds the whole 'src/fink.build/root-...' mess to the install_name. Fix the makefile to only use LIBDIR when setting the install_name for the library. And tell upstream, because that is a basic error. >> >> 3) As far as I can tell, the Makefile fully supports DESTDIR, so you're probably better off using both DESTDIR=%d and PREFIX=%p in the install command (and not PREFIX=%i). >> >> 4) Fink convention is that if your library is libcryptopp.5.dylib, your package should be libcryptopp5-shlibs and libcryptopp5-dev. The base package (if non-library) can stay libcryptopp (no 5). >> >> Hanspeter > > Thanks, I have attempted this but I am not sure I understand what the install_name_tool actually does. I don’t think that it creates the ‘libcryptopp.N.dylib’ files themselves? But sets an internal name? > Correct. > Should I set the name to the correct ‘libcryptopp.N.dylib’ after the build and before the install? > You can even set it at the end of the install phase (i.e. somewhere in the InstallScript). > So do I need to modify the install phase to install the /sw/lib/libcryptopp.5.dylib file? Should it be a hard link to the libcryptopp.dylib or should that file not exist. > The preferred option is actually the reverse: real libcryptopp.5.dylib with libcryptopp.dylib as a symbolic link. > When there are two split off packages, I think I have the following > all packages: Install.txt License.txt Readme.txt in share/doc/libcryptopp5 > package: cryptest.exe in /bin testdata in share/libcryptopp/ headers in include/libcryptopp > package-shlib: lib/libcryptopp.5.dylib and libcryptopp.dylib (and maybe libcryptopp.a but I think I can delete it??) Ideally, package-shlibs should only contain the shared library/libraries and the DocFiles you noted earlier. > package-dev: headers in include/libcryptopp If libcryptopp.dylib is a symlink as I suggested above, it needs to go here. This structure helps us to have multiple versions of the library available for builds, since by swapping the -dev package we can change what -lFOO on a build line really points to. > > for some reason it tries to move instead of copy and it fails creating the shlibs folder structure. > > /bin/mv /sw/src/fink.build/root-libcryptopp5-5.6.5-16/sw/lib/libcryptopp.dylib /sw/src/fink.build/root-libcryptopp5-shlibs-5.6.5-16/sw/lib/ > mv: rename /sw/src/fink.build/root-libcryptopp5-5.6.5-16/sw/lib/libcryptopp.dylib to /sw/src/fink.build/root-libcryptopp5-shlibs-5.6.5-16/sw/lib/libcryptopp.dylib: No such file or directory > > -Scott > Moving rather than is intentional, since you aren’t supposed to have the same file provided by multiple splitoffs in a package build. We’d wind up with files duplicated between the main package and splitoffs, or we’d have to go back and delete them after the fact. Make sure that you didn’t declare it in multiple Files lines, and otherwise check what’s actually in the directory. -- Alexander Hansen, Ph.D. Fink User Liaison ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Fink-devel mailing list [email protected] List archive: https://sourceforge.net/p/fink/mailman/fink-devel Subscription management: https://lists.sourceforge.net/lists/listinfo/fink-devel