Skip to content

Instantly share code, notes, and snippets.

@lifeofguenter
Created May 22, 2016 18:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lifeofguenter/ad9e17f14e2f5140e770db4c2b797750 to your computer and use it in GitHub Desktop.
Save lifeofguenter/ad9e17f14e2f5140e770db4c2b797750 to your computer and use it in GitHub Desktop.
#!/bin/bash
##############################################################################
# $Id: checkinstall,v 1.6.3.1 2010/02/10 14:42:32 izto Exp $
# ########################
#
#
# CheckInstall v1.6.3
#
# Installs a compiled program from the program's source directory using
# "make install" or any other command supplied on checkinstall's command
# line. checkinstall will create a Slackware, RPM or Debian compatible package
# named after the source directory's name and install it using your standard
# package administration utilities.
#
# This version of checkinstall needs enough free space on the partition
# holding the temp dir (see BASE_TEMP_DIR below) to write there a temporary
# copy of the package.
#
# Copyright (C) 2010 Felipe Eduardo Sanchez Diaz Duran <izto@asic-linux.com.mx>
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the version 2 of the GNU General Public License
# as published by the Free Software Foundation
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
############################################################################
# Trap the INT signal (ctrl-c, for example)
trap trapint 2
CHECKINSTALL_VERSION=1.6.3
# locate the file or directory that the parameter corresponds to;
# always prints absolute path
function followlinks () {
local entry="$1"
local symlink
case "$entry" in /*) true ;;
*) entry="`pwd`/$entry";;
esac
if [ -L "$entry" ]; then
symlink=`ls -l "$entry" | sed -e 's/.* -> //'`
case "$symlink" in /*) entry="$symlink";;
*) entry=`dirname "$entry"`/$symlink;;
esac
followlinks "$entry"
else
echo "$entry"
fi
}
INSTALLDIR=`followlinks "$0"`
INSTALLDIR=`dirname "$INSTALLDIR"`/..
# gettext variables
export TEXTDOMAINDIR="$INSTALLDIR"/lib/checkinstall/locale
export TEXTDOMAIN=checkinstall
# .spec file path
DIRECTORIO_FUENTE=`pwd`
PKG_BASENAME="`basename "$DIRECTORIO_FUENTE"`"
SPEC_PATH=${PKG_BASENAME}.spec
#############################################################################
# Function definitions #
########################
# Enable alias expansion in command substitution
shopt -s expand_aliases
# Vefify that we have gettext available
gettext "Bye." &> /dev/null
if [ $? -gt 0 ]; then
alias ck_gettext="echo -e"
else
alias ck_gettext="gettext -s --"
fi
## gettext echo with newline at the end
function echog() {
local format="$1"
shift
printf -- "$(ck_gettext "$format")\n" "$@" >&2
}
## gettext echo with NO newline at the end
function echogn() {
local format="$1"
shift
printf -- "$(ck_gettext "$format")" "$@" >&2
}
function ckversion {
echo
echo "checkinstall $CHECKINSTALL_VERSION, Copyright 2010 Felipe Eduardo Sanchez Diaz Duran"
echog " This software is released under the GNU GPL."
}
function usage() {
# If the user has a default pager defined in the PAGER environment variable,
# we'll use that. If not, we'll use "more".
! [ "$PAGER" ] && PAGER=more
echo
echog "Usage: checkinstall [options] [command [command arguments]]"
echog "Options:"
echo
echog "*Package type selection*"
echo
echog "-t,--type=<slackware|rpm|debian> Choose packaging system"
echog "-S Build a Slackware package"
echog "-R Build a RPM package"
echog "-D Build a Debian package"
echo
echog "*Install options*"
echo
echog "--install=<yes|no> Toggle created package installation"
echog "--fstrans=<yes|no> Enable/disable the filesystem translation code"
echo
echog "*Scripting options*"
echo
echog "-y, --default Accept default answers to all questions"
echog "--pkgname=<name> Set name"
echog "--pkgversion=<version> Set version"
echog "-A, --arch, --pkgarch=<arch> Set architecture"
echog "--pkgrelease=<release> Set release"
echog "--pkglicense=<license> Set license"
echog "--pkggroup=<group> Set software group"
echog "--pkgsource=<source> Set source location"
echog "--pkgaltsource=<altsource> Set alternate source location"
echog "--pakdir=<directory> The new package will be saved here"
echog "--maintainer=<email addr> The package maintainer (.deb)"
echog "--provides=<list> Features provided by this package"
echog "--requires=<list> Features required by this package"
echog "--conflicts=<list> Packages that this package cannot be installed with (.deb)"
echog "--replaces=<list> Packages that this package replaces (.deb)"
echog "--rpmflags=<flags> Pass this flags to the rpm installer"
echog "--rpmi Use the -i flag for rpm when installing a .rpm"
echog "--rpmu Use the -U flag for rpm when installing a .rpm"
echog "--dpkgflags=<flags> Pass this flags to the dpkg installer"
echog "--spec=<path> .spec file location"
echog "--nodoc Do not include documentation files"
echo
echog "*Info display options*"
echo
echog "-d<0|1|2> Set debug level"
echog "-si Run an interactive install command"
echog "--showinstall=<yes|no> Toggle interactive install command"
echog "-ss Run an interactive Slackware installation script"
echog "--showslack=<yes|no> Toggle interactive Slackware installation script"
echo
echog "*Package tuning options*"
echo
echog "--autodoinst=<yes|no> Toggle the creation of a doinst.sh script"
echog "--strip=<yes|no> Strip any ELF binaries found inside the package"
echog "--stripso=<yes|no> Strip any ELF binary libraries (.so files)"
echog "--addso=<yes|no> Search for any shared libs and add"
echog " them to /etc/ld.so.conf"
echog "--reset-uids=<yes|no> Reset perms for all files/dirs to 755 and"
echog " the owner/group for all dirs to root.root"
echog "--gzman=<yes|no> Compress any man pages found inside the package"
echog "--docdir=<path> Where to put documentation files"
echog " The package name+version gets automatically appended."
echog " To avoid that prefix the path with a colon (:)."
echog "--umask=<mask> Set the umask value"
echog "--exclude=<file|dir[,...]> Exclude these files/directories from the package"
echog "--include=<listfile> Force the inclusion in the package of the"
echog " files/dirs listed in \"listfile\""
echog "--inspect Inspect the package's file list"
echog "--review-spec Review the spec file before creating a .rpm"
echog "--review-control Review the control file before creating a .deb"
echog "--newslack Use the new (8.1+) Slackware description format"
echog " (\"--newslack\" implies \"-S\")"
echog "--with-tar=/path/to/tar Manually set the path to the tar binary"
echog " in this system"
echo
echog "*Cleanup options*"
echo
echog "--deldoc=<yes|no> Delete doc-pak upon termination"
echog "--deldesc=<yes|no> Delete description-pak upon termination"
echog "--delspec=<yes|no> Delete spec file upon termination"
echog "--bk Backup any overwritten files"
echog "--backup=<yes|no> Toggle backup"
echo
echog "*About CheckInstall*"
echo
echog "--help, -h Show this message"
echog "--copyright Show Copyright information"
echog "--version Show version information"
echo
exit 1
}
function help_notice() {
echo
echog "Use --help or -h to get more information"
echo
exit 1
}
function boolean_usage() {
echo
echog "%s is an invalid value for %s" "$2" "$1"
help_notice
exit 1
}
# 001117-BaP: Define a function or two
function yorn {
if [ "$1" ]; then # If there is no default value specified
DEFAULTYN="$1" # then the default is "y"
else
DEFAULTYN="y"
fi
DEFAULTYN=`echo $DEFAULTYN | tr 'A-Z' 'a-z'`
if [ "$DEFAULTYN" = "y" ]; then
echo -n " [y]: " # Print the default option
else
echo -n " [n]: "
fi
if [ $ACCEPT_DEFAULT -eq 0 ]; then # Should we accept all the defaults?
read YN
YN=`echo $YN | tr 'A-Z' 'a-z'`
! [ "$YN" ] && YN=$DEFAULTYN # If the user pressed ENTER then
else
YN=$DEFAULTYN
echo $YN
fi
if [ "$YN" = "y" ] ;then # We return something useful for a
return 0 # simpler sintax ahead (12/dic/2000-Izto)
else
return 1
fi
}
# dec/10/2000-Izto
# Prints OK or FAILED! depending on previous command return value
function okfail () {
if [ $? -gt 0 ]; then
echog ' FAILED!'
return 1
else
echog 'OK'
return 0
fi
}
function restore_backup {
# If we have translation turned on then we didn't do a backup
if [ "${TRANSLATE}" = "1" ]; then return 0; fi
# Else, restore the backup if it exists
rm -rf ${TMP_DIR}/BACKUP/no-backup &> /dev/null
ls ${TMP_DIR}/BACKUP/* &> /dev/null
if [ $? -eq 0 ]; then
echogn "Restoring overwritten files from backup..."
cd ${TMP_DIR}/BACKUP
files=$(ls -A)
$TAR -cpf - $files | $TAR -f - -xvpC / &> /dev/null
okfail
echo
fi
}
function trapint {
echo
echo
echog "*** SIGINT received ***"
cleanup
}
function cleanup {
echo
restore_backup
echogn "Cleaning up..."
cd "$DIRECTORIO_FUENTE"
[ -n "${BUILDROOT}" ] && [ -d ${BUILDROOT} ] && rm -rf "${BUILDROOT}"
if [ "$DEBUG" -eq 0 ]; then
[ -n "${TMP_DIR}" ] && [ -d ${TMP_DIR} ] && rm -rf ${TMP_DIR}
rm -f checkinstall-debug*
else
echogn "(Debugging mode on, KEEPING temp dir $TMP_DIR)..."
fi
[ -n "${RPMSOURCEDIR}" ] &&
[ -f "${RPMSOURCEDIR}/SOURCES/${PKG_BASENAME}.tgz" ] &&
rm -f "${RPMSOURCEDIR}/SOURCES/${PKG_BASENAME}.tgz"
# If we had a pre-existing postinstall-pak, we keep it as it was.
if [ -f "${DIRECTORIO_FUENTE}/postinstall-pak.tmp" ]; then
mv "${DIRECTORIO_FUENTE}/postinstall-pak.tmp" "${DIRECTORIO_FUENTE}/postinstall-pak"
fi
true; okfail
echo
echog "Bye."
echo
exit 1
}
# Function to copy a directory with permissions, honours setuid, setgid,
# sticky bits, owner, group etc.
#
# A bit lengthy and slow but very few directories in the largest of
# packages have to be copied like this.
function dircopy() {
src_dir="$1" dest_dir="$2"
getflags() {
col=$1 dir="$2"
permissions="`ls -ld "$dir" | awk '{print $1}'`"
mask="."
bit=2
while [ $bit -lt $col ]; do mask="$mask."; bit=`expr $bit + 1`; done
mask="$mask\(.\)"
bit=$col
while [ $bit -lt 10 ]; do mask="$mask."; bit=`expr $bit + 1`; done
permission="`echo $permissions | sed "s/$mask/\1/" | grep -v -- '-'`"
case "$permission" in
s) echo "xs";; S) echo "s";; t) echo "xt";; T) echo "t";;
*) echo $permission;;
esac
}
col=2 chmod_args=""
set=u flags=""
while [ $col -le 4 ]; do
flags="$flags`getflags $col "$src_dir"`"; col=`expr $col + 1`
done
[ -n "$flags" ] && {
chmod_args="$set+$flags"
}
set=g flags=""
while [ $col -le 7 ]; do
flags="$flags`getflags $col "$src_dir"`"; col=`expr $col + 1`
done
[ -n "$flags" ] && {
[ -n "$chmod_args" ] && chmod_args="$chmod_args,"
chmod_args="$chmod_args$set+$flags"
}
set=o flags=""
while [ $col -le 10 ]; do
flags="$flags`getflags $col "$src_dir"`"; col=`expr $col + 1`
done
[ -n "$flags" ] && {
[ -n "$chmod_args" ] && chmod_args="$chmod_args,"
chmod_args="$chmod_args$set+$flags"
}
[ -d "$dest_dir" ] || {
mkdir -p "$dest_dir"
chmod 700 "$dest_dir"
}
[ -n "$chmod_args" ] && chmod $chmod_args "$dest_dir"
chown "`ls -ld "$src_dir" | awk '{print $3}'`" "$dest_dir"
chgrp "`ls -ld "$src_dir" | awk '{print $4}'`" "$dest_dir"
}
#
# Read spec file if it exists or (pre)set variables if they don't exist
#
function getparameter () {
RES=`egrep "$1" < ${SPEC_PATH} \
| cut -f2 -d: | sed 's/^ *//g' | sed 's/ *$//g' `
shift
echo "$RES" | sed 's/^ *//g' | sed 's/ *$//g'
}
# This function is used to properly escape shell commands, so
# we don't interpret the install command twice. This is useful
# for making commands like 'make CC="gcc -some -options" install'
# work as expected.
function shell_escape() {
for str in "$@" ; do
echo -n "\"$str\" "
done;
echo
}
# Output all the parents of the files given as arguments to stdout. Remove
# duplicates.
function list_parents {
src="$*"
files=`for f in $src; do
echo "$f" | awk '
BEGIN{
FS = "/"
}
{
for (i=1;i<NF;i++){
for (j=1;j<=i;j++){
printf "%s",$(j)
if (j != i){
printf "/"
}
}
printf " "
}
}'
done`
echo "${files}" | tr ' ' '\n' | uniq | tr '\n' ' '
return $?
}
# Copy some file ($1) whose path is given relatively to some root ($2) to a
# destination ($3). If --deref-parents appear as first argument, then symlink
# parents will not be copied as symlinks but as ordinary directories. All
# permissions are preserved. The directories the source file was in are
# preserved up to the root. The files that were copied are displayed on stdout
function copy_dir_hierarchy {
deref_parents=0
if [ `echo "${1}" | egrep '^--deref-parents'` ]; then
deref_parents=1
shift
fi
src="${1}"
root="${2}"
dest="${3}"
# All directories the file is in, e.g if src is
# ./usr/local/lib/installwatch.so, then files will be . ./usr ./usr/local
# ./usr/local/lib
files=`list_parents ${src}`
# Only use tar if there are parents
echo "${files}" | egrep '[^[:space:]]' >/dev/null
if [ $? -eq 0 ]; then
if [ deref_parents -eq 1 ]; then
# Add the -h option to the tar command for dereferencing
$TAR --no-recursion -C "${root}" -cphf - $files | $TAR -f - -xvpC \
"${dest}"
else
$TAR --no-recursion -C "${root}" -cpf - $files | $TAR -f - -xvpC \
"${dest}"
fi
fi
$TAR -C "${root}" -cpf - $src | $TAR -f - -xvpC \
"${dest}"
return $?
}
#################################
# Function definition ends here #
#############################################################################
# Show the version information
ckversion
echo
CHECKINSTALLRC=${CHECKINSTALLRC:-${INSTALLDIR}/checkinstallrc}
if ! [ -f $CHECKINSTALLRC ]; then
echog "The checkinstallrc file was not found at:\n$CHECKINSTALLRC"
echo
echog "Assuming default values."
else
# Get our default settings from the rc file
source $CHECKINSTALLRC
fi
# Arguments parsing
CKNAME=`basename "$0"`
PARAMS=`getopt -a -n $CKNAME -o +d:DA:t:RShHy -l arch:,type:,si,showinstall::,ss,showslack::,deldoc::,delspec::,deldesc::,strip::,addso::,install::,stripso::,gzman::,bk,backup::,autodoinst::,reset-uids::,fstrans::,spec:,exclude:,include:,pkgname:,pkgversion:,pkgrelease:,pkglicense:,pkggroup:,pkgsource:,pkgaltsource:,pakdir:,docdir:,requires:,provides:,conflicts:,replaces:,maintainer:,dpkgflags:,rpmflags:,pkgarch:,umask:,with-tar:,inspect,review-spec,review-control,newslack,help,nodoc,rpmi,rpmu,version,copyright,default -- "$@"`
[ $? -gt 0 ] && help_notice
eval set -- $PARAMS
while [ "$1" != "--" ]; do
case "$1" in
-h|-H|--help)
usage;;
-d)
shift
case `eval echo $1` in
0) DEBUG=0;;
1|'') DEBUG=1;;
2) DEBUG=2;;
3) DEBUG=3;;
4) DEBUG=4;;
*)
boolean_usage "-D" $1
esac
;;
-A|--arch|--pkgarch)
shift
ARCHITECTURE=`eval echo $1`
;;
--umask)
shift
CKUMASK=`eval echo $1`
;;
--pkgname)
shift
NAME=`eval echo $1`
;;
--pkgversion)
shift
VERSION=`eval echo $1`
;;
--pkgrelease)
shift
RELEASE=`eval echo $1`
;;
--pkglicense)
shift
LICENSE=`eval echo $1`
;;
--pkggroup)
shift
# note: we use PKG_GROUP instead of GROUP since (t)csh sets GROUP.
PKG_GROUP=`eval echo $1`
;;
--pkgsource)
shift
SOURCE=`eval echo $1`
;;
--pkgaltsource)
shift
ALTSOURCE=`eval echo $1`
;;
--pakdir)
shift
PAK_DIR=`eval echo $1`
;;
--with-tar)
shift
TAR=`eval echo $1`
;;
--docdir)
shift
DOC_DIR=`eval echo $1`
;;
--provides)
shift
PROVIDES=`eval echo $1`
;;
--conflicts)
shift
CONFLICTS=`eval echo $1`
;;
--replaces)
shift
REPLACES=`eval echo $1`
;;
--requires)
shift
REQUIRES=`eval echo $1`
;;
--maintainer)
shift
MAINTAINER=`eval echo $1`
;;
--dpkgflags)
shift
DPKG_FLAGS=`eval echo $1`
;;
--rpmflags)
shift
RPM_FLAGS=`eval echo $1`
;;
-t|--type)
shift
INSTYPE=`echo $1 | tr 'a-z' 'A-Z'`
case `eval echo $INSTYPE` in
RPM|R)
INSTYPE=R;;
SLACKWARE|S)
INSTYPE=S;;
DEBIAN|D)
INSTYPE=D;;
*)
echo
echo "$1 is not a valid packaging system. Please use \'rpm\', \'slackware\' or \'debian\'"
echo
echo
exit 1
esac
;;
-R)
INSTYPE=R
CK_REDHAT=1
;;
-S)
INSTYPE=S
CK_SLACKWARE=1
;;
-D)
INSTYPE=D
CK_DEBIAN=1
;;
--install)
shift
case `eval echo $1` in
1|yes|'')
INSTALL=1;;
0|no)
INSTALL=0;;
*)
boolean_usage "--install" $1
esac
;;
--si)
SHOW_INSTALL=1;;
--showinstall)
shift
case `eval echo $1` in
1|yes|'')
SHOW_INSTALL=1;;
0|no)
SHOW_INSTALL=0;;
*)
boolean_usage "--showinstall" $1
esac
;;
--ss)
SHOW_SLACK_INSTALL=1;;
--showslack)
shift
case `eval echo $1` in
1|yes|'')
SHOW_SLACK_INSTALL=1;;
0|no)
SHOW_SLACK_INSTALL=0;;
*)
boolean_usage "--showslack" $1
esac
;;
--deldoc)
shift
case `eval echo $1` in
1|yes|'')
DEL_DOCPAK=1;;
0|no)
DEL_DOCPAK=0;;
*)
boolean_usage "--deldoc" $1
esac
;;
--delspec)
shift
case `eval echo $1` in
1|yes|'')
DEL_SPEC=1;;
0|no)
DEL_SPEC=0;;
*)
boolean_usage "--delspec" $1
esac
;;
--deldesc)
shift
case `eval echo $1` in
1|yes|'')
DEL_DESC=1;;
0|no)
DEL_DESC=0;;
*)
boolean_usage "--deldesc" $1
esac
;;
--strip)
shift
case `eval echo $1` in
1|yes|'')
STRIP_ELF=1;;
0|no)
STRIP_ELF=0;;
*)
boolean_usage "--strip" $1
esac
;;
--addso)
shift
case `eval echo $1` in
1|yes|'')
ADD_SO=1;;
0|no)
ADD_SO=0;;
*)
boolean_usage "--strip" $1
esac
;;
--stripso)
shift
case `eval echo $1` in
1|yes|'')
STRIP_SO_ELF=1
;;
0|no)
STRIP_SO_ELF=0;;
*)
boolean_usage "--stripso" $1
esac
;;
--gzman)
shift
case `eval echo $1` in
1|yes|'')
COMPRESS_MAN=1;;
0|no)
COMPRESS_MAN=0;;
*)
boolean_usage "--gzman" $1
esac
;;
--bk)
BACKUP=1;;
--backup)
shift
case `eval echo $1` in
1|yes|'')
BACKUP=1;;
0|no)
BACKUP=0;;
*)
boolean_usage "--backup" $1
esac
;;
--default)
ACCEPT_DEFAULT=1;;
-y)
ACCEPT_DEFAULT=1;;
--nodoc)
NODOC=1;;
--rpmi)
RPM_IU=i;;
--rpmu)
RPM_IU=U;;
--newslack)
NEW_SLACK=1;;
--inspect)
CK_INSPECT=1;;
--review-spec)
REVIEW_SPEC=1;;
--review-control)
REVIEW_CONTROL=1;;
--spec)
shift
SPEC_PATH=`eval echo $1`
if ! [ -f "$SPEC_PATH" ]; then
echog "Warning: .spec file path \"%s\" not found.\nWarning: Defaulting to \"%s\"." "$SPEC_PATH" "${PKG_BASENAME}.spec"
fi
;;
--copyright|--version)
cat << EOF
Copyright (c) 2010 Felipe Eduardo Sanchez Diaz Duran <izto@asic-linux.com.mx>
This program is free software; you can redistribute it and/or modify
it under the terms of the version 2 of the GNU General Public License
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
EOF
exit 0;;
--autodoinst)
shift
case `eval echo $1` in
1|yes|'')
AUTODOINST=1;;
0|no)
AUTODOINST=0;;
*)
boolean_usage "--autodoinst" $1
esac
;;
--reset-uids)
shift
case `eval echo $1` in
1|yes|'')
RESET_UIDS=1;;
0|no)
RESET_UIDS=0;;
*)
boolean_usage "--reset-uids" $1
esac
;;
--fstrans)
shift
case `eval echo $1` in
1|yes|'')
TRANSLATE=1;;
0|no)
TRANSLATE=0;;
*)
boolean_usage "--fstrans" $1
esac
;;
--exclude)
shift
EXCLUDE=`eval echo $1`
;;
--include)
shift
CK_INCLUDE_FILE=`eval echo $1`
;;
esac
shift
done
# See if we have and install command
shift
[ "$1" = "" ] && set -- make install
# End of argument parsing
#############################################################################
# We initialize some useful variables #
#######################################
################################################################
# User-configurable variables were moved to the checkinstallrc #
# file which is probably found at /usr/local/lib/checkinstall #
# #
# DO NOT modify them here!! #
################################################################
# Debug level
! [ "$DEBUG" ] && DEBUG=0
! [ "$INSTALLWATCH_PREFIX" ] && INSTALLWATCH_PREFIX="$INSTALLDIR"
! [ "$INSTALLWATCH" ] && INSTALLWATCH=${INSTALLWATCH_PREFIX}/bin/installwatch
# Which makepkg to use
! [ "$MAKEPKG" ] && MAKEPKG=/sbin/makepkg
# Default MAKEPKG flags
! [ "$MAKEPKG_FLAGS" ] && MAKEPKG_FLAGS="-l y -c n"
# Default architecture type
! [ "$ARCHITECTURE" ] && ARCHITECTURE=""
# Default package type
! [ "$INSTYPE" ] && INSTYPE=""
# Interactively show the results of the install command
# This is useful for interactive installation commands
! [ "$SHOW_INSTALL" ] && SHOW_INSTALL=1
# Show Slackware package installation script while it runs? Again, useful if
# it's an interactive script
! [ "$SHOW_SLACK_INSTALL" ] && SHOW_SLACK_INSTALL=0
# Automatic deletion of "doc-pak" upon termination
! [ "$DEL_DOCPAK" ] && DEL_DOCPAK=1
# Automatic deletion of the spec file
! [ "$DEL_SPEC" ] && DEL_SPEC=1
# Automatic deletion of "description-pak"
! [ "$DEL_DESC" ] && DEL_DESC=1
# Automatically strip all ELF binaries
! [ "$STRIP_ELF" ] && STRIP_ELF=1
# Don't automatically strip all ELF binaries
! [ "$STRIP_SO_ELF" ] && STRIP_SO_ELF=0
# Don't automatically search shared libraries
# nor add them to /etc/ld.so.conf
! [ "$ADD_SO" ] && ADD_SO=0
# Automatically compress all man pages
! [ "$COMPRESS_MAN" ] && COMPRESS_MAN=1
# Backup all files modified by the install command supplied by the user
! [ "$BACKUP" ] && BACKUP=1
# Write description installing code to doinst.sh
! [ "$AUTODOINST" ] && AUTODOINST=1
# Are we going to use filesystem translation?
! [ "$TRANSLATE" ] && TRANSLATE=1
# Reset the owner/group of all files to root.root?
! [ "$RESET_UIDS" ] && RESET_UIDS=0
# We won't include anything under this directories
! [ "$EXCLUDE" ] && EXCLUDE=""
# We will include anything listed in this file
! [ "$CK_INCLUDE_FILE" ] && CK_INCLUDE_FILE=""
# Accept the default answer for all the questions
! [ "$ACCEPT_DEFAULT" ] && ACCEPT_DEFAULT=0
# Use the default doc directory of /usr/doc
! [ "$DOC_DIR" ] && DOC_DIR=/usr/doc
# Do not include common documentation
! [ "$NODOC" ] && NODOC=0
# Use "-U" flag in rpm by default when installing a rpm package
# This tells rpm to (U)pdate the package instead of (i)nstalling it.
! [ "$RPM_IU" ] && RPM_IU=U
# Use the new (8.1+) Slackware description format
! [ "$NEW_SLACK" ] && NEW_SLACK=1
# Inspect the file list before creating the package
! [ "$CK_INSPECT" ] && CK_INSPECT=0
# Review the .spec file before creating a .rpm
! [ "$REVIEW_SPEC" ] && REVIEW_SPEC=0
# Review the control file before creating a .deb
! [ "$REVIEW_CONTROL" ] && REVIEW_CONTROL=0
# Set the umask
! [ "$CKUMASK" ] && CKUMASK=0022
# No real installation if not explicitly asked
! [ "$INSTALL" ] && INSTALL=0
# The place where we will be storing the temp files
! [ "$BASE_TMP_DIR" ] && BASE_TMP_DIR=/var/tmp
# Default RPM FLAGS
! [ "$RPM_FLAGS" ] && RPM_FLAGS=" --force --nodeps --replacepkgs "
# Default DPKG FLAGS
! [ "$DPKG_FLAGS" ] && DPKG_FLAGS=""
# Default MAKEPKG FLAGS
! [ "$MAKEPKG_FLAGS" ] && MAKEPKG_FLAGS=""
# Show the makepkg program's output?
! [ "$SHOW_MAKEPKG" ] && SHOW_MAKEPKG=0
####################
# Non-configurable #
####################
# Existing configuration files are always preserved
[ -f description-pak ] && DEL_DESC=0
[ -f SPEC_PATH ] && DEL_SPEC=0
[ -d doc-pak ] && DEL_DOCPAK=0
INSTALLCMD=("$@")
[ -z "${INSTALLCMD[*]}" ] && INSTALLCMD=(make install)
# The editor we use to review the file list and .spec or control file
if ! [ -x "$VISUAL" ]; then
if [ -x "$EDITOR" ]; then
VISUAL=$EDITOR
else
VISUAL=`which vi`
fi
fi
# pkgtools in Slackware 8.1+ don't like the default tar binary and instead
# use "tar-1.13". We'll use that too if we can find it.
BADTAR=0
if [ "$TAR" ]; then
! [ -x "$TAR" ] && BADTAR=1
else
TAR=`which tar-1.13 2> /dev/null`
fi
if ! [ -x "$TAR" ]; then
TAR="tar"
fi
# If the user gave us a bad path to tar then we should warn him/her about it
if [ $BADTAR -gt 0 ]; then
echo
echog "Warning: The path to tar specified in the command line is invalid.\nWarning: It has been set to %s" "$TAR"
echo
fi
[ $DEBUG -gt 0 ] && echo "debug: TAR=$TAR"
[ $DEBUG -gt 0 ] && echo "debug: VISUAL=$VISUAL"
#################################
# Variable definition ends here #
#############################################################################
if [ ! -x $INSTALLWATCH ]; then
echo
echog "I can't find $INSTALLWATCH."
echo
echog "I can't continue. Either install installwatch or\nmodify the INSTALLWATCH variable in this script,\nthen run checkinstall again."
echo
exit 1
fi
echo
# Set the umask. If not specified with "--umask" then we'll use 0022, a
# standard, non-paranoid reasonable value.
if [ $DEBUG -gt 0 ] ;then
echo "debug: Setting umask => $CKUMASK"
fi
umask $CKUMASK
# Find a safe TMP_DIR
TMP_DIR=`mktemp -q -d -p "${BASE_TMP_DIR}"`
RETURN=$?
if [ "$TMP_DIR" = "$BASE_TMP_DIR" -o "$TMP_DIR" = "/" ]; then
echo
echog "%s is an unacceptable value for the temp dir. Please \nedit the variable definition for %s and try again." "$TMP_DIR" "$TMP_DIR"
echo
echog "*** Aborting"
echo
exit 1
fi
if [ $RETURN -gt 0 ]; then
echo
echog "**** Failed to create temp dir! \n**** Do you have write permission for %s? \n\n**** Aborting installation." "$BASE_TMP_DIR"
echo
exit $RETURN
fi
BUILD_DIR=${TMP_DIR}/package
mkdir $BUILD_DIR
if [ $DEBUG -gt 0 ] ;then
echo "debug: The temporary directory is: [ $TMP_DIR ]"
echo
fi
# 001117-BaP: We can create a default set of docs on the fly . . .
# The list I've included should cover most packages adequately. If not,
# then you should really create the package doc set *manually*
# Check if --nodoc was specified
if [ "$NODOC" = "0" ]; then
if ! [ -d "$DIRECTORIO_FUENTE/doc-pak" ]; then
echogn "The package documentation directory ./doc-pak does not exist. \nShould I create a default set of package docs? "
if yorn ; then
echo
echogn "Preparing package documentation..."
mkdir doc-pak
for f in ABOUT ABOUT-NLS ANNOUNCE AUTHORS *BUGS* CHANGES CONFIGURATION *COPYING* *COPYRIGHT* CREDITS ChangeLog Changelog CHANGELOG CONTRIBUTORS *FAQ* FEATURES FILES HACKING History HISTORY INSTALL* LICENSE LSM MANIFEST NEWS *README* *Readme* SITES *RELEASE* RELNOTES THANKS TIPS TODO VERSION CONFIGURATION* GPL License Doc doc Docs* docs* Roadmap ROADMAP; do
if [ -e $f ]; then
if ! [ -L $f ]; then
cp -a $f doc-pak
else
cp -LpR $f doc-pak
fi
fi
done
okfail
DOCS=`ls doc-pak`
if ! [ "$DOCS" ]; then
echo
echog "*** No known documentation files were found. The new package \n*** won\'t include a documentation directory."
rm -rf doc-pak # If doc-pak is empty then we
fi # don't need it
fi
fi
fi # End of NODOC
##############################################################################
#
# Find out the packaging method to use
#
while ! [ "$INSTYPE" ]; do
echo
echog "Please choose the packaging method you want to use."
echogn "Slackware [S], RPM [R] or Debian [D]? "
read INSTYPE
echo
case $INSTYPE in
S|s)
INSTYPE=S
CK_SLACKWARE=1
;;
R|r)
INSTYPE=R
CK_REDHAT=1
;;
D|d)
INSTYPE=D
CK_DEBIAN=1
;;
*)
echo
echog '*** Invalid type.'
echo
INSTYPE=""
;;
esac
done
## Do we have a package description file? If we don't then
## we should write one
cd "$DIRECTORIO_FUENTE"
# If we already have a slack-desc we use it unless
# we have a description-pak too
if [ -r slack-desc -a ! -r description-pak ]; then
cat -s slack-desc | grep -v \# | grep -v \| | cut -d : -f 2 | sed '/./,/^$/!d' > description-pak
fi
if [ $ACCEPT_DEFAULT -eq 0 ]; then # If --default is given, we skip this
if ! [ -r description-pak ]; then
DESCRIPTION="Package created with checkinstall $CHECKINSTALL_VERSION"
echo
echogn "Please write a description for the package."
# If we selected Slackware, then give the pkgtool warning
if [ "$CK_SLACKWARE" ]; then
echog " Remember that pkgtool shows\nonly the first one when listing packages so make that one descriptive."
fi
echo
echog "End your description with an empty line or EOF."
while [ "$DESCRIPTION" ]; do
echo -n ">> "
read DESCRIPTION
[ "$DESCRIPTION" ] && echo "$DESCRIPTION" >> description-pak
done
fi
fi
# We still don't have it??
! [ -r description-pak ] && echo "Package created with checkinstall $CHECKINSTALL_VERSION" > description-pak
# Warn the user if we're using the new Slackware description format
# and the description is bigger than 11 lines
if [ $NEW_SLACK -gt 0 ]; then
if [ `wc -l < description-pak` -gt 11 ]; then
echo
echog "Warning: Your package description is bigger than 11 lines.\nWarning: The Slackware 8.1+ pkgtools might not like it."
echo
fi
fi
INSTYPE=`echo $INSTYPE | tr a-z A-Z`
case $INSTYPE in
S|s)
CK_SLACKWARE=1
echo
echog "********************************************\n**** Slackware package creation selected ***\n********************************************"
;;
R|r)
CK_REDHAT=1
echo
echog "**************************************\n**** RPM package creation selected ***\n**************************************"
;;
D|d)
CK_DEBIAN=1
echo
echog "*****************************************\n**** Debian package creation selected ***\n*****************************************"
esac
########## Acquire some info about the package ##########
# Figure out what kind of machine are we running on
if ! [ "$ARCHITECTURE" ]; then
ARCHITECTURE=`uname -m`
echo $ARCHITECTURE | grep -e "i[3456]86" &> /dev/null
[ $? -eq 0 ] && ARCHITECTURE=i386 # Arch will be "i386" for any of
# i386, i486, i586 or i686.
# You can change this with "--arch"
# Fix the PowerPC & Amd64 architecture description if we're on Debian
if [ "$CK_DEBIAN" = "1" ] ; then
ARCHITECTURE=`dpkg-architecture -qDEB_HOST_ARCH`
fi
fi
if [ -f "$SPEC_PATH" ]; then
SUMMARY=`getparameter "^[Ss]ummary"`
NAME=`getparameter "^[Nn]ame"`
VERSION=`getparameter "^[Vv]ersion"`
RELEASE=`getparameter "^[Rr]elease"`
LICENSE=`getparameter "^[Cc]opyright"`
PKG_GROUP=`getparameter "^[Gg]roup"`
PROVIDES=`getparameter "^[Pp]rovides"`
REQUIRES=`getparameter "^[Rr]equires"`
fi
OPTION=junk
while [ "$OPTION" ]; do
# Some sanity checks
! [ "$SUMMARY" ] && SUMMARY=`head -1 description-pak`
! [ "$NAME" ] && NAME=`echo "$PKG_BASENAME" | rev | cut -f2- -d"-" | rev`
echo "$NAME" | grep -e "[[:blank:]]" &> /dev/null
if [ $? -eq 0 ]; then
echo
echog "*** Warning: The package name \"%s\" contains spaces.\n*** Warning: Package names with spaces in them are not valid in most\n*** Warning: packaging systems so I changed all spaces to underscores." "$NAME"
NAME=`echo "$NAME" | tr ' \t' '__'`
fi
if [ "$CK_DEBIAN" ]; then # Make the name policy compliant
echo "$NAME" | grep -e "[[:upper:]]" &> /dev/null
if [ $? -eq 0 ]; then
echo
echog "*** Warning: The package name \"%s\" contains upper case\n*** Warning: letters. dpkg might not like that so I changed\n*** Warning: them to lower case." "$NAME"
NAME=`echo "$NAME" | tr 'A-Z' 'a-z'`
fi
echo "$NAME" | grep -e '^[^0-9a-z]' &> /dev/null
if [ $? -eq 0 ]; then
echo
echog "*** Warning: The package name \"%s\" does not start with\n*** Warning: an alphanumetic character. dpkg might not like that so I prefixed\n*** Warning: it with a number 0." "$NAME"
NAME=`echo "$NAME" | sed -e 's/^/0/'`
fi
echo "$NAME" | grep -e '[^0-9a-z+.-]' &> /dev/null
if [ $? -eq 0 ]; then
echo
echog "*** Warning: The package name \"%s\" contains illegal\n*** Warning: characters. dpkg might not like that so I changed\n*** Warning: them to dashes." "$NAME"
NAME=`echo "$NAME" | sed -e 's/[^0-9a-z+.-]/-/g'`
fi
fi
! [ "$VERSION" ] && VERSION=`echo "$PKG_BASENAME" | rev | cut -f1 -d"-" | rev`
## Did we get a usable version?
if [ "$VERSION" = "$PKG_BASENAME" ]; then
# If we did not then try getting it from the config.log file
if [ -f "$DIRECTORIO_FUENTE/config.log" ]; then
VERSION=`grep '#define VERSION' config.log| awk -F \" '{print $ 2}'`
else
# We use the current that if everything else fails
VERSION=`date +%Y%m%d`
fi
fi
if [ "$CK_DEBIAN" ]; then # Check for a valid version for dpkg
NEWVERS=$(echo $VERSION | egrep '^([[:alnum:]]+:)?[[:alnum:]]+([-:.+~][[:alnum:]]+)*(-[.[:alnum:]]+)?$' 2> /dev/null)
while [ "$NEWVERS" != "$VERSION" ]; do
echo
echog "*** Warning: The package version \"%s\" is not a\n*** Warning: debian policy compliant one. Please specify an alternate one" "$VERSION"
if [ $ACCEPT_DEFAULT -eq 0 ] ; then
read VERSION
NEWVERS=$(echo $VERSION | egrep '^([[:alnum:]]+:)?[[:alnum:]]+([-:.+~][[:alnum:]]+)*(-[.[:alnum:]]+)?$' 2> /dev/null)
else
VERSION=0
NEWVERS=0
fi
done
fi
if [ ! "$PAGER" ]; then # no default pager defined
if [ "$CK_DEBIAN" ]; then # use Debian's pager if on Debian
PAGER=/usr/bin/sensible-pager
else
PAGER=less # use less otherwise
fi
fi
! [ "$RELEASE" ] && RELEASE="1"
! [ "$LICENSE" ] && LICENSE="GPL"
! [ "$PKG_GROUP" ] && [ "$CK_REDHAT" ] && PKG_GROUP="Applications/System"
! [ "$PKG_GROUP" ] && [ "$CK_DEBIAN" ] && PKG_GROUP="checkinstall"
! [ "$PKG_GROUP" ] && [ "$CK_SLACKWARE" ] && PKG_GROUP="Applications/System"
! [ "$ARCHITECTURE" ] && ARCHITECTURE="i386"
! [ "$SOURCE" ] && SOURCE="$PKG_BASENAME"
! [ "$ALTSOURCE" ] && ALTSOURCE=""
! [ "$PROVIDES" ] && PROVIDES="$NAME"
! [ "$REQUIRES" ] && REQUIRES=""
# bond: added this so it is easy to change the Maintainer: field
# just by setting the MAINTAINER environment variable
# Try to find the hostname in the environment
if [ "$HOSTNAME" ]; then
MAINTDOMAIN=$HOSTNAME
else
hostname -f &> /dev/null
if [ $? -gt 0]; then
MAINTDOMAIN="localhost"
else
MAINTDOMAIN=`hostname -f`
fi
fi
! [ "$MAINTAINER" ] && MAINTAINER=${LOGNAME:-root}@${MAINTDOMAIN}
echo
echog "This package will be built according to these values: "
echo
# Debian maintainers use the Maintainer: field and want to be able
# to change it. If we are not on debian we don't need the field...
[ "$CK_DEBIAN" ] && echog "0 - Maintainer: [ %s ]" "$MAINTAINER"
echog "1 - Summary: [ %s ]" "$SUMMARY"
echog "2 - Name: [ %s ]" "$NAME"
echog "3 - Version: [ %s ]" "$VERSION"
echog "4 - Release: [ %s ]" "$RELEASE"
echog "5 - License: [ %s ]" "$LICENSE"
echog "6 - Group: [ %s ]" "$PKG_GROUP"
echog "7 - Architecture: [ %s ]" "$ARCHITECTURE"
echog "8 - Source location: [ %s ]" "$SOURCE"
echog "9 - Alternate source location: [ %s ]" "$ALTSOURCE"
[ "$CK_REDHAT" -o "$CK_DEBIAN" ] &&
echog "10 - Requires: [ %s ]" "$REQUIRES"
[ "$CK_REDHAT" -o "$CK_DEBIAN" ] &&
echog "11 - Provides: [ %s ]" "$PROVIDES"
[ "$CK_DEBIAN" ] && echog "12 - Conflicts: [ %s ]" "$CONFLICTS"
[ "$CK_DEBIAN" ] && echog "13 - Replaces: [ %s ]" "$REPLACES"
echo
echogn "Enter a number to change any of them or press ENTER to continue: "
if [ $ACCEPT_DEFAULT -eq 1 ]; then
echo
OPTION=""
else
read OPTION
fi
case $OPTION in
1)
echog "Enter new summary: "
echo -n ">> "
read SUMMARY
;;
2)
echog "Enter new name: "
echo -n ">> "
read NAME
;;
3)
echog "Enter new version: "
echo -n ">> "
read VERSION
;;
4)
echog "Enter new release number: "
echo -n ">> "
read RELEASE
;;
5)
echog "Enter the license type: "
echo -n ">> "
read LICENSE
;;
6)
echog "Enter the new software group: "
echo -n ">> "
read PKG_GROUP
;;
7)
echog "Enter the architecture type: "
echo -n ">> "
read ARCHITECTURE
;;
8)
echog "Enter the source location: "
echo -n ">> "
read SOURCE
;;
9)
echog "Enter the alternate source location: "
echo -n ">> "
read ALTSOURCE
;;
0) # bond: again, debian-specific
[ "$CK_DEBIAN" ] && {
echog "Enter the maintainer's name and e-mail address: "
echo -n ">> "
read MAINTAINER
}
;;
10)
[ "$CK_REDHAT" -o "$CK_DEBIAN" ] && {
echog "Enter the additional requirements: "
echo -n ">> "
read REQUIRES
}
;;
11)
# 01-12-06 UKo: new feature
[ "$CK_REDHAT" -o "$CK_DEBIAN" ] && {
echog "Enter the provided features: "
echo -n ">> "
read PROVIDES
}
;;
12)
[ "$CK_DEBIAN" ] && { echog "Enter the conflicting packages: "
echo -n ">> "
read CONFLICTS
}
;;
13)
[ "$CK_DEBIAN" ] && { echog "Enter the replaced packages: "
echo -n ">> "
read REPLACES
}
;;
esac
done
# The PKG_BASENAME is adjusted to reflect any changes
# in the NAME and VERSION of the package
# NOTE: on debian we use NAME alone, instead - see below
PKG_BASENAME="$NAME-$VERSION"
##############################################################################
#
# We run the program installation from the source directory
#
# Write a small script to run the install command. This way the LD_PRELOAD
# environment variable will be available to it, wich among other things
# will allow proper detection of new symbolic links and files created by
# subshells.
[ $DEBUG -gt 0 ] && echo "debug: CK_INCLUDE_FILE = $CK_INCLUDE_FILE"
TMP_SCRIPT=${TMP_DIR}/installscript.sh
cat << EOF > $TMP_SCRIPT
#!/bin/sh
cd "$DIRECTORIO_FUENTE"
EOF
shell_escape "${INSTALLCMD[@]}" >> $TMP_SCRIPT
cat << EOF >> $TMP_SCRIPT
# Report success or failure
if [ \$? -eq 0 ]; then
exit 0
else
exit 1
fi
EOF
# No one needs to see what we are doing. It's safer this way.
chmod 700 $TMP_SCRIPT
echo
echogn "Installing with %s..." "${INSTALLCMD[*]}"
#
# We exclude as many "dangerous" directories as possible from translation.
# installwatch excludes itself some directories, but we put them all here,
# to be explicit.
#
IEXCLUDE="${DIRECTORIO_FUENTE},/dev,/proc,/tmp,/var/tmp"
# Run the install command, showing the results interactively if we were asked
# to do so in the configuration section (see the SHOW_INSTALL switch above)
INSTALL_FAILED=0
if [ $SHOW_INSTALL -eq 0 ]; then
$INSTALLWATCH --logfile=${TMP_DIR}/newfiles.tmp --exclude="${IEXCLUDE}" \
--root=${TMP_DIR} --transl=${TRANSLATE} --backup=${BACKUP} --dbglvl=$DEBUG\
$TMP_SCRIPT &> /${TMP_DIR}/install.log
okfail
INSTALL_FAILED=$?
else
echo
echo
echog "========================= Installation results ==========================="
$INSTALLWATCH --logfile=${TMP_DIR}/newfiles.tmp --exclude="${IEXCLUDE}" \
--root=${TMP_DIR} --transl=${TRANSLATE} --backup=${BACKUP} --dbglvl=$DEBUG\
$TMP_SCRIPT 2>&1
if [ $? -eq 0 ]; then
echo
echog "======================== Installation successful =========================="
else
INSTALL_FAILED=1
fi
fi
# preserve LD_PRELOAD, might have been set by fakeroot
# unset LD_PRELOAD
VIEWLOG="n"
if [ $INSTALL_FAILED -gt 0 ]; then
echo
echog "**** Installation failed. Aborting package creation."
VIEWLOG="y"
fi
if [ $SHOW_INSTALL -eq 0 ]; then
echo
echogn "Do you want to view the installation log file? "
if yorn $VIEWLOG ; then
(echo
echogn ' ***************************************************************\n Installation results. You can find them in\n %s\n ***************************************************************\n' "${TMP_DIR}/install.log"
cat /${TMP_DIR}/install.log) | $PAGER
fi
fi
if [ $INSTALL_FAILED -gt 0 ]; then
cleanup
exit $INSTALL_FAILED
fi
# If translation was active, the installed files are under /transl
TRANSLROOT="/"
if [ "${TRANSLATE}" = "1" ]; then
TRANSLROOT="${TMP_DIR}/TRANSL"
fi
# Copy the documentation files
if [ -d "$DIRECTORIO_FUENTE/doc-pak" ]; then # Are there any files?
echo
echo "Copying documentation directory..."
case "${DOC_DIR}" in
:*) doc_dir=`echo "${DOC_DIR}" | sed -e 's/://'`;;
*) doc_dir="${DOC_DIR}/${NAME}";;
esac
mkdir -p "${BUILD_DIR}/${doc_dir}"
copy_dir_hierarchy . "$DIRECTORIO_FUENTE/doc-pak" \
"${BUILD_DIR}/${doc_dir}"
chown -R root.root "${BUILD_DIR}/${doc_dir}"
fi
# If we have a --include list file, copy the files listed there to /
# If translation is on, it will catch these too.
if [ -f "${DIRECTORIO_FUENTE}/${CK_INCLUDE_FILE}" ]; then
cat "${DIRECTORIO_FUENTE}/${CK_INCLUDE_FILE}" | while read include_file; do
copy_dir_hierarchy --deref-parents "$include_file" "." "${BUILD_DIR}" &>/dev/null
done
fi
#
# Extract the relevant files from the modified files list
#
# Find regular files first
[ $DEBUG -gt 0 ] && echo "debug: BASE_TMP_DIR: $BASE_TMP_DIR"
cat /${TMP_DIR}/newfiles.tmp | egrep -v '^[-0-9][0-9]*[[:space:]]*(unlink|access)' | cut -f 3 | egrep -v "^(/dev|$BASE_TMP_DIR|/tmp)" | sort -u > /${TMP_DIR}/newfiles
# symlinks are next
cat /${TMP_DIR}/newfiles.tmp | egrep -v '^[-0-9][0-9]*[[:space:]]*(unlink|access)' | cut -f 4 | egrep -v "^(/dev|$BASE_TMP_DIR|/tmp)" | grep -v "#success" | sort -u >> /${TMP_DIR}/newfiles
# Create another list of modified files that exclude all files the
# install script wanted to create but did not, e.g because they already
# existed.
egrep "#success$" /${TMP_DIR}/newfiles.tmp | cut -f 3 | sort -u \
>/${TMP_DIR}/modified
egrep "#success$" /${TMP_DIR}/newfiles.tmp | cut -f 4 \
| egrep -v "#success" | sort -u >> /${TMP_DIR}/modified
# OK, now we clean it up a bit
mv /${TMP_DIR}/newfiles.tmp /${TMP_DIR}/newfiles.installwatch
sort -u < /${TMP_DIR}/newfiles | uniq | while read file; do
if [ -e "${TRANSLROOT}${file}" ]; then
echo $file >> /${TMP_DIR}/newfiles.tmp
else
FILE_SYM=`file "${TRANSLROOT}${file}" | grep 'symbolic link'`
[ "${FILE_SYM}" != "" ] && echo $file >> /${TMP_DIR}/newfiles.tmp
fi
done
cp /${TMP_DIR}/newfiles.tmp /${TMP_DIR}/newfiles
# Don't include anything under the directories specified with "--exclude"
[ $DEBUG -gt 0 ] && echo "debug: EXCLUDE=$EXCLUDE"
for exclude in `echo $EXCLUDE | awk '{ split ($0, files,","); for(i=1; files[i] != ""; i++) print files[i];}'`; do
egrep -v "$exclude" < /${TMP_DIR}/newfiles > /${TMP_DIR}/newfiles.tmp
cp /${TMP_DIR}/newfiles.tmp /${TMP_DIR}/newfiles
done
# Find files created under /home
grep '^/home' ${TMP_DIR}/newfiles > /${TMP_DIR}/unwanted
if [ $? -eq 0 ]; then
echo
echog "Some of the files created by the installation are inside the home directory: /home"
echo
echog "You probably don't want them to be included in the package."
echogn "Do you want me to list them? "
if yorn "n"; then
$PAGER ${TMP_DIR}/unwanted
fi
echogn "Should I exclude them from the package? (Saying yes is a good idea) "
if yorn "n"; then
sed -i -e '/^\/home/d' ${TMP_DIR}/newfiles
fi
fi
## Find any files created in `pwd`. We probably don't want them here
grep "^`pwd`" ${TMP_DIR}/newfiles > /${TMP_DIR}/unwanted
if [ $? = 0 ]; then
echo
echog "Some of the files created by the installation are inside the build\ndirectory: %s" "`pwd`"
echo
echogn "You probably don't want them to be included in the package,\nespecially if they are inside your home directory.\nDo you want me to list them? "
if yorn "n"; then
$PAGER ${TMP_DIR}/unwanted
fi
echogn "Should I exclude them from the package? (Saying yes is a good idea) "
if yorn ; then
grep -v "`pwd`" ${TMP_DIR}/newfiles > /${TMP_DIR}/newfiles.tmp
mv /${TMP_DIR}/newfiles.tmp /${TMP_DIR}/newfiles
fi
fi
# If requested with "--inspect" we run an editor on the newfiles list
if [ $CK_INSPECT -gt 0 ]; then
echo
echog "You requested to review the list of files that will be\nincluded in this package.\n\nNow you'll have the chance to review and optionally modify it."
echo
echog "Press ENTER to continue."
read junk
$VISUAL ${TMP_DIR}/newfiles
# Check if new files were added by the user
cat /${TMP_DIR}/newfiles | while read file; do
if ! [ -e "${TRANSLROOT}${file}" ]; then
copy_dir_hierarchy --deref-parents "${file}" "/" "${BUILD_DIR}" >> /${TMP_DIR}/updated-by-user.log 2>&1
fi
done
fi
# Copy the files to the temporary directory
#
echo
echogn "Copying files to the temporary directory..."
cd /
( cat /${TMP_DIR}/newfiles | while read i; do
if [ ! -d "${TRANSLROOT}${i}" -o -L "${TRANSLROOT}${i}" ]; then
echo ".${i}"
fi
done ) > /${TMP_DIR}/newfiles-tar
# Here it gets tricky: we need to copy all new files to our build dir,
# keeping permissions as they are for parents directories as well as for
# the files themselves. If the parents or the file are symlinks, we
# dereference them only if they were not modified by the installation
# script.
NEWFILES="${TMP_DIR}/modified"
LOGFILE="/${TMP_DIR}/checkinstall.log"
cat /${TMP_DIR}/newfiles-tar | while read file; do
parents=`list_parents ${file} | sed s/^\.//`
for p in $parents; do
# We have to remove the ./ at the beginning
truep=`echo ${p} | sed s/^\.//`
# Parent has been modified: do _not_ dereference
grep "${truep}$" "${NEWFILES}" &>/dev/null
if [ $? -eq 0 ]; then
$TAR --no-recursion -C "${TRANSLROOT}" -cpf - $p \
| $TAR -f - -xvpC "${BUILD_DIR}" >> $LOGFILE 2>&1
else
# Parent wasn't touched by the install script: dereference
$TAR --no-recursion -C "${TRANSLROOT}" -cphf - $p \
| $TAR -f - -xvpC "${BUILD_DIR}" >> $LOGFILE 2>&1
fi
done
truefile=`echo ${file} | sed 's/^\.//'`
# No recursion here: if $file is a directory, then the files created
# in it will follow.
grep "${truefile}$" "${NEWFILES}" &>/dev/null
if [ $? -eq 0 ]; then
$TAR --no-recursion -C "${TRANSLROOT}" -cpf - "$file" \
| $TAR -f - -xvpC "${BUILD_DIR}" >> $LOGFILE 2>&1
else
$TAR --no-recursion -C "${TRANSLROOT}" -cphf - "$file" \
| $TAR -f - -xvpC "${BUILD_DIR}" >> $LOGFILE 2>&1
fi
done
okfail
cd /
# Reset all files' owner/group to root.root, and all dirs' perms to 755
#
# We do this if asked with "--reset-uids" in the command line, like the
# similar option in Slackware's makepkg.
if [ $RESET_UIDS -gt 0 ]; then
find "$BUILD_DIR" -exec chown root.root {} \;
find "$BUILD_DIR" -type d -exec chmod 755 {} \;
fi
##############################################################################
# Strip ELF binaries #
######################
#
# Note: The code in this section was taken from the brp-strip script included
# in rpm-4.0.2, which is distributed under the GNU GPL. The copyright
# for this code belongs to its owner. See the file COPYING for details.
#
if [ $STRIP_ELF -eq 1 ]; then
echo
if [ $STRIP_SO_ELF -eq 1 ]; then
echogn "Stripping ELF binaries and libraries..."
else
echogn "Stripping ELF binaries..."
fi
for f in `find ${BUILD_DIR} -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \)` ; do
if [ $STRIP_SO_ELF -eq "0" -a "`file $f | grep -v ' shared object,'`" = "" ]; then
#if this is a *.so* file and we don't have to strip it, then filter 'em
continue
fi
if [ "`file $f | sed -n -e 's/^\(.*\):[ ]*ELF.*, not stripped/\1/p'`" = "" ]; then
continue
fi
strip -p $f || :
done
okfail
fi
###################
# End of stripping #
##############################################################################
##############################################################################
# Compress man pages #
######################
#
# Note: The code in this section is based on the brp-compress script
# included in rpm-4.0.2, which is distributed under the GNU GPL. The
# copyright for this code belongs to its owner. See the file COPYING for
# details.
#
if [ $COMPRESS_MAN -eq 1 ]; then
echo
echogn "Compressing man pages..."
cd $BUILD_DIR
# Compress man pages
COMPRESS="gzip -9"
COMPRESS_EXT=.gz
for d in ./usr/local/man/man* ./usr/local/man/*/man* ./usr/local/info \
./usr/local/share/man/man* ./usr/local/share/man/*/man* \
./usr/local/share/info \
./usr/local/kerberos/man \
./usr/local/share/doc/*/man/man* ./usr/local/lib/*/man/man* \
././usr/man/man* ./usr/man/*/man* ./usr/info \
./usr/share/man/man* ./usr/share/man/*/man* ./usr/share/info \
./usr/kerberos/man ./usr/X11R6/man/man* ./usr/lib/perl5/man/man* \
./usr/share/doc/*/man/man* ./usr/lib/*/man/man*
do
[ -d $d ] || continue
for f in `find $d -type f`
do
[ -f "$f" ] || continue
[ "`basename $f`" = "dir" ] && continue
# decompress manpage by "cat"ing it, this allows decompression of
# hardlinked manpages and allows gunzip of a compressed page which is
# actually called "man.1" and not "man.1.gz", something it won't do
# when operating directly on file.
# this overcomes installs that create (un)compressed pages with names
# that don't correspond with the compression.
# this is done to a temporary file so we can detect hardlinks to
# original file.
b=`echo $f | sed -e 's/\.Z$//;s/\.gz$//;s/\.bz2$//'`
cp -p $f $b.tmp # setup up permissions on our new file
cat $f | gunzip -c 2>/dev/null >$b.tmp || {
cat $f | bunzip2 -c 2>/dev/null >$b.tmp || {
cat $f >$b.tmp
}
}
$COMPRESS $b.tmp
# find any hard links to the old manpage and link to the new one..
inode=`ls -i $f | awk '{ print $1 }'`
others=`find $d -type f -inum $inode`
if [ -n "$others" ]; then
for afile in $others ; do
[ "$afile" = "$f" ] && continue
rm -f ${TRANSLROOT}/${afile} ${afile}
afile=`echo $afile | sed -e 's/\.Z$//;s/\.gz$//;s/\.bz2$//'`
ln $b.tmp$COMPRESS_EXT $afile$COMPRESS_EXT
done
fi
rm -f ${TRANSLROOT}/${f} ${f}
mv $b.tmp$COMPRESS_EXT $b$COMPRESS_EXT
done
for f in `find $d -type l`
do
l=`ls -l $f | awk '{ print $11 }' | sed -e 's/\.gz$//' -e 's/\.bz2$//' -e 's/\.Z$//'`
rm -f ${TRANSLROOT}/${f}
b=`echo $f | sed -e 's/\.gz$//' -e 's/\.bz2$//' -e 's/\.Z$//'`
ln -sf $l$COMPRESS_EXT $b$COMPRESS_EXT
done
done
okfail
fi
################################
# End of man pages compressing #
##############################################################################
# Now we get the TRUE list of files from the directory listing (kind of)
# of the BUILD_DIR. This is the true one simply because THESE are the files
# that will actually get packaged.
echo
echogn "Building file list..."
rm ${TMP_DIR}/newfiles
cd $BUILD_DIR
$TAR -cpf - . | $TAR -f - -t 2>&1 | sed -e 's#^\./#/#' | egrep -v "^/$" > ${TMP_DIR}/newfiles
okfail
# Do we have a postinstall script?
PINST_EXISTS=0
[ -f "${DIRECTORIO_FUENTE}/postinstall-pak" ] && PINST_EXISTS=1
##############################################################################
# Identify shared libraries #
#############################
if [ $ADD_SO -eq 1 ]; then
# Here we identify the shared libraries locations so we can add them
# to /etc/ld.so.conf file if they're not already there. This will be done
# in the postinstall script.
cat ${TMP_DIR}/newfiles | while read libfile; do
FILETYPE=`file $libfile`
if echo /$FILETYPE | grep -e ".*ELF.*hared.*bject" &> /dev/null; then
echo `dirname $libfile` >> ${TMP_DIR}/libdirs
fi
done
# Did we find any libdirs?
if [ -f ${TMP_DIR}/libdirs ]; then
echo
echog "Shared libraries found. Adding them to the postinstall script."
# If we have a pre-existing postinstall-pak we save it
if [ $PINST_EXISTS -gt 0 ]; then
mv "${DIRECTORIO_FUENTE}/postinstall-pak" "${DIRECTORIO_FUENTE}/postinstall-pak.tmp"
PINST_EXISTS=1
fi
if ! [ $PINST_EXISTS -gt 0 ]; then
cat << EOF > "${DIRECTORIO_FUENTE}/postinstall-pak"
#!/bin/sh
#
# postinstall script, created by checkinstall-${CHECKINSTALL_VERSION}
#
EOF
fi
echo "echo" >> "${DIRECTORIO_FUENTE}/postinstall-pak"
cat ${TMP_DIR}/libdirs | while read libdir; do
(
echo "if ! egrep \"^/${libdir} *$\" /etc/ld.so.conf &> /dev/null; then"
echo " echo \"Adding \"/$libdir\" to /etc/ld.so.conf\""
echo " echo /$libdir >> /etc/ld.so.conf"
echo fi
) >> "${DIRECTORIO_FUENTE}/postinstall-pak"
done
echo ldconfig >> "${DIRECTORIO_FUENTE}/postinstall-pak"
# If we had an existing postinstall-pak, append it to the new one
if [ -f "${DIRECTORIO_FUENTE}/postinstall-pak.tmp" ]; then
cat "${DIRECTORIO_FUENTE}/postinstall-pak.tmp" >> "${DIRECTORIO_FUENTE}/postinstall-pak"
fi
fi # End of did we find any libdirs?
fi
####################################
# End of Identify shared libraries #
##############################################################################
##############################################################################
# Identify kernel modules #
###########################
# Find out if we installed a kernel module, and if so run depmod in the postinst
# and delete the files depmod touches (they conflict with other packages)
# These files are modules.* inside the kernel modules directory.
DEPFILES=$(cat ${TMP_DIR}/newfiles | grep -E 'modules\.(dep|pcimap|usbmap|ccwmap|ieee1394map|isapnpmap|inputmap|ofmap|seriomap|alias|symbols)' )
if [ ! -z "$DEPFILES" ] ; then
echo
echog "Kernel modules found. Calling depmod in the postinstall script"
# Delete references to the depmod generated files
sed -r -i -e '\,modules\.(dep|pcimap|usbmap|ccwmap|ieee1394map|isapnpmap|inputmap|ofmap|seriomap|alias|symbols),d' ${TMP_DIR}/newfiles
# And the files themselves
for file in $DEPFILES ; do
rm ${BUILD_DIR}/$file
done
# Find out the kernel version.
# Ugly hack, but works in Debian and should on many other systems.
# The file must be /any/dir/<version>/modules.*
KVER=$(echo $DEPFILES | awk '{print $1}' | sed -e 's|/modules\..*||' | xargs basename )
# Add depmod to the postinst
# This will be redundant if we already have a postinstall script.
# Nevertheless, it is harmless.
echo "#!/bin/sh" >> "${DIRECTORIO_FUENTE}/postinstall-pak"
echo "#" >> "${DIRECTORIO_FUENTE}/postinstall-pak"
echo "# postinstall script, created by checkinstall-${CHECKINSTALL_VERSION}" >> "${DIRECTORIO_FUENTE}/postinstall-pak"
echo "#" >> "${DIRECTORIO_FUENTE}/postinstall-pak"
echo "depmod $KVER" >> "${DIRECTORIO_FUENTE}/postinstall-pak"
fi
##################################
# End of Identify kernel modules #
##############################################################################
cd "$DIRECTORIO_FUENTE"
FAILED=0
case $INSTYPE in
##############################################################################
# Create Slackware compatible tarball #
#######################################
s|S)
# The new Slackware naming scheme
SLACK_PKG_BASENAME="${PKG_BASENAME}-${ARCHITECTURE}-${RELEASE}"
FAILED=0
# If we're not installing the package then there is no problem if
# installpkg is not in our execution path
if [ $INSTALL -gt 0 ]; then
# Verify that we have the "installpkg" command in our path
INSTALLPKG_PATH=`which installpkg 2> /dev/null`
if ! [ -x "$INSTALLPKG_PATH" ]; then
echo
echog "*** The \"installpkg\" program is not in your PATH!"
echo
echog "*** Slackware package creation aborted"
FAILED=1
fi
fi
if ! [ $FAILED -gt 0 ]; then
# Create the Slackware installation script
echo
echogn "Preparing Slackware install directory..."
mkdir -p ${BUILD_DIR}/install
touch ${BUILD_DIR}/install/doinst.sh
okfail
echo
echogn "Writing package description..."
# If we're building for Slackware 8.1+, then we use the new description
# file format
if [ $NEW_SLACK -gt 0 ]; then
cat << EOF > ${BUILD_DIR}/install/slack-desc
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description. Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in. You must make
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
EOF
# Calculate the spaces before the "handy-ruler"
HR_SPACES=`echo $NAME | wc -c| awk '{ for (i=1;substr ($0,i,1) ~ /[[:blank:]]/ ;i++); print substr ($0,i);}'`
awk -v S=$HR_SPACES 'BEGIN {ORS=""; for (i=1; i < S; i++) print " ";}' >> ${BUILD_DIR}/install/slack-desc
echo "|-----handy-ruler------------------------------------------------------|" >> ${BUILD_DIR}/install/slack-desc
# Add the prefixed description
cat description-pak | while read line; do
echo "$NAME: $line" >> ${BUILD_DIR}/install/slack-desc
done
okfail
# End of NEW_SLACK block
else
#
# Generate the description-installing doinst.sh
#
if [ $AUTODOINST -eq 1 ]; then
echo "PACKAGE DESCRIPTION:" > ${BUILD_DIR}/install/description
cat description-pak | while read line; do
echo $line >> ${BUILD_DIR}/install/description
done
okfail
echo
echogn "Writing Slackware install script..."
cat << EOF >> ${BUILD_DIR}/install/doinst.sh
#
# doinst.sh, auto-generated by checkinstall-${CHECKINSTALL_VERSION}
#
echo
cat /install/description
sed '/PACKAGE LOCATION/r /install/description' < "/var/log/packages/$SLACK_PKG_BASENAME" > description.tmp
mv description.tmp "/var/log/packages/${SLACK_PKG_BASENAME}"
rm /install/description
EOF
okfail
fi
fi # End of description creation
# If we have a Slackware install script already, add it to this one
# and force an interactive slackware install script
for file in postinstall-pak install-pak; do
if [ -f $file ]; then
INSTALL_PAK=${file}
fi
done
if [ -f "$INSTALL_PAK" ]; then
echo
# We want to say this only if we actually had a preexisting postinstall-pak
if [ $PINST_EXISTS -gt 0 ]; then
echogn "Appending your script to the main install script..."
cat $INSTALL_PAK >> ${BUILD_DIR}/install/doinst.sh
okfail
echo
else
cat $INSTALL_PAK >> ${BUILD_DIR}/install/doinst.sh
fi
SHOW_SLACK_INSTALL=1
fi
echo
echogn "Creating package ${SLACK_PKG_BASENAME}..."
cd $BUILD_DIR
chmod 755 $BUILD_DIR
# Make the "TAR" variable available to MAKEPKG
export TAR
if [ $SHOW_MAKEPKG -gt 0 ]; then
$MAKEPKG $MAKEPKG_FLAGS "${SLACK_PKG_BASENAME}.tgz"
okfail
else
$MAKEPKG $MAKEPKG_FLAGS "${SLACK_PKG_BASENAME}.tgz" &> /dev/null
okfail
fi
mv "${SLACK_PKG_BASENAME}.tgz" "$DIRECTORIO_FUENTE"
#
# If requested, we install the package to register it in Slackware's
# installed packages list so we can list it's contents with pkgtool
# or remove it with removepkg
#
if [ "$INSTALL" = "1" ]; then
# Go back to where we started
cd "$DIRECTORIO_FUENTE"
echo
if [ $SHOW_SLACK_INSTALL -eq 0 ]; then
echogn "Installing package..."
installpkg "${SLACK_PKG_BASENAME}.tgz" &> ${TMP_DIR}/slackinstall.log
okfail
[ $? -gt 0 ] && FAILED=1
else
echog "========================= Installation results ==========================="
echo
installpkg "${SLACK_PKG_BASENAME}.tgz"
if [ $? -gt 0 ]; then
FAILED=1
else
echo
echog "======================== Installation successful =========================="
fi
fi
if [ $FAILED -eq 1 ]; then
echo
echog "*** Failed to install the package"
echo
if [ $SHOW_SLACK_INSTALL -eq 0 ]; then
echogn "Do you want to see the log file? "
if yorn ; then
$PAGER ${TMP_DIR}/slackinstall.log
cleanup
exit 1
fi
fi
fi
else
echo
echog "NOTE: The package will not be installed."
fi
PKG_LOCATION="${DIRECTORIO_FUENTE}/${SLACK_PKG_BASENAME}.tgz"
INSTALLSTRING="installpkg ${SLACK_PKG_BASENAME}.tgz"
REMOVESTRING="removepkg ${SLACK_PKG_BASENAME}"
fi
;;
#################################
# End Slackware package section #
##############################################################################
##############################################################################
# RPM package installation #
############################
r|R)
FAILED=0
# Verify that we have the rpm command in our path
RPM_PATH=`which rpm 2> /dev/null`
if ! [ -x "$RPM_PATH" ]; then
echo
echog "*** The \"rpm\" program is not in your PATH!"
echo
echog "*** RPM package creation aborted"
FAILED=1
fi
if ! [ $FAILED -gt 0 ]; then
# Identify the rpm version
RPM_VERSION=`rpm --version | awk '{ print $3 }'`
RPM_MAJOR_VERSION=`echo $RPM_VERSION | cut -f1 -d"."`
RPM_MINOR_VERSION=`echo $RPM_VERSION | cut -f2 -d"."`
RPM_PATCH_LEVEL=`echo $RPM_VERSION | cut -f3 -d"."`
if [ "$RPM_PATCH_LEVEL" = "" ]; then
RPM_PATCH_LEVEL=0
fi
if [ $DEBUG -gt 0 ]; then
echo "debug: RPM_VERSION=${RPM_VERSION}"
echo "debug: RPM_MAJOR_VERSION=$RPM_MAJOR_VERSION"
echo "debug: RPM_MINOR_VERSION=$RPM_MINOR_VERSION"
echo "debug: RPM_PATCH_LEVEL=$RPM_PATCH_LEVEL"
echo "debug: RPM_IU=$RPM_IU"
fi
# AFAIK, the only rpm versions that accept
# "--target=arch" instead of "--target arch"
# are 3.x < version < 4.0.3
if [ $RPM_MAJOR_VERSION -eq 4 -a $RPM_PATCH_LEVEL -lt 3 ]; then
RPM_TARGET_FLAG="--target="
else
RPM_TARGET_FLAG="--target "
fi
# rpmbuild seems to exist only in RPM 4
if [ $RPM_MAJOR_VERSION -eq 4 ]; then
RPMBUILD="rpmbuild"
else
RPMBUILD="rpm"
fi
if [ "$RPMBUILD" = "rpmbuild" -a ! -x "`which rpmbuild 2> /dev/null`" ]; then
echo
echo "*** The \"rpmbuild\" program is not in your PATH!"
echo
echo "*** RPM package creation aborted"
FAILED=1
fi
if ! [ $FAILED -gt 0 ]; then
# Find out the RPM source directory path
if ! [ "$RPMSOURCEDIR" ]; then
if [ $RPM_MAJOR_VERSION -eq 3 -a $RPM_PATCH_LEVEL -ge 3 -o $RPM_MAJOR_VERSION -gt 3 ]; then
RPMSOURCEDIR="`rpm --eval=%_topdir`"
else
RPMSOURCEDIR="NOT-FOUND"
for directory in packages OpenLinux redhat RedHat rpm RPM "" ; do
[ -d /usr/src/${directory}/SOURCES ] && RPMSOURCEDIR="/usr/src/${directory}"
done
fi
fi
[ $DEBUG -gt 0 ] && echo "debug: RPMSOURCEDIR=$RPMSOURCEDIR"
while ! [ -d "$RPMSOURCEDIR/SOURCES" ]; do
echo
echogn "%s has no SOURCES directory. Please write the path to\nthe RPM source directory tree: " "$RPMSOURCEDIR"
read RPMSOURCEDIR
! [ "$RPMSOURCEDIR" ] && RPMSOURCEDIR="NOT-FOUND"
done
# We'll write a basic spec file
if ! [ -f "$SPEC_PATH" ]; then
# If the buildroot path has spaces then we'll use the BUILD_DIR instead.
# rpm can't have a buildroot path with spaces in it (Bug?)
#
# This is obviously a hack, I hope we can do it the right way when rpm is
# fixed.
if ( echo "$DIRECTORIO_FUENTE" | grep " " &> /dev/null ); then
BROOTPATH="${DIRECTORIO_FUENTE}/buildroot"
else
BROOTPATH=$BUILD_DIR
fi
# Here comes the .spec file:
cat > "$SPEC_PATH" << EOF
Summary: $SUMMARY
Name: $NAME
Version: $VERSION
Release: $RELEASE
License: $LICENSE
Packager: checkinstall-$CHECKINSTALL_VERSION
Group: $PKG_GROUP
BuildRoot: $BROOTPATH
Provides: $PROVIDES
Requires: $REQUIRES,/bin/sh
%description
EOF
cat description-pak >> "$SPEC_PATH"
# Use the preinstall-pak script if we have it
if [ -f preinstall-pak ]; then
echo >> "$SPEC_PATH"
echo '%pre' >> "$SPEC_PATH"
cat preinstall-pak >> "$SPEC_PATH"
fi
# Use the postinstall-pak script if we have it
if [ -f postinstall-pak ]; then
echo >> "$SPEC_PATH"
echo '%post' >> "$SPEC_PATH"
cat postinstall-pak >> "$SPEC_PATH"
fi
# Use the preremove-pak script if we have it
if [ -f preremove-pak ]; then
echo >> "$SPEC_PATH"
echo '%preun' >> "$SPEC_PATH"
cat preremove-pak >> "$SPEC_PATH"
fi
# Use the postremove-pak script if we have it
if [ -f postremove-pak ]; then
echo >> "$SPEC_PATH"
echo '%postun' >> "$SPEC_PATH"
cat postremove-pak >> "$SPEC_PATH"
fi
cat >> "$SPEC_PATH" << EOF
%files
EOF
# Prepare directories to be included in the .spec file
mv ${TMP_DIR}/newfiles ${TMP_DIR}/newfiles.tmp
cat ${TMP_DIR}/newfiles.tmp | while read line; do
[ -d "${BUILD_DIR}/${line}" -o -L "${BUILD_DIR}/${line}" ] && echo -n "%dir " >> ${TMP_DIR}/newfiles
echo "\"/${line}\"" >> ${TMP_DIR}/newfiles
done
# Append the file list to the .spec file
cat ${TMP_DIR}/newfiles >> "$SPEC_PATH"
fi
# If requested with --review-spec, we run an editor on the .spec file
if [ $REVIEW_SPEC -gt 0 ]; then
echo
echog "You requested to review the .spec file for this package.\nNow you\'ll have the chance to review and optionally modify this file."
echo
echog "Press ENTER to continue."
read junk
$VISUAL "$SPEC_PATH"
fi
BUILDROOT=`egrep '^[Bb]uild[Rr]oot' < "$SPEC_PATH" | cut -f2 -d:| sed 's/^ *//g'| sed 's/ *$//g'` # The sed commands remove leading/trailing whitespaces
# We make sure that we have a valid RELEASE number
! [ "$RELEASE" ] && RELEASE=`egrep '^Release:' < "$SPEC_PATH"|cut -f2 -d: | awk '{ for (i=1;substr ($0,i,1) ~ /[[:blank:]]/ ;i++); print substr ($0,i); }'`
[ $DEBUG -gt 0 ] && echo "debug: BUILDROOT=$BUILDROOT"
! [ -d "$BUILDROOT" ] && ln -s "$BUILD_DIR" "$BUILDROOT"
# We make sure that the architecture directory exists
! [ -d "${RPMSOURCEDIR}/RPMS/${ARCHITECTURE}" ] && mkdir -p "${RPMSOURCEDIR}/RPMS/${ARCHITECTURE}"
mkdir "${TMP_DIR}/$PKG_BASENAME"
cd $TMP_DIR
$TAR -cz -f "${RPMSOURCEDIR}/SOURCES/${PKG_BASENAME}.tgz" "$PKG_BASENAME"
rm -rf "${TMP_DIR}/$PKG_BASENAME"
cd "$DIRECTORIO_FUENTE"
echo
echogn "Building RPM package..."
$RPMBUILD -bb ${RPM_TARGET_FLAG}${ARCHITECTURE} "$SPEC_PATH" --buildroot="$BROOTPATH" &> ${TMP_DIR}/rpmbuild.log
okfail
if [ $? -gt 0 ]; then
echo
echog "*** Failed to build the package"
echo
echogn "Do you want to see the log file? "
if yorn ; then
$PAGER ${TMP_DIR}/rpmbuild.log
fi
FAILED=1
fi
RPMPKG="${RPMSOURCEDIR}/RPMS/${ARCHITECTURE}/${PKG_BASENAME}-${RELEASE}.${ARCHITECTURE}.rpm"
# Check for the old RPMFLAGS
if [ "$RPMFLAGS" ]; then
echo
echog "Warning: the use of RPMFLAGS is deprecated.\nWarning: You should now use RPM_FLAGS,\nWarning: please update your checkinstallrc file."
fi
if ! [ $FAILED -gt 0 ]; then
if [ "$INSTALL" = "1" ]; then
echo
echogn "Installing RPM package..."
rpm -$RPM_IU $RPM_FLAGS "${RPMPKG}" &> ${TMP_DIR}/rpminstall.log
okfail
if [ $? -gt 0 ]; then
echo
echog "*** Failed to install the package"
echo
echogn "Do you want to see the log file? "
if yorn ; then
$PAGER ${TMP_DIR}/rpminstall.log
fi
FAILED=1
fi
else
echo
echog "NOTE: The package will not be installed"
fi
fi
if ! [ $FAILED -gt 0 ]; then
PKG_LOCATION="$RPMPKG"
INSTALLSTRING="rpm -i `basename "$RPMPKG"`"
REMOVESTRING="rpm -e ${PKG_BASENAME}-${RELEASE}"
fi
fi # End of the "no rpmbuild in the path" if
fi # End of the "no rpm in the path" if
;;
#################################
# End RPM package section #
##############################################################################
##############################################################################
# Debian package installation #
################################
d|D)
# As we said before:
PKG_BASENAME="$NAME"
# maybe PKG_BASENAME should be defined locally for all the install
# types, and not only on debian...
FAILED=0
# Verify that we have the dpkg command in our path
DPKG_PATH=`which dpkg 2> /dev/null`
if ! [ -x "$DPKG_PATH" ]; then
echo
echog "*** The \"dpkg\" program is not in your PATH!"
echo
echog "*** Debian package creation aborted"
FAILED=1
fi
if ! [ $FAILED -gt 0 ]; then
cd "$DIRECTORIO_FUENTE"
# We'll write a basic Debian control file
mkdir $BUILD_DIR/DEBIAN
cat << EOF >> $BUILD_DIR/DEBIAN/control
Package: $PKG_BASENAME
Priority: extra
Section: $PKG_GROUP
Installed-Size: `du -s $BUILD_DIR | awk '{print $1}'`
Maintainer: $MAINTAINER
Architecture: $ARCHITECTURE
Version: ${VERSION}-${RELEASE}
Depends: $REQUIRES
Provides: $PROVIDES
Conflicts: $CONFLICTS
Replaces: $REPLACES
Description: $SUMMARY
EOF
# Add the description
cat "$DIRECTORIO_FUENTE/description-pak"| egrep -v "$SUMMARY|^[ ]*$" | while read line; do
echo " "$line >> $BUILD_DIR/DEBIAN/control
done
# Remove empty fields
sed -i -e '/^[A-Z][a-z]\+:\s\+$/d' $BUILD_DIR/DEBIAN/control
# Use the preinstall-pak script if we have it
if [ -f preinstall-pak ]; then
cat preinstall-pak > $BUILD_DIR/DEBIAN/preinst
chmod 755 $BUILD_DIR/DEBIAN/preinst
fi
# Use the postinstall-pak script if we have it
if [ -f postinstall-pak ]; then
cat postinstall-pak > $BUILD_DIR/DEBIAN/postinst
chmod 755 $BUILD_DIR/DEBIAN/postinst
fi
# Use the preremove-pak script if we have it
if [ -f preremove-pak ]; then
cat preremove-pak > $BUILD_DIR/DEBIAN/prerm
chmod 755 $BUILD_DIR/DEBIAN/prerm
fi
# Use the postremove-pak script if we have it
if [ -f postremove-pak ]; then
cat postremove-pak > $BUILD_DIR/DEBIAN/postrm
chmod 755 $BUILD_DIR/DEBIAN/postrm
fi
# Tag files in /etc to be conffiles
find $BUILD_DIR/etc -type f 2> /dev/null | sed -e "s,$BUILD_DIR,," | \
grep -v '^/etc$' > $BUILD_DIR/DEBIAN/conffiles
# The package will be saved here (ignores <epoch>: prefix):
DEBPKG="${DIRECTORIO_FUENTE}/${NAME}_`echo ${VERSION} | sed -e 's/^[0123456789]*://'`-${RELEASE}_${ARCHITECTURE}.deb"
# This one is for 2.2 "Potato" (or older) style packages
#DEBPKG="${DIRECTORIO_FUENTE}/${NAME}_${VERSION}-${RELEASE}.deb"
if [ $DEBUG -gt 0 ]; then
echo
echo debug: PKG_BASENAME=${PKG_BASENAME}
echo debug: BUILD_DIR=${BUILD_DIR}
echo debug: DEBPKG=${DEBPKG}
echo debug: dpkg command:
echo " \"dpkg-deb -b $BUILD_DIR $DEBPKG &> ${TMP_DIR}/dpkgbuild.log\""
fi
# If requested with --review-control, we run an editor on the control file
if [ $REVIEW_CONTROL -gt 0 ]; then
echo
echog "You requested to review the control file for this package.\nNow you'll have the chance to review and optionally modify this file."
echo
echog "Press ENTER to continue."
read junk
$VISUAL ${BUILD_DIR}/DEBIAN/control
fi
echo
echogn "Building Debian package..."
dpkg-deb -b $BUILD_DIR "$DEBPKG" &> ${TMP_DIR}/dpkgbuild.log
okfail
if [ $? -gt 0 ]; then
echo
echog "*** Failed to build the package"
echo
echogn "Do you want to see the log file? "
if yorn ; then
$PAGER ${TMP_DIR}/dpkgbuild.log
fi
FAILED=1
fi
if ! [ $FAILED -gt 0 ]; then
if [ "$INSTALL" = "1" ]; then
echo
echogn "Installing Debian package..."
dpkg -i $DPKG_FLAGS "$DEBPKG" &> ${TMP_DIR}/dpkginstall.log
okfail
if [ $? -gt 0 ]; then
echo
echog "*** Failed to install the package"
echo
echogn "Do you want to see the log file? "
if yorn ; then
$PAGER ${TMP_DIR}/dpkginstall.log
fi
FAILED=1
fi
else
echo
echog "NOTE: The package will not be installed"
fi
fi
if ! [ $FAILED -gt 0 ]; then
PKG_LOCATION="$DEBPKG"
INSTALLSTRING="dpkg -i `basename "$DEBPKG"`"
REMOVESTRING="dpkg -r ${PKG_BASENAME}"
fi
fi
;;
################################
# End Debian package section #
##############################################################################
esac
# If we have a package repository set, move the package there
if ! [ $FAILED -gt 0 ]; then
if [ "$PAK_DIR" ]; then
if ! [ -d "$PAK_DIR" ]; then
echo
echogn "The package storage directory [ %s ]\ndoesn\'t exist. Do you want to create it?" "$PAK_DIR"
if yorn ; then
echo
echogn "Creating package storage directory..."
mkdir -p "$PAK_DIR" &> ${TMP_DIR}/mkpakdir.log
okfail
if [ $? -gt 0 ]; then
echo
echog "*** Unable to create %s" "$PAK_DIR"
echo "*** `cat ${TMP_DIR}/mkpakdir.log`"
echo
fi
fi
fi
if [ -d "$PAK_DIR" ]; then
echo
echogn "Transferring package to %s..." "$PAK_DIR"
mv "$PKG_LOCATION" "${PAK_DIR}" &> $TMP_DIR/transfer.log
okfail
if [ $? -gt 0 ]; then
echo
echogn "*** Transfer failed:"
cat $TMP_DIR/transfer.log
echo
else
# Update the package location
PKG_LOCATION="${PAK_DIR}/`basename "$PKG_LOCATION"`"
fi
else
echo
echog "There\'s no package storage directory, the package\nwill be stored at the default location."
fi
fi
fi
#
# Remove trash from TMP_DIR
#
echo
echogn "Erasing temporary files..."
# Preserve the Debian control file if debug is on
if [ $DEBUG -gt 0 ]; then
if [ -d ${BUILD_DIR}/DEBIAN ]; then
mv ${BUILD_DIR}/DEBIAN $TMP_DIR
fi
fi
[ $DEBUG -lt 2 ] && rm -rf ${BUILD_DIR}
rm -f checkinstall-debug*
rm -f "$BUILDROOT"
rm -f "${RPMSOURCEDIR}/SOURCES/${PKG_BASENAME}.tgz"
okfail
# Delete doc-pak directory
if [ $DEL_DOCPAK -gt 0 ]; then
echo
echogn "Deleting doc-pak directory..."
rm -rf doc-pak
okfail
fi
# Preserve the spec file if debugging is on
[ $DEBUG -gt 0 ] && [ -f "$SPEC_PATH" ] && cp "$SPEC_PATH" $TMP_DIR
# Delete spec file
[ $DEL_SPEC -gt 0 ] && rm -f "$SPEC_PATH"
# Delete the package description file
[ $DEL_DESC -gt 0 ] && rm -f description-pak
# If we had a pre-existing postinstall-pak, we keep it as it was.
# If PINST_EXISTS=0 and there is a postinstall-pak file, then
# it's the one we created and has to be deleted
if [ $PINST_EXISTS -eq 0 ]; then
rm -f "${DIRECTORIO_FUENTE}/postinstall-pak"
fi
if [ -f "${DIRECTORIO_FUENTE}/postinstall-pak.tmp" ]; then
mv "${DIRECTORIO_FUENTE}/postinstall-pak.tmp" "${DIRECTORIO_FUENTE}/postinstall-pak"
fi
# If we have a backup, pack it up
rm -rf ${TMP_DIR}/BACKUP/no-backup &> /dev/null
ls ${TMP_DIR}/BACKUP/* &> /dev/null
if [ $? -eq 0 ]; then
cd ${TMP_DIR}/BACKUP
echo
echogn "Writing backup package..."
# We do this for the same reason as in restore_backup
FILES=$(ls -A)
$TAR -cpf - $FILES | gzip -9 > "${DIRECTORIO_FUENTE}/backup-`date +%m%d%Y%H%M`-pre-${PKG_BASENAME}.tgz"
okfail
fi
if [ $DEBUG -eq 0 ]; then
echo
echogn "Deleting temp dir..."
rm -rf ${TMP_DIR}
okfail
echo
else
echo
echogn "Building debug information package..."
cd ${TMP_DIR}
echo `uname -a` > sysinfo
echo `rpm --version` >> sysinfo
$TAR -cpzvf "${DIRECTORIO_FUENTE}/checkinstall-debug.$$.tgz" * &> /dev/null
okfail
fi
if ! [ $FAILED -gt 0 ]; then
if [ "${INSTALL}" = "1" ]; then
echo
echo '**********************************************************************'
echo
echog " Done. The new package has been installed and saved to\n\n %s\n\n You can remove it from your system anytime using: \n\n %s" "$PKG_LOCATION" "$REMOVESTRING"
echo
echo '**********************************************************************'
echo
else
echo
echo '**********************************************************************'
echo
echog " Done. The new package has been saved to\n\n %s\n You can install it in your system anytime using: \n\n %s" "$PKG_LOCATION" "$INSTALLSTRING"
echo
echo '**********************************************************************'
echo
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment