273 lines
11 KiB
Bash
Executable file
273 lines
11 KiB
Bash
Executable file
#!/bin/bash
|
|
# Version: 0.5.7
|
|
# Copyright (c) 2005-2017:
|
|
# Darren 'Tadgy' Austin <darren (at) afterdark.org.uk>
|
|
# Licensed under the terms of the GNU General Public License version 3.
|
|
#
|
|
|
|
# Built package details.
|
|
PKG_NAME="cpan-modules"
|
|
PKG_VERSION="0.9.1"
|
|
PKG_BUILD="1"
|
|
PKG_TAG="_tadgy"
|
|
PKG_EXT="txz"
|
|
|
|
# Packages which must be installed to build.
|
|
BUILD_REQUIRED="perl openssl db48"
|
|
|
|
# Packages which must not be installed to build.
|
|
BUILD_CONFLICTS="$PKG_NAME"
|
|
|
|
|
|
#........1.........2.........3.........4.........5.........6.........7.........8.........9.........0.........1.........2.........3.....:...4
|
|
|
|
cd "$(cd "${BASH_SOURCE%/*}"; pwd -P)"
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
if [[ "$1" =~ ^-(-)?(f|force)$ ]]; then
|
|
BUILD_FORCE=1
|
|
elif [[ "$1" =~ ^-(-)?(n|no-cleanup)$ ]]; then
|
|
BUILD_NOCLEANUP=1
|
|
elif [[ "$1" =~ ^-(-)?(v|version)$ ]]; then
|
|
echo "NAME=\"$PKG_NAME\""
|
|
echo "VERSION=\"$PKG_VERSION\""
|
|
echo "BUILD=\"$PKG_BUILD$PKG_TAG\""
|
|
exit 0
|
|
else
|
|
echo "Usage: ${0##*/} [[-f|--force]|[-n|--no-cleanup]|[-v|--version]]"; exit 1
|
|
fi
|
|
shift
|
|
done
|
|
|
|
if (( "${BUILD_FORCE:-0}" != 1 )); then
|
|
check_installed() {
|
|
ls -1 /var/log/packages | grep -P "^\Q$1\E-([^-]*)-([^-]*)-([^-]*)$" >/dev/null 2>&1
|
|
return $?
|
|
}
|
|
for PKG in $BUILD_CONFLICTS; do
|
|
if check_installed "$PKG"; then
|
|
echo -e "\\033[1;31m${0##*/}: Conflicting package '$PKG' installed.\\033[0;39m"; exit 1
|
|
fi
|
|
done
|
|
for PKG in $BUILD_REQUIRED; do
|
|
if ! check_installed "$PKG"; then
|
|
echo -e "\\033[1;31m${0##*/}: Required package '$PKG' not installed.\\033[0;39m"; exit 1
|
|
fi
|
|
done
|
|
fi
|
|
|
|
declare BUILD_OS_$(grep "^ID=" /etc/os-release)
|
|
declare BUILD_OS_$(grep "^VERSION_ID=" /etc/os-release)
|
|
BUILD_WORKDIR="/tmp/pkg-build"
|
|
BUILD_ROOT="$BUILD_WORKDIR/$PKG_NAME"
|
|
BUILD_PREFIX="/opt"
|
|
BUILD_MAKEFLAGS="-j5"
|
|
case "${BUILD_ARCH:=$(uname -m)}" in
|
|
i[45]86)
|
|
BUILD_CFLAGS="-march=$BUILD_ARCH -mtune=i686 -O2"
|
|
PKG_ARCH="$BUILD_ARCH"
|
|
;;
|
|
i686)
|
|
BUILD_CFLAGS="-march=$BUILD_ARCH -mtune=pentium4 -O2"
|
|
PKG_ARCH="$BUILD_ARCH"
|
|
;;
|
|
x86_64|x86-64)
|
|
BUILD_CFLAGS="-march=x86-64 -mtune=core2 -O2 -fPIC"
|
|
BUILD_LIBDIRSUFFIX="64"
|
|
PKG_ARCH="x86_64"
|
|
;;
|
|
*)
|
|
echo -e "\\033[1;31m${0##*/}: $(uname -m): unsupported architecture.\\033[0;39m"; exit 1
|
|
;;
|
|
esac
|
|
PKG_STORE="/tmp/pkg-store/$BUILD_OS_ID$BUILD_LIBDIRSUFFIX-$BUILD_OS_VERSION_ID"
|
|
[[ -e /data/slackware/repo/source/build.options ]] && {
|
|
. /data/slackware/repo/source/build.options || exit 1
|
|
}
|
|
|
|
SRC_DIR="$(pwd)"
|
|
umask 0022 &&
|
|
rm -rf "$BUILD_ROOT" &&
|
|
mkdir -p -m 750 "$BUILD_WORKDIR" &&
|
|
mkdir -m 755 "$BUILD_ROOT" || exit 1
|
|
|
|
shopt -s extglob
|
|
|
|
# Force a prefix of /usr - otherwise scripts which are launched from within daemons
|
|
# don't get PERL5LIB set and can't find modules.
|
|
BUILD_PREFIX="/usr"
|
|
# Use vendor_perl as site_perl doesn't seem to be in the default @INC in Slackware.
|
|
BUILD_PERLLOC="vendor"
|
|
|
|
export PERL5LIB="$BUILD_ROOT/$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl5/${BUILD_PERLLOC}_perl"
|
|
|
|
# Special case: Socket6.
|
|
# This build fails when CCFLAGS is set to any value.
|
|
echo -e "\n\n\\033[1;32m***\n\\033[1;32m* Installing: Socket6 \n\\033[1;32m***\\033[0;39m" &&
|
|
PERL_MM_OPT="DESTDIR=\"$BUILD_ROOT\" INSTALLDIRS=\"$BUILD_PERLLOC\" \
|
|
INSTALL${BUILD_PERLLOC^^}ARCH=\"$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl5/${BUILD_PERLLOC}_perl\" \
|
|
INSTALL${BUILD_PERLLOC^^}BIN=\"$BUILD_PREFIX/bin\" \
|
|
INSTALL${BUILD_PERLLOC^^}LIB=\"$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl5/${BUILD_PERLLOC}_perl\" \
|
|
INSTALL${BUILD_PERLLOC^^}MAN1DIR=\"$BUILD_PREFIX/man/man1\" \
|
|
INSTALL${BUILD_PERLLOC^^}MAN3DIR=\"$BUILD_PREFIX/man/man3\" \
|
|
INSTALL${BUILD_PERLLOC^^}SCRIPT=\"$BUILD_PREFIX/bin\"" \
|
|
perl -MCPAN -e 'shell' <<EOF || exit 1
|
|
o conf build_requires_install_policy yes
|
|
o conf prerequisites_policy follow
|
|
o conf recommends_policy 1
|
|
o conf suggests_policy 0
|
|
o conf make_arg "$BUILD_MAKEFLAGS"
|
|
force install "Socket6"
|
|
EOF
|
|
|
|
# Set up for the MakeMaker way of doing things.
|
|
# See: http://perldoc.perl.org/ExtUtils/MakeMaker.html
|
|
export PERL_MM_OPT="CCFLAGS=\"$BUILD_CFLAGS\" OPTIMIZE=\"\" \
|
|
DESTDIR=\"$BUILD_ROOT\" \
|
|
INSTALLDIRS=\"$BUILD_PERLLOC\" \
|
|
INSTALL${BUILD_PERLLOC^^}ARCH=\"$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl5/${BUILD_PERLLOC}_perl\" \
|
|
INSTALL${BUILD_PERLLOC^^}BIN=\"$BUILD_PREFIX/bin\" \
|
|
INSTALL${BUILD_PERLLOC^^}LIB=\"$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl5/${BUILD_PERLLOC}_perl\" \
|
|
INSTALL${BUILD_PERLLOC^^}MAN1DIR=\"$BUILD_PREFIX/man/man1\" \
|
|
INSTALL${BUILD_PERLLOC^^}MAN3DIR=\"$BUILD_PREFIX/man/man3\" \
|
|
INSTALL${BUILD_PERLLOC^^}SCRIPT=\"$BUILD_PREFIX/bin\""
|
|
|
|
# Set up for the Module::Build way of doing things.
|
|
# See: http://perldoc.perl.org/Module/Build.html
|
|
# Note: sbin below is non-standard and used only by Mail:SPF at the moment.
|
|
export PERL_MB_OPT="--config ccflags=\"$BUILD_CFLAGS\" \
|
|
--destdir \"$BUILD_ROOT\" \
|
|
--installdirs \"$BUILD_PERLLOC\" \
|
|
--install_path arch=\"$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl5/${BUILD_PERLLOC}_perl\" \
|
|
--install_path bin=\"$BUILD_PREFIX/bin\" \
|
|
--install_path bindoc=\"$BUILD_PREFIX/man/man1\" \
|
|
--install_path lib=\"$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl5/${BUILD_PERLLOC}_perl\" \
|
|
--install_path libdoc=\"$BUILD_PREFIX/man/man3\" \
|
|
--install_path sbin=\"$BUILD_PREFIX/sbin\" \
|
|
--install_path script=\"$BUILD_PREFIX/bin\""
|
|
|
|
# Do the module installs.
|
|
IFS=$'\n'
|
|
for MOD in $(cat $SRC_DIR/modules.list | egrep -v '^[[:blank:]]*(#.*)*$'); do
|
|
MOD="${MOD%%*([[:space:]])#*}"
|
|
if [[ -z "$(perl -M$MOD -e0 2>&1)" ]]; then
|
|
echo -e "\n\n\\033[1;33m***\n\\033[1;33m* Skipping: $MOD - already installed\n\\033[1;33m***\\033[0;39m"
|
|
else
|
|
echo -e "\n\n\\033[1;32m***\n\\033[1;32m* Installing: Spcket6 \n\\033[1;32m***\\033[0;39m" &&
|
|
perl -MCPAN -e 'shell' <<EOF || exit 1
|
|
o conf build_requires_install_policy yes
|
|
o conf prerequisites_policy follow
|
|
o conf recommends_policy 1
|
|
o conf suggests_policy 0
|
|
o conf make_arg "$BUILD_MAKEFLAGS"
|
|
force install "$MOD"
|
|
EOF
|
|
fi
|
|
done
|
|
|
|
|
|
###############################################################################
|
|
# Nothing below this notice should be changed or removed without good reason! #
|
|
###############################################################################
|
|
|
|
HARDLINKS="$(find $BUILD_ROOT -type f -links +1)"
|
|
if [[ ! -z "$HARDLINKS" ]]; then
|
|
echo -e "\\033[1;31mFound hardlinked files:\\033[0;39m"
|
|
echo -e "\\033[1;31m$HARDLINKS\\033[0;39m"
|
|
exit 1
|
|
fi
|
|
|
|
find "$BUILD_ROOT" | xargs -r file | egrep "ELF.*(executable|shared object)" | cut -d: -f1 | xargs -r strip --strip-unneeded || exit 1
|
|
|
|
for DIR in "$BUILD_ROOT/$BUILD_PREFIX/share/man" "$BUILD_ROOT/usr/share/man" "$BUILD_ROOT/$BUILD_PREFIX/share/info" \
|
|
"$BUILD_ROOT/usr/share/info"
|
|
do
|
|
if [[ -e "$DIR" ]]; then
|
|
mkdir -p -m 755 "$BUILD_ROOT/$BUILD_PREFIX/${DIR##*/}" &&
|
|
cp -aR "$DIR/"* "$BUILD_ROOT/$BUILD_PREFIX/${DIR##*/}" &&
|
|
rm -rf "$DIR" || exit 1
|
|
fi
|
|
done
|
|
|
|
if [[ -e "$BUILD_ROOT/$BUILD_PREFIX/man" ]]; then
|
|
find "$BUILD_ROOT/$BUILD_PREFIX/man" -regextype posix-extended -type f -regex \
|
|
"^$BUILD_ROOT/$BUILD_PREFIX/man/([^/]*/)?(man.*)/(.*)\.([[:digit:]n]){1}([^.])*$" | xargs -r gzip -9 &&
|
|
find "$BUILD_ROOT/$BUILD_PREFIX/man" -type l -printf '
|
|
if [ -e "%h/%l.gz" ]; then
|
|
(cd "%h" && ln -sf "%l.gz" "%f.gz" && rm -f "%f") || exit 1
|
|
else
|
|
echo -e "\\033[1;31mDangling symlink: %p\\033[0;39m"; exit 1
|
|
fi\n' | bash -x || exit 1
|
|
fi
|
|
|
|
if [[ -e "$BUILD_ROOT/$BUILD_PREFIX/info" ]]; then
|
|
find "$BUILD_ROOT/$BUILD_PREFIX/info" -regextype posix-extended -type f -regex \
|
|
"^$BUILD_ROOT/$BUILD_PREFIX/info/(.*)(\.info){1}(-[[:digit:]]+)?$" | xargs -r gzip -9 &&
|
|
rm -f "$BUILD_ROOT/$BUILD_PREFIX/info/dir" &&
|
|
find "$BUILD_ROOT/$BUILD_PREFIX/info" -type l -printf '
|
|
if [ -e "%h/%l.gz" ]; then
|
|
(cd "%h" && ln -sf "%l.gz" "%f.gz" && rm -f "%f") || exit 1
|
|
else
|
|
echo -e "\\033[1;31mDangling symlink: %p\\033[0;39m"; exit 1
|
|
fi\n' | bash -x || exit 1
|
|
fi
|
|
|
|
if [[ -e "$BUILD_ROOT/$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl5" ]]; then
|
|
find "$BUILD_ROOT/$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl5" -name .packlist | xargs -r -I{} sed -ri {} -e "s:^$BUILD_ROOT::g" \
|
|
-e "s:^($BUILD_PREFIX|usr){1}/share:$BUILD_PREFIX:g" \
|
|
-e "s:^$BUILD_PREFIX/man/([^/]*/)?(man.*)/(.*)\.([[:digit:]n]){1}([^.])*$:$BUILD_PREFIX/man/\1\2/\3\.\4\5\.gz:g" \
|
|
-e "s:^$BUILD_PREFIX/info/dir::g" \
|
|
-e "s:^$BUILD_PREFIX/info/(.*)(\.info){1}(-[[:digit:]]+)?$:$BUILD_PREFIX/info/\1\2\3.gz:g" &&
|
|
find "$BUILD_ROOT" -name perllocal.pod | xargs -r rm || exit 1
|
|
# Note: These will fail if $BUILD_ROOT == /usr, but are required to clean up left over directories from perllocal.pod removal.
|
|
rmdir $BUILD_ROOT/usr/lib$BUILD_LIBDIRSUFFIX/perl5 # OK to fail
|
|
rmdir $BUILD_ROOT/usr/lib$BUILD_LIBDIRSUFFIX # OK to fail
|
|
rmdir $BUILD_ROOT/usr # OK to fail
|
|
fi
|
|
|
|
if [[ "$BUILD_PREFIX" =~ ^/opt/($PKG_NAME|$SRCFILE_NAME|$SRCDIR_NAME).* ]]; then
|
|
# /opt/<package> is a special case. Because the FHS requires everything to be
|
|
# contained in their own directory, make symlinks into the standard /opt dirs.
|
|
( cd "$BUILD_ROOT/opt" &&
|
|
for DIR in bin include info lib lib64 man sbin share; do
|
|
if [ -e "${BUILD_PREFIX##*/}/$DIR" ]; then
|
|
mkdir -m 755 "$DIR" &&
|
|
(cd "$DIR" && lndir -silent "../${BUILD_PREFIX##*/}/$DIR)") || exit 1
|
|
fi
|
|
done
|
|
) || exit 1
|
|
fi
|
|
|
|
mkdir -m 755 "$BUILD_ROOT/install" &&
|
|
for FILE in doinst.sh slack-{conflicts,desc,install,remove,required,suggests}; do
|
|
if [[ -e "$SRC_DIR/$FILE" ]]; then
|
|
egrep -v '^#|^$|-handy-ruler-' "$SRC_DIR/$FILE" | sed \
|
|
-e "s:%BUILD_PREFIX%:$BUILD_PREFIX:g" \
|
|
-e "s:%BUILD_LIBDIRSUFFIX%:$BUILD_LIBDIRSUFFIX:g" \
|
|
-e "s:%BUILD_OS_ID%:$BUILD_OS_ID:g" \
|
|
-e "s:%BUILD_OS_VERSION_ID%:$BUILD_OS_VERSION_ID:g" \
|
|
-e "s:%PKG_NAME%:$PKG_NAME:g" \
|
|
-e "s:%PKG_VERSION%:$PKG_VERSION:g" \
|
|
-e "s:%PKG_FILE_VERSION%:${PKG_VERSION//-/_}:g" \
|
|
-e "s:%PKG_ARCH%:$PKG_ARCH:g" \
|
|
-e "s:%PKG_BUILD%:$PKG_BUILD:g" \
|
|
-e "s:%PKG_TAG%:${PKG_TAG//-/_}:g" \
|
|
-e "s:%PKG_EXT%:$PKG_EXT:g" \
|
|
>"$BUILD_ROOT/install/$FILE" || exit 1
|
|
fi
|
|
done
|
|
|
|
cd "$BUILD_ROOT" &&
|
|
rm -f "$BUILD_WORKDIR/$PKG_NAME-${PKG_VERSION//-/_}-$PKG_ARCH-$PKG_BUILD${PKG_TAG//-/_}."* &&
|
|
makepkg -l y -p -c n "$BUILD_WORKDIR/$PKG_NAME-${PKG_VERSION//-/_}-$PKG_ARCH-$PKG_BUILD${PKG_TAG//-/_}.$PKG_EXT" &&
|
|
cat install/slack-desc >"$BUILD_WORKDIR/$PKG_NAME-${PKG_VERSION//-/_}-$PKG_ARCH-$PKG_BUILD${PKG_TAG//-/_}.txt" || exit 1
|
|
|
|
mkdir -p -m 755 "$PKG_STORE" &&
|
|
mv -b "$BUILD_WORKDIR/$PKG_NAME-${PKG_VERSION//-/_}-$PKG_ARCH-$PKG_BUILD${PKG_TAG//-/_}".{"$PKG_EXT",txt} "$PKG_STORE" || exit 1
|
|
|
|
if [[ "$BUILD_NOCLEANUP" != "1" ]]; then
|
|
rm -rf "$BUILD_ROOT"
|
|
fi
|
|
|
|
echo -e "\\033[1;32mPackage built:\n " \
|
|
"$(ls "$PKG_STORE/$PKG_NAME-${PKG_VERSION//-/_}-$PKG_ARCH-$PKG_BUILD${PKG_TAG//-/_}.$PKG_EXT")\\033[0;39m"
|