From cf9c4254ca204146ef0475280bbfe8f977cac592 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Sat, 23 Jun 2018 16:27:58 -0400 Subject: office/mupdf: Add support for shared libraries. Signed-off-by: B. Watson --- office/mupdf/README | 4 +++ office/mupdf/README_shared.txt | 56 +++++++++++++++++++++++++++++++ office/mupdf/mupdf.SlackBuild | 34 +++++++++++++++---- office/mupdf/shared_libs.diff | 76 ++++++++++++++++++++++++++++++++++++++++++ office/mupdf/slack-desc | 4 +-- 5 files changed, 166 insertions(+), 8 deletions(-) create mode 100644 office/mupdf/README_shared.txt create mode 100644 office/mupdf/shared_libs.diff diff --git a/office/mupdf/README b/office/mupdf/README index 534f241278..9c57e36921 100644 --- a/office/mupdf/README +++ b/office/mupdf/README @@ -19,3 +19,7 @@ the script's environment. 2. Two mupdf executables are installed in /usr/bin. mupdf-x11 is the regular PDF viewer, and mupdf-x11-curl has support for fetching remote resources from the network (which may be considered a security risk). + +3. By default, mupdf is now built as shared libraries. If for some +reason you need static libs instead, build with STATIC=yes in the +script's environment. See README_shared.txt for more information. diff --git a/office/mupdf/README_shared.txt b/office/mupdf/README_shared.txt new file mode 100644 index 0000000000..227928d253 --- /dev/null +++ b/office/mupdf/README_shared.txt @@ -0,0 +1,56 @@ + +Here is a hopefully informative mini-rant about shared library support +for mupdf. + +Upstream doesn't do shared libraries and doesn't recommend distro +packages use them. This build used to follow that advice. However, +mupdf is just too large to use as a static library. We end up with a +47MB libmupdf.a, plus 7 33MB binaries. *Every* distro I've looked at +ships mupdf as shared libs, despite upstream's policy. + +A long time ago (in 2013), I used to patch mupdf for shared lib support, +but I removed it when it stopped applying cleanly. Thomas Morper on the +slackbuilds-users mailing list recently (2018) asked if I could include +a patch (from LFS) that adds shared library support, so starting with +mupdf 1.13.0, BUILD 2, we have shared libraries again. + +In case someone *really* disagrees with this change, I added a STATIC=yes +environment setting. If you use this, you get static libs and no +shared ones, per upstream's policy. This has been tested and works for +1.13.0-2, but be aware that I probably won't be testing static builds +for every mupdf release. If you run into trouble, email me and/or the +slackbuilds-users list. + +The library versioning scheme I had to use is unfortunate. The major +soname version is supposed to only change when there's an incompatible ABI +change. The way I'm doing it, it changes for every mupdf release [*]. This +is because upstream doesn't tell us when the ABI changes, because it's +not relevant for them. They support only static libs specifically to +avoid the headache of having to track and minimize ABI changes. Whenever +they want to change the ABI, they just do it. Anything built against the +old version will keep working fine, because it's statically linked. With +shared libs, I have to invent my own library versioning scheme. + +The end result of this is, I (humble packager) can't easily tell when +the ABI has changed, so I treat every release [*] as an ABI change. Means +anything linked with libmupdf will fail with 'cannot open shared object +file' after a mupdf upgrade, so it'll have to be rebuilt. The alternative +would be to use unversioned shared libs, which would (seem to) avoid +the need to rebuild... but whenever the undocumented ABI changed, we'd +get weird behaviour and segfaults instead of a clean error message. + +The shared library patch used here is by me (B. Watson), based on a +patch from Linux From Scratch. The original LFS patch doesn't include +versioned libs, I suspect becase in LFS you tend to upgrade the entire +OS by rebuilding it, instead of upgrading just one library. + +Right now, the only SBo builds affected by mupdf upgrades will be +zathura-pdf-mupdf and possibly fbpdf (if built with optional mupdf +support). Both have been tested with shared mupdf, and both compile and +run cleanly. + +[*] Actually, not micro-version point releases (e.g. 1.13.0 => 1.13.1). + Hopefully this doesn't cause a problem later. Upstream has just + switched to a major.minor.micro version scheme starting with 1.13.0, + so I don't know how often there will be micro-version bumps, and + whether or not they'll have ABI changes. diff --git a/office/mupdf/mupdf.SlackBuild b/office/mupdf/mupdf.SlackBuild index 1deac8ab10..bccd04f5cb 100644 --- a/office/mupdf/mupdf.SlackBuild +++ b/office/mupdf/mupdf.SlackBuild @@ -5,6 +5,10 @@ # Originally written by Hubert Hesse (email removed). # Heavily modified by B. Watson (yalhcru@gmail.com). +# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details. + +# 20180623 bkw: BUILD=2, add patch for dynamic linking. Thanks +# to Thomas Morper for pointing me in the right direction. # 20180615 bkw: update for 1.13.0, move old change comments to ChangeLog.old # 20180101 bkw: update for 1.12.0. # 20170711 bkw: update for 1.11. @@ -13,7 +17,7 @@ PRGNAM=mupdf VERSION=${VERSION:-1.13.0} -BUILD=${BUILD:-1} +BUILD=${BUILD:-2} TAG=${TAG:-_SBo} if [ -z "$ARCH" ]; then @@ -54,7 +58,7 @@ cd $PRGNAM-$VERSION-source # don't find/chown/chmod until after the thirdparty junk is removed. # Build against system libs instead of bundled ones. If we didn't do this, -# libmupdf.a would be useless for building anything else. +# libmupdf would be useless for building anything else. # Everything removed from thirdparty/ has to be installed systemwide, and must # either be a Slackware core pkg, or mentioned in REQUIRES= in the .info @@ -80,9 +84,9 @@ fi chown -R root:root . find -L . \ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \ - -exec chmod 755 {} \; -o \ + -exec chmod 755 {} \+ -o \ \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ - -exec chmod 644 {} \; + -exec chmod 644 {} \+ # ref https://bugs.ghostscript.com/show_bug.cgi?id=697175 sed -i '/#define *OPJ_STATIC/d' source/fitz/load-jpx.c @@ -91,6 +95,18 @@ sed -i '/#define *OPJ_STATIC/d' source/fitz/load-jpx.c # it and spewing harmless but scary 'fatal: Not a git repository' errors. sed -i "/^VERSION/s,=.*,= $VERSION," Makefile +# 20180623 bkw: Finally, dynamic linking again. Patch is based on +# http://www.linuxfromscratch.org/patches/blfs/svn/mupdf-1.13.0-shared_libs-1.patch +# but I added versioned sonames. See README_shared.txt for the gory details. +STATIC=${STATIC:-no} + +if [ "$STATIC" != "yes" ]; then + patch -p1 < $CWD/shared_libs.diff + LIBTYPE=shared +else + LIBTYPE=static +fi + make verbose=yes \ XCFLAGS="$SLKCFLAGS -DJBIG_NO_MEMENTO" \ HAVE_MUJS="$MUJS" \ @@ -128,6 +144,9 @@ ln -s $PRGNAM.1.gz $PKG/usr/man/man1/$PRGNAM-x11.1.gz # Installed permissions are atrocious (everything 755). find $PKG -type f | xargs chmod 644 chmod 755 $PKG/usr/bin/* +if [ "$STATIC" != "yes" ]; then + chmod 755 $PKG/usr/lib$LIBDIRSUFFIX/lib*.so.*.* +fi # .desktop taken from debian and modified: # - make it validate. @@ -153,9 +172,12 @@ sed -e "s,@LIB@,lib$LIBDIRSUFFIX,g" \ cp -a CONTRIBUTORS $PKG/usr/doc/$PRGNAM-$VERSION cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild -# slack-desc will conveniently say whether javascript is built in. +# slack-desc will conveniently say whether javascript is built in, +# and whether libs are shared or static. mkdir -p $PKG/install -sed "s,@WITH@,$WITH," < $CWD/slack-desc > $PKG/install/slack-desc +sed -e "s,@WITH@,$WITH," \ + -e "s,@LIBTYPE@,$LIBTYPE," \ + $CWD/slack-desc > $PKG/install/slack-desc cd $PKG /sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz} diff --git a/office/mupdf/shared_libs.diff b/office/mupdf/shared_libs.diff new file mode 100644 index 0000000000..465028f632 --- /dev/null +++ b/office/mupdf/shared_libs.diff @@ -0,0 +1,76 @@ +diff -Naur mupdf-1.13.0-source/Makefile mupdf-1.13.0-source.patched/Makefile +--- mupdf-1.13.0-source/Makefile 2018-04-12 09:14:06.000000000 -0400 ++++ mupdf-1.13.0-source.patched/Makefile 2018-06-23 15:24:50.242018433 -0400 +@@ -14,7 +14,7 @@ + # Do not specify CFLAGS or LIBS on the make invocation line - specify + # XCFLAGS or XLIBS instead. Make ignores any lines in the makefile that + # set a variable that was set on the command line. +-CFLAGS += $(XCFLAGS) -Iinclude ++CFLAGS += $(XCFLAGS) -Iinclude -fPIC + LIBS += $(XLIBS) -lm + + LIBS += $(FREETYPE_LIBS) +@@ -325,10 +325,10 @@ + + # --- Library --- + +-MUPDF_LIB = $(OUT)/libmupdf.a +-THIRD_LIB = $(OUT)/libmupdfthird.a +-THREAD_LIB = $(OUT)/libmuthreads.a +-PKCS7_LIB = $(OUT)/libmupkcs7.a ++MUPDF_LIB = $(OUT)/libmupdf.so ++THIRD_LIB = $(OUT)/libmupdfthird.so ++THREAD_LIB = $(OUT)/libmuthreads.so ++PKCS7_LIB = $(OUT)/libmupkcs7.so + + MUPDF_OBJ := \ + $(FITZ_OBJ) \ +@@ -355,12 +355,16 @@ + $(ZLIB_OBJ) \ + $(LCMS2_OBJ) + +-$(MUPDF_LIB) : $(MUPDF_OBJ) ++$(MUPDF_LIB) : $(MUPDF_OBJ) $(THIRD_LIB) $(THREAD_LIB) ++ $(LINK_CMD) -shared -Wl,-soname -Wl,libmupdf.so.$(SOMAJOR) -Wl,--no-undefined + $(THIRD_LIB) : $(THIRD_OBJ) ++ $(LINK_CMD) -shared -Wl,-soname -Wl,libmupdfthird.so.$(SOMAJOR) -Wl,--no-undefined + $(THREAD_LIB) : $(THREAD_OBJ) ++ $(LINK_CMD) -shared -Wl,-soname -Wl,libmuthreads.so.$(SOMAJOR) -Wl,--no-undefined -lpthread + $(PKCS7_LIB) : $(PKCS7_OBJ) ++ $(LINK_CMD) -shared -Wl,-soname -Wl,libmupkcs7.so.$(SOMAJOR) + +-INSTALL_LIBS := $(MUPDF_LIB) $(THIRD_LIB) ++INSTALL_LIBS := $(MUPDF_LIB) $(THIRD_LIB) $(THREAD_LIB) $(PKCS7_LIB) + + # --- Tools and Apps --- + +@@ -444,6 +448,14 @@ + + VERSION = $(shell git describe --tags) + ++# 20180623 bkw: major/minor/micro versions for shared library. ++# SOMAJOR is the mupdf major/minor version jammed together (e.g. 113 ++# for 1.13.0). ++# SOMINOR is the mupdf micro version (e.g. 0 for 1.13.0). ++SOMAJOR = $(shell echo $(VERSION) | cut -d. -f1-2 | sed 's,\.,,g' ) ++SOMINOR = $(shell echo $(VERSION) | cut -d. -f3- | sed 's,\.,,g' ) ++SOVER = $(SOMAJOR).$(SOMINOR) ++ + version: + sed -i~ -e '/FZ_VERSION /s/".*"/"'$(VERSION)'"/' include/mupdf/fitz/version.h + +@@ -482,7 +494,13 @@ + install include/mupdf/pdf/*.h $(DESTDIR)$(incdir)/mupdf/pdf + + install -d $(DESTDIR)$(libdir) +- install $(INSTALL_LIBS) $(DESTDIR)$(libdir) ++ install -s -m0755 $(INSTALL_LIBS) $(DESTDIR)$(libdir) ++ ( cd $(DESTDIR)$(libdir) ; \ ++ for i in $(INSTALL_LIBS); do \ ++ j=$$( basename $$i) ; \ ++ mv $$j $$j.$(SOVER) ; \ ++ ln -s $$j.$(SOVER) $$j ; \ ++ done ) + + install -d $(DESTDIR)$(bindir) + install $(INSTALL_APPS) $(DESTDIR)$(bindir) diff --git a/office/mupdf/slack-desc b/office/mupdf/slack-desc index 971925bfba..c04023860d 100644 --- a/office/mupdf/slack-desc +++ b/office/mupdf/slack-desc @@ -15,5 +15,5 @@ mupdf: the look of a printed page on screen. mupdf: mupdf: https://www.mupdf.com/ mupdf: -mupdf: This package was built @WITH@ JavaSscript support. -mupdf: +mupdf: This package was built @WITH@ JavaSscript support, and installs +mupdf: @LIBTYPE@ libraries. -- cgit v1.2.3-65-gdbad