mirror of
git://slackware.nl/current.git
synced 2024-12-28 09:59:53 +01:00
8761a17445
a/pkgtools-15.1-noarch-6.txz: Rebuilt. makepkg: fix chown to avoid warning. Not sure how this one got missed for so long. Thanks to lucabon. d/cmake-3.27.1-x86_64-1.txz: Upgraded. l/cfitsio-4.3.0-x86_64-1.txz: Upgraded. n/curl-8.2.1-x86_64-1.txz: Upgraded. This is a bugfix release. x/m17n-lib-1.8.3-x86_64-1.txz: Upgraded.
463 lines
16 KiB
Bash
463 lines
16 KiB
Bash
#!/bin/bash
|
|
# Copyright 1994, 1998, 2008 Patrick Volkerding, Moorhead, Minnesota USA
|
|
# Copyright 2003 Slackware Linux, Inc. Concord, CA USA
|
|
# Copyright 2009, 2015, 2017, 2018, 2019 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 2 Jul 15:32:14 UTC 2018
|
|
# Sort file lists and support SOURCE_DATE_EPOCH, for reproducibility.
|
|
#
|
|
# 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_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
|
|
|
|
unset MTIME
|
|
if [ -n "${SOURCE_DATE_EPOCH}" ]; then
|
|
MTIME="--clamp-mtime --mtime=@${SOURCE_DATE_EPOCH}"
|
|
fi
|
|
|
|
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} -cn"
|
|
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} -cn"
|
|
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
|
|
if [[ "$(uname -m)" =~ (x86_64|aarch64|riscv64) ]]; then
|
|
# Allow xz to determine how many threads to use:
|
|
COMPRESSOR="xz ${COMPRESS_OPTION} --threads=0 -c"
|
|
else
|
|
# Default to 2 threads on 32-bit platforms:
|
|
COMPRESSOR="xz ${COMPRESS_OPTION} --threads=2 -c"
|
|
fi
|
|
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
|
|
if [[ "$(uname -m)" =~ (x86_64|aarch64|riscv64) ]]; then
|
|
# Allow xz to determine how many threads to use:
|
|
COMPRESSOR="xz ${COMPRESS_OPTION} --threads=0 -c"
|
|
else
|
|
# Default to 2 threads on 32-bit platforms:
|
|
COMPRESSOR="xz ${COMPRESS_OPTION} --threads=2 -c"
|
|
fi
|
|
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)
|
|
# Escape some characters in symlink names:
|
|
find . -type l -printf "%p\t%l\n" | LC_COLLATE=C sort | sed 's,^\./,,; s,[ "#$&\x27()*;<>?[\\`{|~],\\&,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 ./ | LC_COLLATE=C sort | sed '2,$s,^\./,,' | tar --no-recursion $ACLS $XATTRS $MTIME -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 | cut -b3- | sed "s/^/WARNING: zero length file /g"
|
|
|
|
# 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
|