summaryrefslogtreecommitdiffstats
path: root/office/mupdf/mupdf.SlackBuild
blob: 488963b211088f615b7130876b0134913926b02e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#!/bin/bash

# Slackware build script for mupdf

# Originally written by Hubert Hesse (email removed).
# Heavily modified by B. Watson (urchlay@slackware.uk).

# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.

# 20230531 bkw: BUILD=2, actually use SLKCFLAGS.
# 20230117 bkw: update for 1.21.1.
# - Again, this script can't build older versions.
# - There's a gumbo-parser SlackBuild now, so build with it instead of
#   upstream's bundled version.
# - tesseract builds work, so make that an option.
# - Include pre-scaled PNG icons.

# 20201020 bkw: update for 1.18.0. See notes, below.
# 20200217 bkw: update for 1.16.1.
# 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.
# 20170621 bkw: fix build with -current's newer openjpeg, BUILD=2.
# 20170122 bkw: update for 1.10a.

# Notes for 1.18.0:
# - This script can no longer build older versions, too many changes.
# - Upstream *finally* supports building as a shared library, so I and
#   all other distro packagers can stop patching it... except the
#   shared lib is unversioned, which means upgrades would cause more
#   breakage than they should. So there's still some trickery here to
#   build a versioned solib.
# - I've got rid of the STATIC=yes option and now only build shared libs.
#   As a side effect, libmupdf-third is gone, but I've included a
#   placeholder so stuff that links with it, will work without patching.
# - gumbo (HTML parser) is now a hard dep. The source is bundled, so
#   there's no need to create a new gumbo SlackBuild, but it does mean
#   the mupdf shared lib has grown in size.
# - mupdf-gl uses freeglut. The version we have in 14.2 is new enough to
#   build with, but old enough that you can't copy text from mupdf-gl.
#   So we build the bundled version here.
# - API docs are now included in the package.
# - Now using upstream's icons, including scalable SVG.
# - Add missing doinst.sh
# - There's now the option to build with tesseract and leptonica,
#   but it's disabled in this script. I have yet to get it to
#   actually *do* anything other than fail to build (when using
#   upstream's tesseract/leptonica forks) or complain about being
#   unable to load eng.traineddata (using SBo tesseract/leptonica,
#   and yes eng.traineddata is fine). Until I work out what's wrong,
#   or upstream releases a new version, this script doesn't support
#   building with tesseract. Don't contact me about this before March
#   1, 2021, unless you actually have a patch that fixes it. After
#   that, if this message is still here, feel free to remind me to
#   revisit it.
# - Slackware 14.2's libcrypto (from openssl) is too old for mupdf,
#   and there's no bundled souce for it. So currently mupdf is being
#   built without libcrypto. Hope that's OK.

cd $(dirname $0) ; CWD=$(pwd)

PRGNAM=mupdf
VERSION=${VERSION:-1.21.1}
BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}

if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) ARCH=i586 ;;
    arm*) ARCH=arm ;;
       *) ARCH=$( uname -m ) ;;
  esac
fi

if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
  echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
  exit 0
fi

TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

if [ "$ARCH" = "i586" ]; then
  SLKCFLAGS="-O2 -march=i586 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi
set -e

# Building mupdf seems to work OK if an older version is installed,
# but I only tested 1.21.1 when 1.18.0 was installed (doesn't mean
# it works for all versions).
print_failed_message() {
  if pkg-config --exists mupdf; then
  cat 1>&2 <<EOF

**************************************************************************
* The build failed. This might have happened because you had an existing *
* (older) mupdf package installed. Run "removepkg mupdf" and try again.  *
**************************************************************************
EOF
  fi
  exit 1
}

# 20230117 bkw: tesseract builds work fine in 1.21.1, but tesseract
# doesn't get autodetected. Help it out a little.
TESS=no
[ "${TESSERACT:-yes}" = "yes" ] && pkg-config --exists tesseract && TESS=yes

rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION-source
tar xvf $CWD/$PRGNAM-$VERSION-source.tar.lz
cd $PRGNAM-$VERSION-source

chown -R root:root .
find -L .  -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \
        \! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} \+

# Hard-code the version number so it'll stop trying to use git to retrieve
# it and spewing harmless but scary 'fatal: Not a git repository' errors.
sed -i "/^VERSION/s,=.*,= $VERSION," Makefile

# 20230531 bkw: derp. Never did apply the flags...
sed -i "s,-O2,$SLKCFLAGS," Makerules

# As of 1.18.0, we don't actually have to patch the Makefile
# to do a versioned shared lib, but we do have to override some
# variables. SOMAJOR is the mupdf major and zero-padded minor version
# jammed together (e.g. 113 for 1.13.0, 203 for 2.3.0). SOMINOR is the
# mupdf micro version (e.g. 0 for 1.13.0).
SOMAJOR=$(echo $VERSION | cut -d. -f1-2 | sed -e 's,\.[0-9]$,0&,' -e 's,\.,,g')
SOMINOR=$(echo $VERSION | cut -d. -f3-  | sed 's,\.,,g' )
SOVER=$SOMAJOR.$SOMINOR

# Build against system libs instead of bundled ones, where possible.
# Upstream recommends using their bundled lcms2 and mujs, I'll go with that.
# Also, we *still* (in Slack 15.0) have to use the bundled freeglut
# to get copy/paste working in mupdf-gl.
# C++ (XCXXFLAGS) is only actually used if building with tesseract.
make verbose=yes \
  shared=yes \
  LIB_LDFLAGS="-shared -Wl,-soname -Wl,libmupdf.so.$SOMAJOR" \
  USE_SYSTEM_LIBS=yes \
  USE_SYSTEM_GLUT=no \
  tesseract=$TESS \
  build=release \
  prefix=/usr \
  libdir=/usr/lib$LIBDIRSUFFIX \
  mandir=/usr/man \
  docdir=/usr/doc/$PRGNAM-$VERSION \
  DESTDIR=$PKG \
  all install || print_failed_message

# bins and libs are already stripped.
gzip -9 $PKG/usr/man/man1/*.1

# 20230117 bkw: fix up the lib dir.
cd $PKG/usr/lib$LIBDIRSUFFIX
  # 20230117 bkw: AFAIK, we have to list every shared lib this one
  # depends on in the .pc file. This rather odd-looking bit of code
  # creates the list.
  PCLIBS="-lmupdf $(
    objdump -p libmupdf.so | \
       perl -ne 'next unless /NEEDED/;
                 chomp;
                 s,.* lib([^.]*)\.so.*,\1,;
                 print "-l$_ " unless /^(c|gcc_s)$/;'
  )"
  WITHTESS=WITHOUT
  echo "$PCLIBS" | grep -q ltesseract && WITHTESS=WITH
  echo "==> PCLIBS='$PCLIBS'"

  # 20230117 bkw: the library is versioned, but the filename isn't...
  chmod 755 libmupdf.so
  mv libmupdf.so libmupdf.so.$SOVER
  ln -s libmupdf.so.$SOVER libmupdf.so
  ln -s libmupdf.so.$SOVER libmupdf.so.$SOMAJOR

  # .pc file taken from debian and parameterized.
  mkdir -p pkgconfig/
  sed -e "s,@LIB@,lib$LIBDIRSUFFIX,g" \
      -e "s,@VERSION@,$VERSION,g" \
      -e "s,@PCLIBS@,$PCLIBS,g" \
      $CWD/$PRGNAM.pc > pkgconfig/$PRGNAM.pc

  # Historically, mupdf has included two libraries: libmupdf itself,
  # and libmupdf-third, containing all the bundled third party code
  # included with the source. In version >=1.18.0, when building a
  # shared lib, no libmupdf-third gets created (all the code ends up in
  # libmupdf.so). However, most projects that link with libmupdf expect
  # this library to exist. This will probably change in the future as
  # those projects get updated for the changes in mupdf, but for now,
  # to be compatible with older mupdf versions, we include an empty
  # libmupdf-third for stuff to link with.
  ar crs libmupdf-third.a
cd -

# Compatibility symlinks. Older versions, the binary is just "mupdf".
ln -s $PRGNAM-x11 $PKG/usr/bin/$PRGNAM
for i in x11 x11-curl gl; do
  [ -e $PKG/usr/bin/$PRGNAM-$i ] && \
    ln -s $PRGNAM.1.gz $PKG/usr/man/man1/$PRGNAM-$i.1.gz
done

# .desktop taken from debian and modified:
# - make it validate.
# - add mime types for cbz and xps.
mkdir -p $PKG/usr/share/applications
cat $CWD/$PRGNAM.desktop > $PKG/usr/share/applications/$PRGNAM.desktop

# Use shipped SVG icon, make PNGs at various sizes.
mkdir -p $PKG/usr/share/pixmaps $PKG/usr/share/icons/hicolor/scalable/apps
svg=docs/logo/mupdf-logo.svg
for i in 16 22 32 48 64 128; do
  px=${i}x${i}
  dir=$PKG/usr/share/icons/hicolor/$px/apps
  mkdir -p $dir
  rsvg-convert --width=$i --height=$i -o $dir/$PRGNAM.png $svg
done
cat $svg > $PKG/usr/share/icons/hicolor/scalable/apps/$PRGNAM.svg
ln -s ../icons/hicolor/48x48/apps/$PRGNAM.png $PKG/usr/share/pixmaps/$PRGNAM.png

# 'make install' already installed most of the docs.
cp -a CONTRIBUTORS docs/api $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild

mkdir -p $PKG/install
sed "s,@WITHTESS@,$WITHTESS," < $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh

cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE