240 lines
9.3 KiB
Bash
Executable file
240 lines
9.3 KiB
Bash
Executable file
#!/bin/bash
|
|
# Version: 0.5.0
|
|
# Copyright (c) 2005-2016:
|
|
# Darren 'Tadgy' Austin <darren (at) afterdark.org.uk>
|
|
# Licensed under the terms of the GNU General Public License version 3.
|
|
#
|
|
# Required sources:
|
|
# FIXME
|
|
#
|
|
|
|
# Source file details.
|
|
SRCFILE_NAME=""
|
|
SRCFILE_DELIM=""
|
|
SRCFILE_VERSION=""
|
|
SRCFILE_EXT=""
|
|
|
|
# Unpacked source directory details.
|
|
SRCDIR_NAME="$SRCFILE_NAME"
|
|
SRCDIR_DELIM="$SRCFILE_DELIM"
|
|
SRCDIR_VERSION="$SRCFILE_VERSION"
|
|
|
|
# Built package details.
|
|
PKG_NAME="$(basename "$BASH_SOURCE" .SlackBuild)"
|
|
PKG_VERSION="${SRCFILE_VERSION:-$SRCDIR_VERSION}"
|
|
PKG_BUILD=""
|
|
PKG_TAG="_da"
|
|
PKG_EXT="txz"
|
|
|
|
# Packages which must be installed to build.
|
|
BUILD_REQUIRED=""
|
|
|
|
# Packages which must not be installed to build.
|
|
BUILD_CONFLICTS="$PKG_NAME"
|
|
|
|
|
|
#........1.........2.........3.........4.........5.........6.........7.........8.........9.........0.........1.........2
|
|
|
|
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
|
|
else
|
|
echo "Usage: ${0##*/} [-f|--force] [-n|--no-cleanup]"; exit 1
|
|
fi
|
|
shift
|
|
done
|
|
|
|
if [[ "$BUILD_FORCE" != "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 "${0##*/}: Conflicting package '$PKG' installed."; exit 1
|
|
fi
|
|
done
|
|
for PKG in $BUILD_REQUIRED; do
|
|
if ! check_installed "$PKG"; then
|
|
echo "${0##*/}: Required package '$PKG' not installed."; exit 1
|
|
fi
|
|
done
|
|
fi
|
|
|
|
declare BUILD_OS_$(grep "^ID=" /etc/os-release)
|
|
declare BUILD_OS_$(grep "^VERSION_ID=" /etc/os-release)
|
|
[[ -e ../build.options ]] && {
|
|
. ../build.options || exit 1
|
|
}
|
|
BUILD_WORKDIR="${BUILD_WORKDIR:-/tmp}/pkg-build"
|
|
BUILD_ROOT="$BUILD_WORKDIR/$PKG_NAME"
|
|
BUILD_PREFIX="${BUILD_PREFIX:-/usr}" # Slackware standard prefix.
|
|
BUILD_MAKEFLAGS="${BUILD_MAKEFLAGS:--j6}"
|
|
case "${BUILD_ARCH:=$(uname -m)}" in
|
|
i[45]86)
|
|
BUILD_CFLAGS="${BUILD_CFLAGS:--march=$BUILD_ARCH -mtune=${BUILD_TUNE:-i686} -O2}"
|
|
PKG_ARCH="$BUILD_ARCH"
|
|
;;
|
|
i686)
|
|
BUILD_CFLAGS="${BUILD_CFLAGS:--march=$BUILD_ARCH -mtune=${BUILD_TUNE:-pentium4} -O2}"
|
|
PKG_ARCH="$BUILD_ARCH"
|
|
;;
|
|
x86_64|x86-64)
|
|
BUILD_CFLAGS="${BUILD_CFLAGS:--march=x86-64 -mtune=${BUILD_TUNE:-core2} -O2 -fPIC}"
|
|
BUILD_LIBDIRSUFFIX="${BUILD_LIBDIRSUFFIX:-64}"
|
|
PKG_ARCH="x86_64"
|
|
;;
|
|
*)
|
|
echo "${0##*/}: ${BUILD_ARCH:-$(uname -m)}: unsupported architecture."; exit 1
|
|
;;
|
|
esac
|
|
PKG_STORE="$(cd ${PKG_STORE:-../../packages}; pwd -P)/$BUILD_OS_ID$BUILD_LIBDIRSUFFIX-$BUILD_OS_VERSION_ID"
|
|
|
|
SRC_DIR="$(pwd)"
|
|
umask 0022 &&
|
|
rm -rf "$BUILD_ROOT" "$BUILD_WORKDIR/$SRCDIR_NAME$SRCDIR_DELIM$SRCDIR_VERSION" &&
|
|
mkdir -p -m 750 "$BUILD_WORKDIR" &&
|
|
mkdir -m 755 "$BUILD_ROOT" || exit 1
|
|
|
|
case "$SRCFILE_EXT" in
|
|
tar.gz|tgz) SRCFILE_DECOMP="gzip" ;;&
|
|
tar.bz|tar.bz2|tbz) SRCFILE_DECOMP="bzip2" ;;&
|
|
tar.xz|tar.lz|txz|tlz) SRCFILE_DECOMP="lzma" ;;&
|
|
tar.*|tgz|tbz|txz|tlz) tar -xv "--$SRCFILE_DECOMP" -C "$BUILD_WORKDIR" \
|
|
-f "$SRC_DIR/$SRCFILE_NAME$SRCFILE_DELIM$SRCFILE_VERSION.$SRCFILE_EXT" || exit 1 ;;
|
|
zip|ZIP) unzip -d "$BUILD_WORKDIR" "$SRC_DIR/$SRCFILE_NAME$SRCFILE_DELIM$SRCFILE_VERSION.$SRCFILE_EXT" || exit 1 ;;
|
|
*) echo "${0##*/}: $SRCFILE_EXT: unknown archive format."; exit 1 ;;
|
|
esac
|
|
cd "$BUILD_WORKDIR/$SRCDIR_NAME$SRCDIR_DELIM$SRCDIR_VERSION" &&
|
|
chown -R root:root . &&
|
|
chmod -R go-w . || exit 1
|
|
|
|
# zcat $SRC_DIR/FIXME.patch.gz | patch -p0 || exit 1
|
|
|
|
CFLAGS="$BUILD_CFLAGS" CXXFLAGS="${BUILD_CXXFLAGS:-$BUILD_CFLAGS}" LDFLAGS="$BUILD_LDFLAGS" \
|
|
./configure --prefix="$BUILD_PREFIX" --libdir="$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX" \
|
|
--sysconfdir="/etc/$PKG_NAME" --localstatedir="/var" --mandir="$BUILD_PREFIX/man" \
|
|
--infodir="$BUILD_PREFIX/info" --docdir="$BUILD_PREFIX/doc/$PKG_NAME-$PKG_VERSION" \
|
|
--build="$PKG_ARCH-slackware-linux" --enable-shared --disable-static \
|
|
FIXME &&
|
|
make "$BUILD_MAKEFLAGS" &&
|
|
make "$BUILD_MAKEFLAGS" DESTDIR="$BUILD_ROOT" install || exit 1
|
|
|
|
mkdir -p -m 755 "$BUILD_ROOT/$BUILD_PREFIX/doc/$PKG_NAME-$PKG_VERSION" &&
|
|
cp FIXME \
|
|
"$BUILD_ROOT/$BUILD_PREFIX/doc/$PKG_NAME-$PKG_VERSION" || exit 1
|
|
|
|
# mkdir -p -m 755 "$BUILD_ROOT/etc/rc.d" &&
|
|
# cat "$SRC_DIR/rc.FIXME" | sed -e "s:%BUILD_PREFIX%:$BUILD_PREFIX:g" >"$BUILD_ROOT/etc/rc.d/rc.FIXME" &&
|
|
# chmod 755 "$BUILD_ROOT/etc/rc.d/rc.FIXME" || exit 1
|
|
|
|
# mkdir -p -m 755 "$BUILD_ROOT/etc/profile.d" &&
|
|
# for FILE in "$SRC_DIR/FIXME.{csh,sh}"; do
|
|
# cat "$FILE" | sed -e "s:%BUILD_PREFIX%:$BUILD_PREFIX:g" | sed -e "s:%BUILD_LIBDIRSUFFIX%:$BUILD_LIBDIRSUFFIX:g" \
|
|
# >"$BUILD_ROOT/etc/profile.d/${FILE##*/}" &&
|
|
# chmod 755 "$BUILD_ROOT/etc/profile.d/${FILE##*/}" || exit 1
|
|
# done
|
|
|
|
# mkdir -p -m 755 "$BUILD_ROOT/etc/logrotate.d" &&
|
|
# cat "$SRC_DIR/FIXME.logrotate" >"$BUILD_ROOT/etc/logrotate.d/FIXME" || exit 1
|
|
|
|
###############################################################################
|
|
# Nothing below this notice should be changed or removed without good reason! #
|
|
###############################################################################
|
|
|
|
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; \
|
|
elif [ ! -e "%h/%l" ]; then echo 'Dangling symlink: %p'; exit 1; fi\n' | bash || 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; \
|
|
elif [ ! -e "%h/%l" ]; then echo 'Dangling symlink: %p'; exit 1; fi\n' | bash || exit 1
|
|
fi
|
|
|
|
if ls "$BUILD_ROOT/$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl*" >/dev/null 2>&1; then
|
|
find "$BUILD_ROOT/$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl*" -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/$BUILD_PREFIX/lib$BUILD_LIBDIRSUFFIX/perl*" -name perllocal.pod | \
|
|
xargs -r -I{} mv {} {}.new || exit 1
|
|
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 '^#|^$' "$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 | egrep -v '^#|^$|^ ' | egrep "[[:alnum:]]+:" \
|
|
>"$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" "$BUILD_WORKDIR/$SRCDIR_NAME$SRCDIR_DELIM$SRCDIR_VERSION"
|
|
fi
|
|
|
|
echo
|
|
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"
|