diff options
Diffstat (limited to 'scripts/makepkg')
-rwxr-xr-x | scripts/makepkg | 381 |
1 files changed, 232 insertions, 149 deletions
diff --git a/scripts/makepkg b/scripts/makepkg index 55680b0d..ac3bda10 100755 --- a/scripts/makepkg +++ b/scripts/makepkg @@ -3,7 +3,11 @@ # makepkg # # Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org> +# Copyright (c) 2005 by Aurelien Foret <orelien@chez.com> # Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org> +# Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu> +# Copyright (c) 2006 by Alex Smith <alex@alex-smith.me.uk> +# Copyright (c) 2006 by Andras Voroskoi <voroskoi@frugalware.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -27,15 +31,15 @@ PKGDEST=$startdir USE_COLOR="n" # Options -BUILDSCRIPT="./PKGBUILD" CLEANUP=0 CLEANCACHE=0 DEP_BIN=0 DEP_SRC=0 DEP_SUDO=0 FORCE=0 -GENMD5=0 +GENINTEG=0 INSTALL=0 +DOWNLOAD="" KEEPDOCS=0 NOBUILD=0 NOCCACHE=0 @@ -43,15 +47,10 @@ NODEPS=0 NOEXTRACT=0 NOSTRIP=0 RMDEPS=0 +LOGGING=0 PACMAN_OPTS= -# source Arch's abs.conf if it's present -[ -f /etc/abs/abs.conf ] && source /etc/abs/abs.conf - -# makepkg configuration -[ -f /etc/makepkg.conf ] && source /etc/makepkg.conf - INFAKEROOT= if [ "$1" = "-F" ]; then INFAKEROOT=1 @@ -74,6 +73,15 @@ msg() { echo "==> $1" >&2 fi } + +msg2() { + if [ "$USE_COLOR" = "Y" -o "$USE_COLOR" = "y" ]; then + echo -e " \033[1;34m->\033[1;0m \033[1;1m$1\033[1;0m" >&2 + else + echo " -> $1" >&2 + fi +} + warning() { if [ "$USE_COLOR" = "Y" -o "$USE_COLOR" = "y" ]; then echo -e "\033[1;33m==> WARNING:\033[1;0m \033[1;1m$1\033[1;0m" >&2 @@ -90,7 +98,7 @@ error() { } strip_url() { - echo $1 | sed 's|^.*://.*/||g' + echo "$1" | sed 's|^.*://.*/||g' } check_option() { @@ -105,6 +113,16 @@ check_option() { done } +in_array() { + needle=$1 + shift 1 + [ -z "$1" ] && return 1 + for i in $*; do + [ "$i" == "$needle" ] && return 0 + done + return 1 +} + checkdeps() { local missdep="" local deplist="" @@ -151,7 +169,7 @@ handledeps() { if [ "$DEP_BIN" = "1" ]; then # install missing deps from binary packages (using pacman -S) msg "Installing missing dependencies..." - pacman $PACMAN_OPTS -D $deplist + pacman $PACMAN_OPTS -D $deplist if [ "$?" = "127" ]; then error "Failed to install missing dependencies." exit 1 @@ -165,33 +183,33 @@ handledeps() { FAKEROOTKEY2=$FAKEROOTKEY unset FAKEROOTKEY fi - sudo pacman $PACMAN_OPTS -D $deplist - if [ "$INFAKEROOT" = "1" ]; then - export FAKEROOTKEY=$FAKEROOTKEY2 - unset FAKEROOTKEY2 - fi + sudo pacman $PACMAN_OPTS -D $deplist if [ "$?" = "127" ]; then error "Failed to install missing dependencies." exit 1 fi + if [ "$INFAKEROOT" = "1" ]; then + export FAKEROOTKEY=$FAKEROOTKEY2 + unset FAKEROOTKEY2 + fi elif [ "$DEP_SRC" = "1" ]; then # install missing deps by building them from source. - # we look for each package name in $ABSROOT and build it. - if [ "$ABSROOT" = "" ]; then - error "The ABSROOT environment variable is not defined." + # we look for each package name in $SRCROOT and build it. + if [ "$SRCROOT" = "" ]; then + error "Source root cannot be found - please make sure it is specified in /etc/makepkg.conf" exit 1 fi # TODO: handle version comparators (eg, glibc>=2.2.5) msg "Building missing dependencies..." for dep in $deplist; do - candidates=`find $ABSROOT -type d -name "$dep"` + candidates=$(find $SRCROOT -type d -name "$dep") if [ "$candidates" = "" ]; then - error "Could not find \"$dep\" under $ABSROOT" + error "Could not find \"$dep\" under $SRCROOT" exit 1 fi success=0 for pkgdir in $candidates; do - if [ -f $pkgdir/PKGBUILD ]; then + if [ -f $pkgdir/$BUILDSCRIPT ]; then cd $pkgdir if [ "$RMDEPS" = "1" ]; then makepkg -i -c -b -r -w $PKGDEST @@ -219,6 +237,16 @@ handledeps() { fi missingdeps=1 fi + # rerun any additional sh scripts found in /etc/profile.d/ + for i in /etc/profile.d/*.sh + do + if [ -x $i ]; then + . $i &>/dev/null + fi + done + # some applications (eg, blackbox) will not build with some languages + unset LC_ALL LANG + return $missingdeps } @@ -235,14 +263,15 @@ usage() { echo " -d, --nodeps Skip all dependency checks" echo " -e, --noextract Do not extract source files (use existing src/ dir)" echo " -f, --force Overwrite existing package" - echo " -g, --genmd5 Generate MD5sums for source files" + echo " -g, --geninteg Generate integrity checks for source files" echo " -h, --help This help" echo " -i, --install Install package after successful build" echo " -j <jobs> Set MAKEFLAGS to \"-j<jobs>\" before building" + echo " -L, --log Log package build process" echo " -m, --nocolor Disable colorized output messages" echo " -n, --nostrip Do not strip binaries/libraries" echo " -o, --nobuild Download and extract files only" - echo " -p <buildscript> Use an alternate build script (instead of PKGBUILD)" + echo " -p <buildscript> Use an alternate build script (instead of '$BUILDSCRIPT')" echo " -r, --rmdeps Remove installed dependencies after a successful build" echo " -s, --syncdeps Install missing dependencies with pacman" echo " -S, --sudosync Install missing dependencies with pacman and sudo" @@ -253,12 +282,22 @@ usage() { echo " --noconfirm Do not ask for confirmation when resolving dependencies" echo " --noprogressbar Do not show a progress bar when downloading files" echo - echo "If -p is not specified, makepkg will look for ./PKGBUILD" + echo "If -p is not specified, makepkg will look for './$BUILDSCRIPT'" echo } ARGLIST=$@ +if [ -f /etc//makepkg.conf ]; then + source /etc/makepkg.conf +else + error "/etc/makepkg.conf not found. cannot continue" + exit 1 +fi + +#Let's be courteous and support frugalware's extensions +[ -e /usr/lib/frugalware/fwmakepkg ] && . /usr/lib/frugalware/fwmakepkg + while [ "$#" -ne "0" ]; do case $1 in # pacman @@ -278,8 +317,9 @@ while [ "$#" -ne "0" ]; do --nostrip) NOSTRIP=1 ;; --nobuild) NOBUILD=1 ;; --nocolor) USE_COLOR="n" ;; - --genmd5) GENMD5=1 ;; + --geninteg) GENINTEG=1 ;; --rmdeps) RMDEPS=1 ;; + --log) LOGGING=1 ;; --help) usage exit 0 @@ -289,7 +329,7 @@ while [ "$#" -ne "0" ]; do exit 1 ;; -*) - while getopts "bBcCdefghij:mnop:rsSw:-" opt; do + while getopts "bBcCdefghij:Lmnop:rsSw:-" opt; do case $opt in b) DEP_SRC=1 ;; B) NOCCACHE=1 ;; @@ -298,13 +338,14 @@ while [ "$#" -ne "0" ]; do d) NODEPS=1 ;; e) NOEXTRACT=1 ;; f) FORCE=1 ;; - g) GENMD5=1 ;; + g) GENINTEG=1 ;; h) usage exit 0 ;; i) INSTALL=1 ;; j) export MAKEFLAGS="-j$OPTARG" ;; + L) LOGGING=1 ;; m) USE_COLOR="n" ;; n) NOSTRIP=1 ;; o) NOBUILD=1 ;; @@ -333,7 +374,7 @@ done # check for sudo if [ "$DEP_SUDO" = "1" -a ! "`type -p sudo`" ]; then - error "Cannot find the sudo binary! Is sudo installed?" + error "Cannot find the sudo binary! Is sudo installed?" exit 1 fi @@ -360,6 +401,8 @@ fi unset pkgname pkgver pkgrel pkgdesc url license groups provides md5sums force unset replaces depends conflicts backup source install build makedepends unset options + + # some applications (eg, blackbox) will not build with some languages unset LC_ALL LANG umask 0022 @@ -367,29 +410,47 @@ umask 0022 if [ ! -f $BUILDSCRIPT ]; then error "$BUILDSCRIPT does not exist." exit 1 +else + #this is fun.... we'll unset + for var in $(grep "=" $BUILDSCRIPT | sed "s|.*\(\<.*\>\)=.*|\1|g"); do + unset $var + done fi source $BUILDSCRIPT # check for no-no's -if [ `echo $pkgver | grep '-'` ]; then +if [ -z "$pkgver" ]; then + error "pkgver is not allowed to be empty." + exit 1 +fi +if [ -z "$pkgrel" ]; then + error "pkgrel is not allowed to be empty." + exit 1 +fi +if [ $(echo $pkgver | grep '-') ]; then error "pkgver is not allowed to contain hyphens." exit 1 fi -if [ `echo $pkgrel | grep '-'` ]; then +if [ $(echo $pkgrel | grep '-') ]; then error "pkgrel is not allowed to contain hyphens." exit 1 fi +if ! in_array $CARCH ${arch[@]}; then + error "$pkgname is not available for the '$CARCH' architecture." + exit 1 +fi + if [ "$install" -a ! -f "$install" ]; then error "install scriptlet ($install) does not exist." exit 1 fi -if [ -f $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz -a "$FORCE" = "0" -a "$GENMD5" = "0" ]; then +if [ -f $PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}.${PKGEXT} -a "$FORCE" = "0" -a "$GENINTEG" = "0" ]; then if [ "$INSTALL" = "1" ]; then warning "a package has already been built, installing existing package." - echo pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz - pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz + echo pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}.${PKGEXT} + pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}.${PKGEXT} exit $? else error "a package has already been built. (use -f to overwrite)" @@ -397,6 +458,9 @@ if [ -f $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz -a "$FORCE" = "0" -a fi fi +# some applications (eg, blackbox) will not build with some languages +unset LC_ALL LANG + # Enter the fakeroot environment if necessary. This will call the makepkg script again # as the fake root user. We detect this by passing a sentinel option (-F) to makepkg if [ "`id -u`" != "0" ]; then @@ -498,111 +562,113 @@ for netfile in ${source[@]}; do fi done -if [ "$GENMD5" = "0" ]; then - if [ "$NOEXTRACT" = "1" ]; then - warning "Skipping source extraction -- using existing src/ tree" - warning "Skipping source integrity checks -- using existing src/ tree" - else - # MD5 validation - if [ ${#md5sums[@]} -ne ${#source[@]} ]; then - warning "MD5sums are missing or incomplete. Cannot verify source integrity." - #sleep 1 - elif [ `type -p md5sum` ]; then - msg "Validating source files with MD5sums" - errors=0 - idx=0 - for netfile in ${source[@]}; do - file=`strip_url $netfile` - echo -n " $file ... " >&2 - echo "${md5sums[$idx]} $file" | md5sum -c - >/dev/null 2>&1 - if [ $? -ne 0 ]; then - echo "FAILED" >&2 - errors=1 - else - echo "Passed" >&2 - fi - idx=$(($idx+1)) - done - if [ $errors -gt 0 ]; then - error "One or more files did not pass the validity check!" - exit 1 - fi - else - warning "The md5sum program is missing. Cannot verify source files!" - sleep 1 - fi - # extract sources - msg "Extracting Sources..." - for netfile in ${source[@]}; do - unziphack=0 - file=`strip_url $netfile` - unset cmd - case $file in - *.tar.gz|*.tar.Z|*.tgz) - cmd="tar --use-compress-program=gzip -xf $file" ;; - *.tar.bz2|*.tbz2) - cmd="tar --use-compress-program=bzip2 -xf $file" ;; - *.tar) - cmd="tar -xf $file" ;; - *.zip) - unziphack=1 - cmd="unzip -qqo $file" ;; - *.gz) - cmd="gunzip $file" ;; - *.bz2) - cmd="bunzip2 $file" ;; - esac - if [ "$cmd" != "" ]; then - msg " $cmd" - $cmd - if [ $? -ne 0 ]; then - # unzip will return a 1 as a warning, it is not an error - if [ "$unziphack" != "1" -o $? -ne 1 ]; then - error "Failed to extract $file" - msg "Aborting..." - exit 1 - fi - fi - fi - done - fi + + +if [ "$NOEXTRACT" = "1" ]; then + warning "Skipping source extraction -- using existing src/ tree" + warning "Skipping source integrity checks -- using existing src/ tree" else -# generate md5 hashes - if [ ! `type -p md5sum` ]; then - error "Cannot find the md5sum program." - exit 1 - fi - msg "Generating MD5sums for source files" - plain "" - ct=0 - newline=0 - numsrc=${#source[@]} - for netfile in ${source[@]}; do - file=`strip_url $netfile` - sum=`md5sum $file | cut -d' ' -f 1` - if [ $ct -eq 0 ]; then - echo -n "md5sums=(" - else - if [ $newline -eq 0 ]; then - echo -n " " - fi - fi - echo -n "'$sum'" - ct=$(($ct+1)) - if [ $ct -eq $numsrc ]; then - echo ')' - else - if [ $newline -eq 1 ]; then - echo '\' - newline=0 - else - echo -n ' ' - newline=1 - fi - fi - done - plain "" - exit 0 + integ="$(echo $INTEGRITY_CHECK | tr A-Z a-z)" + case "$integ" in + md5) integrity_name="md5sum" ;; + sha1) integrity_name="sha1sum" ;; + *) error "Invalid integrity algorithm '$integ' specified"; exit 1;; + esac + if [ ! $(type -p $integrity_name) ]; then + error "Cannot find the $integrity_name program." + exit 1 + fi + + if [ "$GENINTEG" = "1" ]; then + msg "Generating ${integrity_name}s for source files" + plain "" + ct=0 + newline=0 + numsrc=${#source[@]} + for netfile in "${source[@]}"; do + file=`strip_url "$netfile"` + sum=$(eval "$integrity_name '$file' | cut -d' ' -f 1") + if [ $ct -eq 0 ]; then + echo -n "${integrity_name}s=(" + else + echo -ne "\t " + fi + echo -n "'$sum'" + ct=$(($ct+1)) + if [ $ct -eq $numsrc ]; then + echo ')' + else + echo ' \' + newline=0 + fi + done + plain "" + exit 0 + else #validation + integrity_sums=($(eval echo \${${integrity_name}s[@]})) + + if [ ${#integrity_sums[@]} -eq ${#source[@]} ]; then + msg "Validating source files with ${integrity_name}s" + errors=0 + idx=0 + for netfile in "${source[@]}"; do + file=$(strip_url "$netfile") + echo -n " $file ... " >&2 + echo "${integrity_sums[$idx]} $file" | $integrity_name -c - >/dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "FAILED" >&2 + errors=1 + else + echo "Passed" >&2 + fi + idx=$(($idx+1)) + done + if [ $errors -gt 0 ]; then + error "One or more files did not pass the validity check!" + exit 1 + fi + else + warning "Integrity checks ($INTEGRITY_CHECK) are missing or incomplete." + fi + + msg "Extracting Sources..." + for netfile in "${source[@]}"; do + unziphack=0 + file=`strip_url "$netfile"` + unset cmd + case "`echo $file |tr "A-Z" "a-z"`" in + *.tar.gz|*.tar.z|*.tgz) + cmd="tar --use-compress-program=gzip -xf $file" ;; + *.tar.bz2|*.tbz2) + cmd="tar --use-compress-program=bzip2 -xf $file" ;; + *.tar) + cmd="tar -xf $file" ;; + *.zip) + unziphack=1 + cmd="unzip -qqo $file" ;; + *.cpio.gz) + cmd="bsdtar -x -f $file" ;; + *.cpio.bz2) + cmd="bsdtar -x -f $file" ;; + *.gz) + cmd="gunzip -f $file" ;; + *.bz2) + cmd="bunzip2 -f $file" ;; + esac + if [ "$cmd" != "" ]; then + msg " $cmd" + $cmd + if [ $? -ne 0 ]; then + # unzip will return a 1 as a warning, it is not an error + if [ "$unziphack" != "1" -o $? -ne 1 ]; then + error "Failed to extract $file" + msg "Aborting..." + exit 1 + fi + fi + fi + done + fi fi if [ "`id -u`" = "0" ]; then @@ -625,10 +691,6 @@ fi # use distcc if requested if [ "$DISTCC" = "y" ]; then [ -d /usr/lib/distcc/bin ] && export PATH=/usr/lib/distcc/bin:$PATH - if [ "$INCHROOT" = "1" ]; then - [ -d /var/tmp/fst/.distcc ] || mkdir /var/tmp/fst/.distcc - export DISTCC_DIR=/var/tmp/fst/.distcc - fi fi # use ccache if it's available @@ -638,10 +700,30 @@ fi # build msg "Starting build()..." -build 2>&1 -if [ $? -gt 0 ]; then - error "Build Failed. Aborting..." - exit 2 +if [ "$LOGGING" = "1" ]; then + BUILDLOG="${startdir}/${pkgname}-${pkgver}-${pkgrel}-${CARCH}.log" + if [ -f "$BUILDLOG" ]; then + i=1 + while true; do + if [ -f "$BUILDLOG.$i" ]; then + i=$(($i +1)) + else + break + fi + done + mv "$BUILDLOG" "$BUILDLOG.$i" + fi + build 2>&1 | tee "$BUILDLOG" + if [ ${PIPESTATUS[0]} -gt 0 ]; then + error "Build Failed. Aborting..." + exit 2 + fi +else + build 2>&1 + if [ $? -gt 0 ]; then + error "Build Failed. Aborting..." + exit 2 + fi fi if [ ! "`check_option KEEPDOCS`" -a "$KEEPDOCS" = "0" ]; then @@ -772,9 +854,9 @@ tar cvf /dev/null * | sort >.FILELIST msg "Compressing package..." cd $startdir/pkg if [ -f $startdir/pkg/.INSTALL ]; then - cmd="tar czvf $PKGDEST/$pkgname-$pkgver-$pkgrel.pkg.tar.gz .PKGINFO .FILELIST .INSTALL *" + cmd="tar czvf $PKGDEST/$pkgname-$pkgver-$pkgrel-${CARCH}.${PKGEXT} .PKGINFO .FILELIST .INSTALL *" else - cmd="tar czvf $PKGDEST/$pkgname-$pkgver-$pkgrel.pkg.tar.gz .PKGINFO .FILELIST *" + cmd="tar czvf $PKGDEST/$pkgname-$pkgver-$pkgrel-${CARCH}.${PKGEXT} .PKGINFO .FILELIST *" fi $cmd | sort >../filelist @@ -782,6 +864,7 @@ cd $startdir if [ "$CLEANUP" = "1" ]; then msg "Cleaning up..." rm -rf src pkg filelist + rm -rf ${pkgname}-${pkgver}-${pkgrel}-${CARCH}.log* fi if [ "$RMDEPS" = "1" -a "`id -u`" = "0" -a "$INFAKEROOT" != "1" -a \( ! -z "$deplist" -o ! -z "$makedeplist" \) ]; then @@ -804,7 +887,7 @@ msg "Finished making: $pkgname (`date`)" if [ "$INSTALL" = "1" -a "`id -u`" = "0" -a "$INFAKEROOT" != "1" ]; then msg "Installing package with pacman -U..." - pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz + pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}.${PKGEXT} exit $? elif [ "$INSTALL" = "1" -a "$DEP_SUDO" = "1" ]; then msg "Installing package with pacman -U..." @@ -812,7 +895,7 @@ elif [ "$INSTALL" = "1" -a "$DEP_SUDO" = "1" ]; then FAKEROOTKEY2=$FAKEROOTKEY unset FAKEROOTKEY fi - sudo pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz + sudo pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}.${PKGEXT} if [ "$INFAKEROOT" = "1" ]; then export FAKEROOTKEY=$FAKEROOTKEY2 unset FAKEROOTKEY2 |