[pacman-dev] makepkg script changes
This is a relatively big patch with a few different things in it. As always, take it or leave it. * Addresses FS bugs 5223 and 5973, comments are in the patch noting the start of these changes. * Allows makepkg script to be usable again. I did notice that integrity checks are not working at the moment, but I assume that is known. * Removed some duplicate lines of code (e.g. things that were moved earlier in the script or outside of loops) * Adds quotes around filename references to ensure we do not break the script with weird filenames. * Changes use of `` and $() to be a bit more consistent- `` are used wherever possible. * Removes /usr/share from man page compression search- they are explicitly moved from this location ten lines before in the script so there better not be anything there. Dan ____________________ --- pacman-lib.orig/scripts/makepkg 2006-12-05 17:30:23.000000000 -0500 +++ pacman-lib/scripts/makepkg 2006-12-11 20:02:59.000000000 -0500 @@ -25,11 +25,12 @@ # USA. # -myver='2.9.8' +myver='3.0.0' startdir=`pwd` PKGDEST=$startdir # Options +BUILDSCRIPT="./PKGBUILD" CLEANUP=0 CLEANCACHE=0 DEP_BIN=0 @@ -187,18 +188,18 @@ if [ "$INFAKEROOT" = "1" ]; then export FAKEROOTKEY=$FAKEROOTKEY2 unset FAKEROOTKEY2 - fi + fi elif [ "$DEP_SRC" = "1" ]; then # install missing deps by building them from source. # 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" + 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 $SRCROOT -type d -name "$dep") + candidates=`find $SRCROOT -type d -name "$dep"` if [ "$candidates" = "" ]; then error "Could not find \"$dep\" under $SRCROOT" exit 1 @@ -266,12 +267,14 @@ echo " -k, --keepdocs Keep doc and info directories" echo " -L, --log Log package build process" echo " -m, --nocolor Disable colorized output messages" - echo " -n, --nostrip Do not strip binaries/libraries" + echo " -n, --nostrip Do not strip symbols from binaries/libraries" echo " -o, --nobuild Download and extract files only" 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" + # fix flyspray feature request #5223 + echo " -t <sourcedir> Cache source files in <sourcedir>" echo " -w <destdir> Write package to <destdir> instead of the working dir" echo echo "These options can be passed to pacman:" @@ -279,22 +282,19 @@ 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 './$BUILDSCRIPT'" + echo "If -p is not specified, makepkg will look for '$BUILDSCRIPT'" echo } ARGLIST=$@ -if [ -f /etc//makepkg.conf ]; then +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 @@ -327,7 +327,7 @@ exit 1 ;; -*) - while getopts "bBcCdefghij:Lmnop:rsSw:-" opt; do + while getopts "bBcCdefghij:kLmnop:rsSt:w:-" opt; do case $opt in b) DEP_SRC=1 ;; B) USE_CCACHE=0 ;; @@ -352,6 +352,7 @@ r) RMDEPS=1 ;; s) DEP_BIN=1 ;; S) DEP_SUDO=1 ;; + t) SRCDEST=$OPTARG ;; w) PKGDEST=$OPTARG ;; -) OPTIND=0 @@ -387,13 +388,19 @@ cd $OLDPWD if [ "$CLEANCACHE" = "1" ]; then - if [ "`id -u`" = "0" -a "$INFAKEROOT" != "1" ]; then + if [ -n "$SRCDEST" ]; then msg "Cleaning up source files from the cache." - rm -rf /var/cache/pacman/src/* + rm -rf $SRCDEST/* exit 0 else - error "You must be root to clean the cache." - exit 1 + if [ "`id -u`" = "0" -a "$INFAKEROOT" != "1" ]; then + msg "Cleaning up source files from the cache." + rm -rf /var/cache/pacman/src/* + exit 0 + else + error "You must be root to clean the cache." + exit 1 + fi fi fi @@ -401,7 +408,6 @@ 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 @@ -409,11 +415,6 @@ 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 @@ -427,16 +428,18 @@ error "pkgrel is not allowed to be empty." exit 1 fi -if [ $(echo $pkgver | grep '-') ]; then +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." + plain "Note that many packages may need a line added to their $BUILDSCRIPT" + plain "such as arch=('$CARCH')." exit 1 fi @@ -457,8 +460,6 @@ 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 @@ -488,7 +489,8 @@ msg "Making package: $pkgname $pkgver-$pkgrel (`date`)" unset deplist makedeplist -if [ `type -p pacman` -a "$NODEPS" = "0" ]; then +# fix flyspray bug #5973 +if [ `type -p pacman` -a "$NODEPS" = "0" -a "$GENINTEG" = "0" -a "$NOBUILD" = "0" ]; then msg "Checking Runtime Dependencies..." deplist=`checkdeps ${depends[@]}` handledeps $deplist @@ -507,7 +509,7 @@ if [ $? -gt 0 ]; then exit 1 fi -elif [ "$NODEPS" = "1" ]; then +elif [ "$NODEPS" = "1" -o "$GENINTEG" = "1" -o "$NOBUILD" = "1" ]; then warning "skipping dependency checks." else warning "pacman was not found in PATH. skipping dependency checks." @@ -520,13 +522,16 @@ mkdir -p src cd $startdir/src for netfile in ${source[@]}; do - file=`strip_url $netfile` - if [ -f ../$file ]; then + file=`strip_url "$netfile"` + if [ -f "../$file" ]; then msg " Found $file in build dir" - cp ../$file . - elif [ -f /var/cache/pacman/src/$file ]; then - msg " Using local copy of $file" - cp /var/cache/pacman/src/$file . + cp "../$file" . + elif [ -f "$SRCDEST/$file" ]; then + msg " Using cached copy of $file" + cp "$SRCDEST/$file" . + elif [ -f "/var/cache/pacman/src/$file" ]; then + msg " Using cached copy of $file" + cp "/var/cache/pacman/src/$file" . else # check for a download utility if [ -z "$FTPAGENT" ]; then @@ -540,35 +545,35 @@ msg "Aborting..." exit 1 fi - proto=`echo $netfile | sed 's|://.*||'` + proto=`echo "$netfile" | sed 's|://.*||'` if [ "$proto" != "ftp" -a "$proto" != "http" -a "$proto" != "https" ]; then error "$netfile was not found in the build directory and is not a proper URL." msg "Aborting..." exit 1 fi msg " Downloading $file" - $FTPAGENT $netfile 2>&1 - if [ ! -f $file ]; then + $FTPAGENT "$netfile" 2>&1 + if [ ! -f "$file" ]; then error "Failed to download $file" msg "Aborting..." exit 1 fi - if [ "`id -u`" = "0" -a "$INFAKEROOT" != "1" ]; then - mkdir -p /var/cache/pacman/src && cp $file /var/cache/pacman/src + if [ -n "$SRCDEST" ]; then + mkdir -p $SRCDEST && cp "$file" $SRCDEST + elif [ "`id -u`" = "0" -a "$INFAKEROOT" != "1" ]; then + mkdir -p /var/cache/pacman/src && cp "$file" /var/cache/pacman/src else - cp $file .. + cp "$file" .. fi fi done - - if [ "$NOEXTRACT" = "1" ]; then warning "Skipping source extraction -- using existing src/ tree" warning "Skipping source integrity checks -- using existing src/ tree" else for integ in ${INTEGRITY_CHECK[@]}; do - integ="$(echo $integ | tr A-Z a-z)" + integ=`echo $integ | tr A-Z a-z` case "$integ" in md5) integrity_name="md5sum" ;; sha1) integrity_name="sha1sum" ;; @@ -577,12 +582,13 @@ sha512) integrity_name="sha512sum" ;; *) error "Invalid integrity algorithm '$integ' specified"; exit 1;; esac - if [ ! $(type -p $integrity_name) ]; then + if [ ! `type -p $integrity_name` ]; then error "Cannot find the $integrity_name program." exit 1 fi - if [ "$GENINTEG" = "1" ]; then + # Generate integrity checks + if [ "$GENINTEG" = "1" ]; then msg "Generating ${integrity_name}s for source files" plain "" ct=0 @@ -590,7 +596,7 @@ numsrc=${#source[@]} for netfile in "${source[@]}"; do file=`strip_url "$netfile"` - sum=$(eval "$integrity_name '$file' | cut -d' ' -f 1") + sum=`eval "$integrity_name '$file' | cut -d' ' -f 1"` if [ $ct -eq 0 ]; then echo -n "${integrity_name}s=(" else @@ -607,7 +613,8 @@ done plain "" exit 0 - else #validation + # Validate integrity checks + else integrity_sums=($(eval echo \${${integrity_name}s[@]})) if [ ${#integrity_sums[@]} -eq ${#source[@]} ]; then @@ -615,7 +622,7 @@ errors=0 idx=0 for netfile in "${source[@]}"; do - file=$(strip_url "$netfile") + file=`strip_url "$netfile"` echo -n " $file ... " >&2 echo "${integrity_sums[$idx]} $file" | $integrity_name -c - >/dev/null 2>&1 if [ $? -ne 0 ]; then @@ -723,9 +730,6 @@ mv "$BUILDLOG" "$BUILDLOG.$i" fi - echo $SHELLOPTS | grep errexit 2>&1 >/dev/null - set_e=$? - #use 'errexit' to bail on syntax error [ $set_e -eq 1 ] && set -e build 2>&1 | tee "$BUILDLOG" @@ -771,12 +775,12 @@ # compress man pages msg "Compressing man pages..." -find $startdir/pkg/{usr{,/local,/share},opt/*}/man -type f 2>/dev/null | while read i ; do +find $startdir/pkg/{usr{,/local},opt/*}/man -type f 2>/dev/null | while read i ; do ext="${i##*.}" fn="${i##*/}" if [ "$ext" != "gz" -a "$ext" != "bz2" ]; then # update symlinks to this manpage - find $startdir/pkg/{usr{,/local,/share},opt/*}/man -lname "$fn" 2> /dev/null | while read ln ; do + find $startdir/pkg/{usr{,/local},opt/*}/man -lname "$fn" 2> /dev/null | while read ln ; do rm -f "$ln" ln -sf "${fn}.gz" "${ln}.gz" done --- pacman-lib.orig/etc/makepkg.conf.in 2006-11-16 20:40:22.000000000 -0500 +++ pacman-lib/etc/makepkg.conf.in 2006-12-11 20:09:54.000000000 -0500 @@ -61,8 +61,10 @@ # PACKAGE OUTPUT ######################################################################### # -#-- Destination: specify a fixed directory where all packages will be placed +#-- Destination: specify a fixed directory where made packages will be placed #PKGDEST=/home/packages +#-- Source cache: specify a fixed directory where source files will be cached +#SRCDEST=/home/source #-- Packager: name/email of the person or organization building packages #PACKAGER="John Doe <john@doe.com>"
Great! I will apply this when I'm able to test (~6 or 7 hours or so), but one thing I want to note: On 12/11/06, Dan McGee <dpmcgee@gmail.com> wrote:
* Changes use of `` and $() to be a bit more consistent- `` are used wherever possible.
Technically `` is *almost* deprecated. It's not likely a new XCU will be released anytime soon (silly standards organizations taking 10+ years to do things, heh), so it is safe to use. The current verbage is that `` will be deprecated in the next XCU spec, thus meaning it will be around 20 years before it's fully removed. $() has far simpler grammer rules and easier nesting. (i.e. according to the spec, ` is allowed to end at word boundries in cases like: echo "`date hello" - no matching `, so it assumes `date`. I think only 1 shell actually does this, but it's still allowed... nasty stuff, that). While it's unimportant, I would prefer this portion to go the other way, and use $() uniformly instead of ``.
-#Let's be courteous and support frugalware's extensions -[ -e /usr/lib/frugalware/fwmakepkg ] && . /usr/lib/frugalware/fwmakepkg -
I realized that I included these three lines in my patch that I submitted to the list yesterday. I want to stay out of any back-and-forth arguments and concentrate on trying to improve the code, so I hope no one saw this as a devious move. I was just cleaning my local copy and removed these lines because they had no importance to me; it was not an attempt to divide developers any further here. My one suggestion regarding this is a more modular approach- perhaps a generalized sourcing that would check a particular environment variable for a path. I wasn't aware of the almost deprecation of backticks; you learn something every day. Thanks. - Dan
participants (2)
-
Aaron Griffin
-
Dan McGee