diff options
Diffstat (limited to 'testing/source/pkgtools/scripts/makepkg')
-rw-r--r-- | testing/source/pkgtools/scripts/makepkg | 452 |
1 files changed, 452 insertions, 0 deletions
diff --git a/testing/source/pkgtools/scripts/makepkg b/testing/source/pkgtools/scripts/makepkg new file mode 100644 index 00000000..f9241cb9 --- /dev/null +++ b/testing/source/pkgtools/scripts/makepkg @@ -0,0 +1,452 @@ +#!/bin/sh +# Copyright 1994, 1998, 2008 Patrick Volkerding, Moorhead, Minnesota USA +# Copyright 2003 Slackware Linux, Inc. Concord, CA USA +# Copyright 2009, 2015, 2017, 2018 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Mon May 21 18:31:20 UTC 2018 +# Add --compress option, usually used to change the preset compression level +# or block size. +# +# Tue Feb 13 00:46:12 UTC 2018 +# Use recent tar, and support storing POSIX ACLs and extended attributes. +# +# Tue Dec 12 21:55:59 UTC 2017 +# If possible, use multiple compression threads. +# +# Wed Sep 23 18:36:43 UTC 2015 +# Support spaces in file/directory names. <alphageek> +# +# Sun Apr 5 21:23:26 CDT 2009 +# Support .tgz, .tbz, .tlz, and .txz packages. <volkerdi> +# +# Fri Nov 26 13:53:36 GMT 2004 +# Patched to chmod 755 the package's root directory if needed, then restore +# previous permissions after the package has been created. <sw> +# +# Wed Mar 18 15:32:33 CST 1998 +# Patched to avoid possible symlink attacks in /tmp. + +CWD=$(pwd) + +umask 022 + +make_install_script() { + TAB="$(echo -e "\t")" + COUNT=1 + while :; do + LINE="$(sed -n "$COUNT p" $1)" + if [ "$LINE" = "" ]; then + break + fi + LINKGOESIN="$(echo "$LINE" | cut -f 1 -d "$TAB")" + LINKGOESIN="$(dirname "$LINKGOESIN")" + LINKNAMEIS="$(echo "$LINE" | cut -f 1 -d "$TAB")" + LINKNAMEIS="$(basename "$LINKNAMEIS")" + LINKPOINTSTO="$(echo "$LINE" | cut -f 2 -d "$TAB")" + echo "( cd $LINKGOESIN ; rm -rf $LINKNAMEIS )" + echo "( cd $LINKGOESIN ; ln -sf $LINKPOINTSTO $LINKNAMEIS )" + COUNT=$(expr $COUNT + 1) + done +} + +usage() { + cat << EOF + +Usage: makepkg package_name.tgz + (or: package_name.tbz, package_name.tlz, package_name.txz) + +Makes a Slackware compatible package containing the contents of the current +and all subdirectories. If symbolic links exist, they will be removed and +an installation script will be made to recreate them later. This script will +be called "install/doinst.sh". You may add any of your own ash-compatible +shell scripts to this file and rebuild the package if you wish. + +options: -l, --linkadd y|n (moves symlinks into doinst.sh: recommended) + -p, --prepend (prepend rather than append symlinks to an existing + doinst.sh. Useful to link libraries needed by programs in + the doinst.sh script) + -c, --chown y|n (resets all permissions to root:root 755 - not + generally recommended) + --threads <number> For xz/plzip compressed packages, set the max + number of threads to be used for compression. Only has an + effect on large packages. For plzip, the default is equal to + the number of CPU threads available on the machine. For xz, + the default is equal to 2 (due to commonly occuring memory + related failures when using many threads with multi-threaded + xz compression). + --compress <option> Supply a custom option to the compressor. + This will be used in place of the default, which is: -9 + --acls Support storing POSIX ACLs in the package. The resulting + package will not be compatible with pkgtools version < 15.0. + --xattrs Support storing extended attributes in the package. The + resulting package will not be compatible with pkgtools + version < 15.0. + +If these options are not set, makepkg will prompt if appropriate. +EOF +} + +TMP=/tmp # This can be a hole, but I'm going to be careful about file + # creation in there, so don't panic. :^) + +# Set maximum number of threads to use. By default, this will be the number +# of CPU threads: +THREADS="$(nproc)" + +# Set default compression option. +COMPRESS_OPTION="-9" + +# Parse options +unset ACLS XATTRS +while [ 0 ]; do + if [ "$1" = "--linkadd" -o "$1" = "-l" ]; then + if [ "$2" = "y" ]; then + LINKADD=y + elif [ "$2" = "n" ]; then + LINKADD=n + else + usage + exit 2 + fi + shift 2 + elif [ "$1" = "--chown" -o "$1" = "-c" ]; then + if [ "$2" = "y" ]; then + CHOWN=y + elif [ "$2" = "n" ]; then + CHOWN=n + else + usage + exit 2 + fi + shift 2 + elif [ "$1" = "-p" -o "$1" = "--prepend" ]; then + PREPEND=y + shift 1 + elif [ "$1" = "-threads" -o "$1" = "--threads" ]; then + THREADS="$2" + shift 2 + # xz has memory issues with threads it seems, so we'll use two threads by + # default unless we see that something else was user-selected: + XZ_THREADS_FORCED=yes + elif [ "$1" = "-compress" -o "$1" = "--compress" ]; then + COMPRESS_OPTION="$2" + shift 2 + elif [ "$1" = "--acls" ]; then + ACLS="--acls" + shift 1 + elif [ "$1" = "--xattrs" ]; then + XATTRS="--xattrs" + shift 1 + elif [ "$1" = "-h" -o "$1" = "-H" -o "$1" = "--help" -o $# = 0 ]; then + usage + exit 0 + else + break + fi +done + +PACKAGE_NAME="$1" +TARGET_NAME="$(dirname $PACKAGE_NAME)" +PACKAGE_NAME="$(basename $PACKAGE_NAME)" + +# Identify package extension and compression type to use: +if [ ! "$(basename $PACKAGE_NAME .tgz)" = "$PACKAGE_NAME" ]; then + EXTENSION="tgz" + COMPEXT="gz" + COMPRESSOR="gzip ${COMPRESS_OPTION} -c" + if ! which gzip 1> /dev/null 2> /dev/null ; then + echo "ERROR: gzip compression utility not found in \$PATH." + exit 3 + fi +elif [ ! "$(basename $PACKAGE_NAME .tar.gz)" = "$PACKAGE_NAME" ]; then + EXTENSION="tar.gz" + COMPRESSOR="gzip ${COMPRESS_OPTION} -c" + if ! which gzip 1> /dev/null 2> /dev/null ; then + echo "ERROR: gzip compression utility not found in \$PATH." + exit 3 + fi +elif [ ! "$(basename $PACKAGE_NAME .tbz)" = "$PACKAGE_NAME" ]; then + EXTENSION="tbz" + if which lbzip2 1> /dev/null 2> /dev/null ; then + COMPRESSOR="lbzip2 ${COMPRESS_OPTION} -c" + else + if which bzip2 1> /dev/null 2> /dev/null ; then + COMPRESSOR="bzip2 ${COMPRESS_OPTION} -c" + else + echo "ERROR: bzip2 compression utility not found in \$PATH." + exit 3 + fi + fi +elif [ ! "$(basename $PACKAGE_NAME .tar.bz2)" = "$PACKAGE_NAME" ]; then + EXTENSION="tar.bz2" + if which lbzip2 1> /dev/null 2> /dev/null ; then + COMPRESSOR="lbzip2 ${COMPRESS_OPTION} -c" + else + if which bzip2 1> /dev/null 2> /dev/null ; then + COMPRESSOR="bzip2 ${COMPRESS_OPTION} -c" + else + echo "ERROR: bzip2 compression utility not found in \$PATH." + exit 3 + fi + fi +elif [ ! "$(basename $PACKAGE_NAME .tlz)" = "$PACKAGE_NAME" ]; then + EXTENSION="tlz" + if which plzip 1> /dev/null 2> /dev/null ; then + COMPRESSOR="plzip ${COMPRESS_OPTION} --threads=${THREADS} -c" + else + echo "WARNING: plzip compression utility not found in \$PATH." + echo "WARNING: package will not support multithreaded decompression." + if which lzip 1> /dev/null 2> /dev/null ; then + COMPRESSOR="lzip ${COMPRESS_OPTION} -c" + else + echo "ERROR: lzip compression utility not found in \$PATH." + exit 3 + fi + fi +elif [ ! "$(basename $PACKAGE_NAME .tar.lz)" = "$PACKAGE_NAME" ]; then + EXTENSION="tar.lz" + if which plzip 1> /dev/null 2> /dev/null ; then + COMPRESSOR="plzip ${COMPRESS_OPTION} --threads=${THREADS} -c" + else + echo "WARNING: plzip compression utility not found in \$PATH." + echo "WARNING: package will not support multithreaded decompression." + if which lzip 1> /dev/null 2> /dev/null ; then + COMPRESSOR="lzip ${COMPRESS_OPTION} -c" + else + echo "ERROR: lzip compression utility not found in \$PATH." + exit 3 + fi + fi +elif [ ! "$(basename $PACKAGE_NAME .tar.lzma)" = "$PACKAGE_NAME" ]; then + EXTENSION="tar.lzma" + COMPRESSOR="lzma ${COMPRESS_OPTION} -c" + if ! which lzma 1> /dev/null 2> /dev/null ; then + echo "ERROR: lzma compression utility not found in \$PATH." + exit 3 + fi +elif [ ! "$(basename $PACKAGE_NAME .txz)" = "$PACKAGE_NAME" ]; then + EXTENSION="txz" + if [ ! "$XZ_THREADS_FORCED" = "yes" ]; then + # Two threads by default with xz due to memory failures on 32-bit. Not that + # it matters much... if upstream ever gets around to implementing multi- + # threaded decompression we'll revisit this default. :-D + COMPRESSOR="xz ${COMPRESS_OPTION} --threads=2 -c" + else + COMPRESSOR="xz ${COMPRESS_OPTION} --threads=${THREADS} -c" + fi + if ! which xz 1> /dev/null 2> /dev/null ; then + echo "ERROR: xz compression utility not found in \$PATH." + exit 3 + fi +elif [ ! "$(basename $PACKAGE_NAME .tar.xz)" = "$PACKAGE_NAME" ]; then + EXTENSION="tar.xz" + if [ ! "$XZ_THREADS_FORCED" = "yes" ]; then + # Two threads by default with xz due to memory failures on 32-bit. Not that + # it matters much... if upstream ever gets around to implementing multi- + # threaded decompression we'll revisit this default. :-D + COMPRESSOR="xz ${COMPRESS_OPTION} --threads=2 -c" + else + COMPRESSOR="xz ${COMPRESS_OPTION} --threads=${THREADS} -c" + fi + if ! which xz 1> /dev/null 2> /dev/null ; then + echo "ERROR: xz compression utility not found in \$PATH." + exit 3 + fi +else + EXTENSION="$(echo $PACKAGE_NAME | rev | cut -f 1 -d . | rev)" + echo "ERROR: Package extension .$EXTENSION is not supported." + exit 1 +fi + +TAR_NAME="$(basename $PACKAGE_NAME .$EXTENSION)" + +# Sanity check -- we can't make the package in the current directory: +if [ "$CWD" = "$TARGET_NAME" -o "." = "$TARGET_NAME" ]; then + echo "ERROR: Can't make output package in current directory." + exit 2 +fi + +echo +echo "Slackware package maker, version 3.14159265." +echo +echo "Searching for symbolic links:" +# Get rid of possible pre-existing trouble: +INST=$(mktemp $TMP/makepkg.XXXXXX) +find . -type l -printf "%p\t%l\n" | sed 's,^\./,, ; s, ,\\ ,g' | tee $INST +if [ ! "$(cat $INST)" = "" ]; then + echo + echo "Making symbolic link creation script:" + make_install_script $INST | tee doinst.sh +fi +echo +if [ ! "$(cat $INST)" = "" ]; then + if [ -r install/doinst.sh ]; then + echo "Unless your existing installation script already contains the code" + echo "to create these links, you should append these lines to your existing" + echo "install script. Now's your chance. :^)" + echo + echo "Would you like to add this stuff to the existing install script and" + echo -n "remove the symbolic links ([y]es, [n]o)? " + else + echo "It is recommended that you make these lines your new installation script." + echo + echo "Would you like to make this stuff the install script for this package" + echo -n "and remove the symbolic links ([y]es, [n]o)? " + fi + if [ ! "$LINKADD" ]; then + read LINKADD; + echo + else + echo $LINKADD + echo + fi + if [ "$LINKADD" = "y" ]; then + if [ -r install/doinst.sh ]; then + UPDATE="t" + if [ "$PREPEND" = "y" ]; then + touch install/doinst.sh + mv install/doinst.sh install/doinst.sh.shipped + cat doinst.sh > install/doinst.sh + echo "" >> install/doinst.sh + cat install/doinst.sh.shipped >> install/doinst.sh + rm -f install/doinst.sh.shipped + else + cat doinst.sh >> install/doinst.sh + fi + else + mkdir -p install + cat doinst.sh > install/doinst.sh + fi + echo + echo "Removing symbolic links:" + find . -type l -exec rm -v {} \; + echo + if [ "$UPDATE" = "t" ]; then + if [ "$PREPEND" = "y" ]; then + echo "Updating your ./install/doinst.sh (prepending symlinks)..." + else + echo "Updating your ./install/doinst.sh..." + fi + else + echo "Creating your new ./install/doinst.sh..." + fi + fi +else + echo "No symbolic links were found, so we won't make an installation script." + echo "You can make your own later in ./install/doinst.sh and rebuild the" + echo "package if you like." +fi +rm -f doinst.sh $INST +echo +echo "This next step is optional - you can set the directories in your package" +echo "to some sane permissions. If any of the directories in your package have" +echo "special permissions, then DO NOT reset them here!" +echo +echo "Would you like to reset all directory permissions to 755 (drwxr-xr-x) and" +echo -n "directory ownerships to root.root ([y]es, [n]o)? " +if [ ! "$CHOWN" ]; then + read CHOWN; + echo +else + echo $CHOWN + echo +fi +if [ "$CHOWN" = "y" ]; then + find . -type d -exec chmod -v 755 {} \; + find . -type d -exec chown -v root.root {} \; +fi + +# Ensure that the 'root' of the package is chmod 755 because +# the / of your filesystem will inherit these permissions. +# If it's anything tighter than 755 then bad things happen such as users +# not being able to login, users already logged in can no longer run commands +# and so on. +OLDROOTPERMS="$(find -name . -printf "%m\n")" +if [ $OLDROOTPERMS -ne 755 ]; then + echo "WARNING: $PWD is chmod $OLDROOTPERMS" + echo " temporarily changing to chmod 755" + chmod 755 . +fi + +echo "Creating Slackware package: ${TARGET_NAME}/${TAR_NAME}.${EXTENSION}" +echo +rm -f ${TARGET_NAME}/${TAR_NAME}.${EXTENSION} + +# HISTORICAL NOTE 2/2018: +# In the interest of maximizing portability of this script, we'll use find +# and sed to create a filelist compatible with tar-1.13, and then use a +# more modern tar version to create the archive. +# +# Other (but possibly less portable) ways to achieve the same result: +# +# Use the tar --transform and --show-transformed-names options: +# tar --transform "s,^\./\(.\),\1," --show-transformed-names $ACLS $XATTRS -cvf - . | $COMPRESSOR > ${TARGET_NAME}/${TAR_NAME}.${EXTENSION} +# +# Use cpio: +# find ./ | sed '2,$s,^\./,,' | cpio --quiet -ovHustar > ${TARGET_NAME}/${TAR_NAME}.tar + +# Create the package: +find ./ | sed '2,$s,^\./,,' | tar --no-recursion $ACLS $XATTRS -T - -cvf - | $COMPRESSOR > ${TARGET_NAME}/${TAR_NAME}.${EXTENSION} +ERRCODE=$? +if [ ! $ERRCODE = 0 ]; then + echo "ERROR: $COMPRESSOR returned error code $ERRCODE -- makepkg failed." + exit 1 +fi + +# Warn of zero-length files: +find . -type f -size 0c | while read file ; do + echo "WARNING: zero length file $(echo $file | cut -b3-)" +done + +# Warn of corrupt or empty gzip files: +find . -type f -name '*.gz' | while read file ; do + if ! gzip -t $file 1> /dev/null 2> /dev/null ; then + echo "WARNING: gzip test failed on $(echo $file | cut -b3-)" + else + if [ "$(gzip -l $file | tail -n 1 | tr -s ' ' | cut -f 3 -d ' ')" -eq 0 ]; then + echo "WARNING: $(echo $file | cut -b3-) is an empty gzipped file" + fi + fi +done + +# Some more handy warnings: +if [ -d usr/share/man ]; then + echo "WARNING: /usr/share/man (with possibly not gzipped man pages) detected" +fi + +if [ -d usr/share/info ]; then + echo "WARNING: /usr/share/info (with possibly not gzipped info pages) detected" +fi + +if find . | grep site_perl 1> /dev/null ; then + echo "WARNING: site_perl directory detected (this is fine for a local package build)" +fi + +# Restore the old permissions if they previously weren't chmod 755 +if [ $OLDROOTPERMS -ne 755 ]; then + echo + echo "Restoring permissions of $PWD to chmod $OLDROOTPERMS" + chmod $OLDROOTPERMS . +fi + +echo +echo "Slackware package ${TARGET_NAME}/${TAR_NAME}.${EXTENSION} created." +echo |