97a18768d7
If I have used a path with symlinks in it when changing directory to my build directory, what gets put in config.status as ac_pwd is that path, not a realpath version. That then propagates to ac_abs_to_builddir and to SYSTEMPLATE_PATH, which is what Makefile.am passes for the --o:sys_template_path option to coolwsd. To be on the safe side, do the tmpfonts dance both for the systemplate path that might include symlinks and for one that has been realpathed. Signed-off-by: Tor Lillqvist <tml@collabora.com> Change-Id: I7575120090986e6207497c5ce740aedd6075e48f
164 lines
6 KiB
Bash
Executable file
164 lines
6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# set -x
|
|
|
|
test $# -eq 2 || { echo "Usage: $0 <chroot template directory for system libs to create> <LO installation directory>"; exit 1; }
|
|
|
|
# No provision for spaces or other weird characters in pathnames. So sue me.
|
|
|
|
# First parameter is the pathname where this script will create the "systemplate" tree
|
|
CHROOT=$1
|
|
|
|
# Second parameter is the instdir directory of the LibreOffice installation to be used
|
|
INSTDIR=$2
|
|
|
|
test -d "$INSTDIR" || { echo "$0: No such directory: $INSTDIR"; exit 1; }
|
|
|
|
mkdir -p $CHROOT || exit 1
|
|
|
|
# For the tmpfonts we need to use the pathnames as used by the
|
|
# configure script, which does *not* look up realpaths, because the
|
|
# Makefile.am uses @SYSTEMPLATE_PATH@ which uses abs_top_builddir
|
|
# which uses ac_pwd which is not based on use of realpath.
|
|
CHROOT_AS_GIVEN=$CHROOT
|
|
|
|
# Resolve the real paths, in case they are relative and/or symlinked.
|
|
# INSTDIR_LOGICAL will contain the logical path, if there are symlinks,
|
|
# while INSTDIR is the physical one. Both will most likely be the same,
|
|
# except on systems that have symlinks in the path. We must create
|
|
# both paths (if they are different) inside the jail, hence we need both.
|
|
CHROOT=`cd $CHROOT && /bin/pwd`
|
|
INSTDIR_LOGICAL=`cd $INSTDIR && /bin/pwd -L`
|
|
INSTDIR=`cd $INSTDIR && /bin/pwd -P`
|
|
|
|
if [ ! `uname -s` = "FreeBSD" ]; then
|
|
CP=cp
|
|
REALPATH=realpath
|
|
LOCALBASE=usr/
|
|
else
|
|
CP=gcp
|
|
REALPATH=grealpath
|
|
LOCALBASE=usr/local/
|
|
fi
|
|
|
|
cd / || exit 1
|
|
|
|
(
|
|
# Produce a list of file names, one per line, that will be copied
|
|
# into the template tree of system files for the chroot jails.
|
|
|
|
# First essential files and shared objects
|
|
find etc/ld.so.* \
|
|
lib/ld-* lib64/ld-* \
|
|
lib/libnss_* lib64/libnss_* lib/*/libnss_* \
|
|
lib/libresolv* lib64/libresolv* lib/*/libresolv* \
|
|
var/cache/fontconfig \
|
|
etc/fonts \
|
|
usr/lib/locale/en_US.utf8 \
|
|
usr/lib/locale/C.UTF-8 \
|
|
usr/lib/locale/locale_archive \
|
|
usr/lib/*/nss/*.so \
|
|
usr/lib/*/libsqlite* \
|
|
usr/share/zoneinfo/* \
|
|
usr/share/liblangtag \
|
|
usr/share/hyphen \
|
|
-type f 2>/dev/null
|
|
|
|
find etc/fonts \
|
|
lib/ld-* lib64/ld-* \
|
|
lib/libnss_* lib64/libnss_* lib/*/libnss_* \
|
|
lib/libresolv* lib64/libresolv* lib/*/libresolv* \
|
|
usr/lib/*/libsqlite* \
|
|
-type l 2>/dev/null
|
|
|
|
# Go through the LO shared objects and check what system libraries
|
|
# they link to.
|
|
find $INSTDIR -name 'xpdfimport' |
|
|
while read file; do
|
|
ldd $file 2>/dev/null
|
|
done |
|
|
grep -v dynamic | cut -s -d " " -f 3 | grep -E '^(/lib|/usr)' | sort -u | sed -e 's,^/,,'
|
|
|
|
) |
|
|
|
|
# Can't use -l because then symlinks won't be handled well enough.
|
|
# This will now copy the file a symlink points to, but whatever.
|
|
cpio -p -d -L $CHROOT
|
|
|
|
# Link the dynamic files, replacing any existing.
|
|
rm -f $CHROOT/etc/copied
|
|
mkdir -p $CHROOT/etc/
|
|
for file in hosts nsswitch.conf resolv.conf passwd group host.conf timezone localtime
|
|
do
|
|
# echo "Linking/Copying /etc/$file"
|
|
# Prefer hard-linking, fallback to just copying (do *not* use symlinking because that would be relative to the jail).
|
|
# When copying, we must make sure that we copy the source and not a symlink. Otherwise, the source won't be accessible from the jail.
|
|
# In addition, we flag that at least one file is copied by creating the 'copied' file, so that we do check for updates.
|
|
ln -f `${REALPATH} /etc/$file` $CHROOT/etc/$file 2> /dev/null || (${CP} --dereference --preserve=all /etc/$file $CHROOT/etc/$file && touch $CHROOT/etc/copied) || echo "$0: Failed to link or copy /etc/$file"
|
|
done
|
|
|
|
# Link dev/random and dev/urandom to ../tmp/dev/.
|
|
# The jail then creates the random device nodes in its /tmp/dev/.
|
|
mkdir -p $CHROOT/dev
|
|
mkdir -p $CHROOT/tmp/dev
|
|
for file in random urandom
|
|
do
|
|
# This link is relative anyway, so can be symbolic.
|
|
ln -f ../tmp/dev/$file $CHROOT/dev/ 2> /dev/null || ln -f -s ../tmp/dev/$file $CHROOT/dev/ || echo "$0: Failed to link dev/$file"
|
|
done
|
|
|
|
# Create a relative symbolic link within systemplate that points from
|
|
# the path of $INSTDIR (as seen from the jail as an absolute path)
|
|
# to the /lo path, where the instdir of LO will really reside.
|
|
mkdir -p $CHROOT/lo
|
|
# In case the original path is different from
|
|
for path in $INSTDIR $INSTDIR_LOGICAL
|
|
do
|
|
# Create a symlink, as it's a relative directory path (can't be a hard-link).
|
|
INSTDIR_PARENT="$(dirname "$CHROOT/$path")"
|
|
mkdir -p $INSTDIR_PARENT
|
|
ln -f -s `${REALPATH} --relative-to=$INSTDIR_PARENT $CHROOT/lo` $CHROOT/$path
|
|
done
|
|
|
|
# A similar dance also for the directory where "temporary" fonts are
|
|
# stored. Such are downloaded from other servers based on a separate
|
|
# configuration file. They need to be accessible using the same
|
|
# pathname both in the ForKit process and in the Kit processes.
|
|
|
|
mkdir -p $CHROOT/tmpfonts
|
|
mkdir -p $CHROOT$CHROOT
|
|
ln -f -s `${REALPATH} --relative-to=$CHROOT$CHROOT $CHROOT/tmpfonts` $CHROOT$CHROOT
|
|
|
|
# To be safe we do this both for $CHROOT and $CHROOT_AS_GIVEN, in case they differ.
|
|
|
|
if [ "$CHROOT_AS_GIVEN" != "$CHROOT" ]; then
|
|
mkdir -p $CHROOT_AS_GIVEN/tmpfonts
|
|
mkdir -p $CHROOT_AS_GIVEN$CHROOT_AS_GIVEN
|
|
ln -f -s `${REALPATH} --relative-to=$CHROOT_AS_GIVEN$CHROOT_AS_GIVEN $CHROOT_AS_GIVEN/tmpfonts` $CHROOT_AS_GIVEN$CHROOT_AS_GIVEN
|
|
fi
|
|
|
|
# /usr/share/fonts needs to be taken care of separately because the
|
|
# directory time stamps must be preserved for fontconfig to trust
|
|
# its cache.
|
|
|
|
cd $CHROOT || exit 1
|
|
|
|
mkdir -p $LOCALBASE/share || exit 1
|
|
${CP} -r -p -L /${LOCALBASE}/share/fonts $LOCALBASE/share
|
|
|
|
if [ -h $LOCALBASE/share/fonts/ghostscript ]; then
|
|
mkdir $LOCALBASE/share/ghostscript || exit 1
|
|
${CP} -r -p -L /$LOCALBASE/share/ghostscript/fonts $LOCALBASE/share/ghostscript
|
|
fi
|
|
|
|
# Remove obsolete & unused bitmap fonts
|
|
find $LOCALBASE/share -name '*.pcf' | xargs rm -f
|
|
find $LOCALBASE/share -name '*.pcf.gz' | xargs rm -f
|
|
|
|
# Debugging only hackery to avoid confusion.
|
|
if test "z$ENABLE_DEBUG" != "z" -a "z$HOME" != "z"; then
|
|
echo "$0: Copying development users's fonts into systemplate"
|
|
mkdir -p $CHROOT/$HOME
|
|
test -d $HOME/.fonts && ${CP} -r -p -L $HOME/.fonts $CHROOT/$HOME
|
|
fi
|
|
|
|
exit 0
|