summaryrefslogtreecommitdiff
path: root/scripts/makepkg.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/makepkg.sh.in')
-rw-r--r--scripts/makepkg.sh.in272
1 files changed, 142 insertions, 130 deletions
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 175edb8f..5bdc5bc9 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -33,18 +33,26 @@
export TEXTDOMAIN='pacman'
export TEXTDOMAINDIR='@localedir@'
+# file -i does not work on Mac OSX unless legacy mode is set
+export COMMAND_MODE='legacy'
+
+# when fileglobbing, we want * in an empty directory to expand to the null
+# string rather than itself
+shopt -s nullglob
+
myver='@PACKAGE_VERSION@'
confdir='@sysconfdir@'
startdir="$PWD"
srcdir="$startdir/src"
pkgdir="$startdir/pkg"
+known_options=('strip' 'docs' 'libtool' 'emptydirs' 'zipman' 'ccache' 'distcc' 'makeflags' 'force')
+readonly -a known_options
# Options
ASROOT=0
CLEANUP=0
CLEANCACHE=0
DEP_BIN=0
-DEP_SRC=0
FORCE=0
INFAKEROOT=0
GENINTEG=0
@@ -182,25 +190,6 @@ check_option() {
return
fi
- # BEGIN DEPRECATED
- # TODO: This code should be removed in the next release of makepkg.
- local needle=$(echo $1 | tr [:upper:] [:lower:])
- local opt
- for opt in ${options[@]}; do
- opt=$(echo $opt | tr [:upper:] [:lower:])
- if [ "$opt" = "no$needle" ]; then
- warning "$(gettext "Options beginning with 'no' will be deprecated in the next version of makepkg!")"
- plain "$(gettext "Please replace 'no' with '!': %s -> %s.")" "no$needle" "!$needle"
- echo 'n' # Disabled
- return
- elif [ "$opt" = "keepdocs" -a "$needle" = "docs" ]; then
- warning "$(gettext "Option 'keepdocs' may not work as intended. Please replace with 'docs'.")"
- echo 'y' # Enabled
- return
- fi
- done
- # END DEPRECATED
-
# fall back to makepkg.conf options
ret=$(in_opt_array "$1" ${OPTIONS[@]})
if [ "$ret" != '?' ]; then
@@ -299,6 +288,20 @@ get_downloadclient() {
echo "$agent"
}
+get_downloadcmd() {
+ local dlagent=$1
+ local netfile=$2
+ local file=$3
+
+ if echo "$dlagent" | grep -q "%u" ; then
+ local dlcmd=$(echo "$dlagent" | sed "s|%o|$file.part|" | sed "s|%u|$netfile|")
+ else
+ local dlcmd="$dlagent $netfile"
+ fi
+
+ echo "$dlcmd"
+}
+
check_deps() {
[ $# -gt 0 ] || return
@@ -325,7 +328,7 @@ handledeps() {
striplist="$striplist $depstrip"
done
- if [ "$DEP_SRC" = "0" -a "$DEP_BIN" = "0" ]; then
+ if [ "$DEP_BIN" = "0" ]; then
return $R_DEPS_MISSING
fi
@@ -344,40 +347,6 @@ handledeps() {
error "$(gettext "Pacman failed to install missing dependencies.")"
exit 1 # TODO: error code
fi
- elif [ "$DEP_SRC" = "1" ]; then
- msg "$(gettext "Building missing dependencies...")"
-
- # install missing deps by building them from source.
- # we look for each package name in $SRCROOT and build it.
- if [ "$SRCROOT" = "" ]; then
- error "$(gettext "Source root cannot be found - please make sure it is specified in %s.")" "$confdir/makepkg.conf"
- exit 1 # TODO: error code
- fi
-
- # TODO: handle version comparators (eg, glibc>=2.2.5)
- for dep in $striplist; do
- local candidates="$(find "$SRCROOT" -type d -name "$dep")"
- if [ "$candidates" = "" ]; then
- error "$(gettext "Could not find '%s' under %s")" "$dep" "$SRCROOT"
- exit 1 # TODO: error code
- fi
-
- local makepkg_opts='-i -c -b'
- [ "$RMDEPS" = "1" ] && makepkg_opts="$makepkg_opts -r"
- [ "$ASROOT" = "1" ] && makepkg_opts="$makepkg_opts --asroot"
- local ret packagedir
- for packagedir in $candidates; do
- if [ -f "$packagedir/$BUILDSCRIPT" ]; then
- cd "$packagedir"
- ret=0
- PKGDEST="$PKGDEST" makepkg $makepkg_opts $PACMAN_OPTS || ret=$?
- [ $ret -eq 0 ] && continue 2
- fi
- done
-
- error "$(gettext "Failed to build '%s'")" "$dep"
- exit 1 # TODO: error code
- done
fi
# rerun any additional sh scripts found in /etc/profile.d/
@@ -407,7 +376,7 @@ resolve_deps() {
# check deps again to make sure they were resolved
deplist="$(check_deps $*)"
[ "$deplist" = "" ] && return $R_DEPS_SATISFIED
- elif [ "$DEP_BIN" = "1" -o "$DEP_SRC" = "1" ]; then
+ elif [ "$DEP_BIN" = "1" ]; then
error "$(gettext "Failed to install all missing dependencies.")"
fi
@@ -433,10 +402,17 @@ remove_deps() {
done
msg "Removing installed dependencies..."
+ local ret=0
if [ "$ASROOT" = "0" ]; then
- sudo pacman $PACMAN_OPTS -Rns $deplist
+ sudo pacman $PACMAN_OPTS -Rns $deplist || ret=$?
else
- pacman $PACMAN_OPTS -Rns $deplist
+ pacman $PACMAN_OPTS -Rns $deplist || ret=$?
+ fi
+
+ # Fixes FS#10039 - exit cleanly as package has built successfully
+ if [ $ret -ne 0 ]; then
+ warning "$(gettext "Failed to remove installed dependencies.")"
+ return 0
fi
}
@@ -456,11 +432,13 @@ download_sources() {
local file=$(strip_url "$netfile")
if [ -f "$startdir/$file" ]; then
msg2 "$(gettext "Found %s in build dir")" "$file"
- cp -s --remove-destination "$startdir/$file" "$srcdir/"
+ rm -f "$srcdir/$file"
+ ln -s "$startdir/$file" "$srcdir/"
continue
elif [ -f "$SRCDEST/$file" ]; then
msg2 "$(gettext "Using cached copy of %s")" "$file"
- cp -s --remove-destination "$SRCDEST/$file" "$srcdir/"
+ rm -f "$srcdir/$file"
+ ln -s "$SRCDEST/$file" "$srcdir/"
continue
fi
@@ -471,18 +449,22 @@ download_sources() {
fi
# find the client we should use for this URL
- local dlclient=$(get_downloadclient $netfile) || exit $?
+ local dlclient=$(get_downloadclient "$netfile") || exit $?
msg2 "$(gettext "Downloading %s...")" "$file"
# fix flyspray bug #3289
local ret=0
- $dlclient "$netfile" || ret=$?
+ $(get_downloadcmd "$dlclient" "$netfile" "$file") || ret=$?
if [ $ret -gt 0 ]; then
error "$(gettext "Failure while downloading %s")" "$file"
plain "$(gettext "Aborting...")"
exit 1
fi
- cp -s --remove-destination "$SRCDEST/$file" "$srcdir/"
+ if echo "$dlclient" | grep -q "%o" ; then
+ mv -f "$SRCDEST/$file.part" "$SRCDEST/$file"
+ fi
+ rm -f "$srcdir/$file"
+ ln -s "$SRCDEST/$file" "$srcdir/"
done
popd &>/dev/null
@@ -647,8 +629,8 @@ extract_sources() {
done
if [ $EUID -eq 0 ]; then
- # chown all source files to root.root
- chown -R root.root "$srcdir"
+ # change perms of all source files to root user & root group
+ chown -R 0:0 "$srcdir"
fi
}
@@ -716,37 +698,41 @@ tidy_install() {
rm -rf ${DOC_DIRS[@]}
fi
- msg2 "$(gettext "Compressing man pages...")"
- local manpage mandirs ext file link hardlinks hl
- mandirs="usr/man usr/share/man usr/local/man usr/local/share/man opt/*/man"
- find ${mandirs} -type f 2>/dev/null | while read manpage ; do
- # check file still exists (potentially compressed with hard link)
- if [ -f ${manpage} ]; then
- ext="${manpage##*.}"
- file="${manpage##*/}"
- if [ "$ext" != "gz" -a "$ext" != "bz2" ]; then
- # update symlinks to this manpage
- find ${mandirs} -lname "$file" 2>/dev/null | while read link ; do
- rm -f "$link"
- ln -sf "${file}.gz" "${link}.gz"
- done
- # find hard links and remove them
- # the '|| true' part keeps the script from bailing if find returned an
- # error, such as when one of the man directories doesn't exist
- hardlinks="$(find ${mandirs} \! -name "$file" -samefile "$manpage" 2>/dev/null)" || true
- for hl in ${hardlinks}; do
- rm -f "${hl}";
- done
- # compress the original
- gzip -9 "$manpage"
- # recreate hard links removed earlier
- for hl in ${hardlinks}; do
- ln "${manpage}.gz" "${hl}.gz"
- chmod 644 ${hl}.gz
- done
+ if [ "$(check_option zipman)" = "y" ]; then
+ msg2 "$(gettext "Compressing man pages...")"
+ local manpage mandirs ext file link hardlinks hl
+ mandirs="usr/man usr/share/man usr/local/man usr/local/share/man opt/*/man"
+ find ${mandirs} -type f 2>/dev/null |
+ while read manpage ; do
+ # check file still exists (potentially compressed with hard link)
+ if [ -f ${manpage} ]; then
+ ext="${manpage##*.}"
+ file="${manpage##*/}"
+ if [ "$ext" != "gz" -a "$ext" != "bz2" ]; then
+ # update symlinks to this manpage
+ find ${mandirs} -lname "$file" 2>/dev/null |
+ while read link ; do
+ rm -f "$link"
+ ln -sf "${file}.gz" "${link}.gz"
+ done
+ # find hard links and remove them
+ # the '|| true' part keeps the script from bailing if find returned an
+ # error, such as when one of the man directories doesn't exist
+ hardlinks="$(find ${mandirs} \! -name "$file" -samefile "$manpage" 2>/dev/null)" || true
+ for hl in ${hardlinks}; do
+ rm -f "${hl}";
+ done
+ # compress the original
+ gzip -9 "$manpage"
+ # recreate hard links removed earlier
+ for hl in ${hardlinks}; do
+ ln "${manpage}.gz" "${hl}.gz"
+ chmod 644 ${hl}.gz
+ done
+ fi
fi
- fi
- done
+ done
+ fi
if [ "$(check_option strip)" = "y" ]; then
@@ -790,7 +776,7 @@ create_package() {
else
local packager="Unknown Packager"
fi
- local size=$(du -sb | awk '{print $1}')
+ local size=$(du -sk | awk '{print $1 * 1024}')
# write the .PKGINFO file
msg2 "$(gettext "Generating .PKGINFO file...")"
@@ -849,7 +835,6 @@ create_package() {
local comp_files=".PKGINFO"
# check for an install script
- # TODO: should we include ${pkgname}.install if it exists and $install is unset?
if [ "$install" != "" ]; then
msg2 "$(gettext "Adding install script...")"
cp "$startdir/$install" .INSTALL
@@ -868,7 +853,7 @@ create_package() {
local pkg_file="$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}"
- if ! bsdtar -czf "$pkg_file" $comp_files $(ls); then
+ if ! bsdtar -czf "$pkg_file" $comp_files *; then
error "$(gettext "Failed to create package file.")"
exit 1 # TODO: error code
fi
@@ -940,14 +925,26 @@ create_xdelta() {
create_srcpackage() {
cd "$startdir"
+ if [ "$SOURCEONLY" = "2" ]; then
+ # get back to our src directory so we can begin with sources
+ mkdir -p "$srcdir"
+ cd "$srcdir"
+ download_sources
+ # we can only check checksums if we have all files
+ check_checksums
+ cd "$startdir"
+ fi
msg "$(gettext "Creating source package...")"
- local comp_files="$BUILDSCRIPT"
+ local srclinks="$(mktemp -d "$startdir"/srclinks.XXXXXXXXX)"
+ mkdir "${srclinks}"/${pkgname}
+
msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT"
+ ln -s "${startdir}/${BUILDSCRIPT}" "${srclinks}/${pkgname}/"
if [ "$install" != "" ]; then
if [ -f $install ]; then
msg2 "$(gettext "Adding install script...")"
- comp_files="$comp_files $install"
+ ln -s "${startdir}/$install" "${srclinks}/${pkgname}/"
else
error "$(gettext "Install script %s not found.")" "$install"
fi
@@ -955,14 +952,18 @@ create_srcpackage() {
if [ -f ChangeLog ]; then
msg2 "$(gettext "Adding %s...")" "ChangeLog"
- comp_files="$comp_files ChangeLog"
+ ln -s "${startdir}/ChangeLog" "${srclinks}/${pkgname}"
fi
- local i
- for i in ${source[@]}; do
- if [ -f $i ]; then
- msg2 "$(gettext "Adding %s...")" "$i"
- comp_files="$comp_files $i"
+ local netfile
+ for netfile in ${source[@]}; do
+ local file=$(strip_url "$netfile")
+ if [ -f $netfile ]; then
+ msg2 "$(gettext "Adding %s...")" "$netfile"
+ ln -s $netfile ${srclinks}/${pkgname}
+ elif [ "$SOURCEONLY" = "2" -a -f "$SRCDEST/$file" ]; then
+ msg2 "$(gettext "Adding %s...")" "$file"
+ ln -s "$SRCDEST/$file" "${srclinks}/${pkgname}/"
fi
done
@@ -970,10 +971,13 @@ create_srcpackage() {
# tar it up
msg2 "$(gettext "Compressing source package...")"
- if ! bsdtar -czf "$pkg_file" $comp_files; then
+ cd ${srclinks}
+ if ! bsdtar -czLf "$pkg_file" ${pkgname}; then
error "$(gettext "Failed to create source package file.")"
exit 1 # TODO: error code
fi
+ cd ${startdir}
+ rm -rf ${srclinks}
}
install_package() {
@@ -1071,7 +1075,6 @@ usage() {
echo
echo "$(gettext "Options:")"
printf "$(gettext " -A, --ignorearch Ignore incomplete arch field in %s")\n" "$BUILDSCRIPT"
- echo "$(gettext " -b, --builddeps Build missing dependencies from source")"
echo "$(gettext " -c, --clean Clean up work files after build")"
echo "$(gettext " -C, --cleancache Clean up source files from the cache")"
echo "$(gettext " -d, --nodeps Skip all dependency checks")"
@@ -1145,9 +1148,11 @@ SRCDEST=${_SRCDEST:-$SRCDEST}
SRCDEST=${SRCDEST:-$startdir} #default to $startdir if undefined
# Parse Command Line Options.
-OPT_SHORT="AbcCdefFghiLmop:rRsSV"
-OPT_LONG="ignorearch,asroot,builddeps,clean,cleancache,nodeps,noextract,force,forcever:,geninteg,help,holdver"
-OPT_LONG="$OPT_LONG,install,log,nocolor,nobuild,rmdeps,repackage,source,syncdeps,usesudo,version"
+OPT_SHORT="AbcCdefFghiLmop:rRsV"
+OPT_LONG="allsource,asroot,ignorearch,builddeps,clean,cleancache,nodeps"
+OPT_LONG="$OPT_LONG,noextract,force,forcever:,geninteg,help,holdver"
+OPT_LONG="$OPT_LONG,install,log,nocolor,nobuild,rmdeps,repackage,source"
+OPT_LONG="$OPT_LONG,syncdeps,version"
# Pacman Options
OPT_LONG="$OPT_LONG,noconfirm,noprogressbar"
OPT_TEMP="$(getopt -o "$OPT_SHORT" -l "$OPT_LONG" -n "$(basename "$0")" -- "$@" || echo 'GETOPT GO BANG!')"
@@ -1165,9 +1170,9 @@ while true; do
--noprogressbar) PACMAN_OPTS="$PACMAN_OPTS --noprogressbar" ;;
# Makepkg Options
+ --allsource) SOURCEONLY=2 ;;
--asroot) ASROOT=1 ;;
-A|--ignorearch) IGNOREARCH=1 ;;
- -b|--builddeps) DEP_SRC=1 ;;
-c|--clean) CLEANUP=1 ;;
-C|--cleancache) CLEANCACHE=1 ;;
-d|--nodeps) NODEPS=1 ;;
@@ -1188,11 +1193,6 @@ while true; do
--source) SOURCEONLY=1 ;;
-s|--syncdeps) DEP_BIN=1 ;;
- # BEGIN DEPRECATED
- -S|--usesudo)
- warning "$(gettext "Sudo is used by default now. The --usesudo option is deprecated!")" ;;
- # END DEPRECATED
-
-h|--help) usage; exit 0 ;; # E_OK
-V|--version) version; exit 0 ;; # E_OK
@@ -1276,7 +1276,7 @@ else
fi
# check for sudo if we will need it during makepkg execution
-if [ "$ASROOT" = "0" -a \( "$DEP_BIN" = "1" -o "$DEP_SRC" = "1" \
+if [ "$ASROOT" = "0" -a \( "$DEP_BIN" = "1" \
-o "$RMDEPS" = "1" -o "$INSTALL" = "1" \) ]; then
if [ ! "$(type -p sudo)" ]; then
error "$(gettext "Cannot find the sudo binary! Is sudo installed?")"
@@ -1293,13 +1293,6 @@ unset optdepends options noextract
if [ ! -f "$BUILDSCRIPT" ]; then
error "$(gettext "%s does not exist.")" "$BUILDSCRIPT"
exit 1
- #TODO this is an attempt at a generic way to unset all package specific
- #variables in a PKGBUILD
- #else
- # #this is fun.... we'll unset
- # for var in $(grep "=" $BUILDSCRIPT | sed "s|.*\(\<.*\>\)=.*|\1|g"); do
- # unset $var
- # done
fi
source "$BUILDSCRIPT"
@@ -1348,6 +1341,25 @@ if [ "$install" -a ! -f "$install" ]; then
exit 1
fi
+valid_options=1
+for opt in ${options[@]}; do
+ known=0
+ # check if option matches a known option or its inverse
+ for kopt in ${known_options[@]}; do
+ if [ "${opt}" = "${kopt}" -o "${opt}" = "!${kopt}" ]; then
+ known=1
+ fi
+ done
+ if [ $known -eq 0 ]; then
+ error "$(gettext "options array contains unknown option '%s'")" "$opt"
+ valid_options=0
+ fi
+done
+if [ $valid_options -eq 0 ]; then
+ exit 1
+fi
+unset valid_options opt known kopt
+
# We need to run devel_update regardless of whether we are in the fakeroot
# build process so that if the user runs makepkg --forcever manually, we
# 1) output the correct pkgver, and 2) use the correct filename when
@@ -1383,14 +1395,14 @@ if [ "$INFAKEROOT" = "1" ]; then
exit 0 # $E_OK
fi
-msg "$(gettext "Making package: %s")" "$pkgname $pkgver-$pkgrel ($(date))"
+msg "$(gettext "Making package: %s")" "$pkgname $pkgver-$pkgrel $CARCH ($(date))"
if [ $EUID -eq 0 ]; then
warning "$(gettext "Running makepkg as root...")"
fi
# if we are creating a source-only package, go no further
-if [ "$SOURCEONLY" = "1" ]; then
+if [ "$SOURCEONLY" != "0" ]; then
if [ -f "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}${SRCEXT}" \
-a "$FORCE" = "0" ]; then
error "$(gettext "A package has already been built. (use -f to overwrite)")"
@@ -1470,8 +1482,8 @@ else
mkdir -p "$pkgdir"
cd "$startdir"
- if [ $EUID -eq 0 ]; then
- # if we are root, then we don't need to recall makepkg with fakeroot
+ if [ "$(check_buildenv fakeroot)" != "y" -o $EUID -eq 0 ]; then
+ # if we are root or if fakeroot is not enabled, then we don't use it
if [ "$REPKG" = "1" ]; then
warning "$(gettext "Skipping build.")"
else
@@ -1494,7 +1506,7 @@ else
create_xdelta "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}"
fi
-msg "$(gettext "Finished making: %s")" "$pkgname ($(date))"
+msg "$(gettext "Finished making: %s")" "$pkgname $pkgver-$pkgrel $CARCH ($(date))"
install_package