[pacman-dev] [PATCH] makepkg: allow specifying subsets of packages to build

Dan McGee dpmcgee at gmail.com
Wed Oct 21 00:42:25 EDT 2009


On Tue, Oct 20, 2009 at 11:01 PM, Allan McRae <allan at archlinux.org> wrote:
> This allows makepkg to only build a specified subset of packages
> from a split PKGBUILD.  This is very useful in combination with the
> -R flag or when bumping the pkgrel of a single package.
>
> Fixes FS#15956.
>
> Signed-off-by: Allan McRae <allan at archlinux.org>
> ---
>
> As always, my changes to the documenation could be improved.  Suggestions welcome.

Would you mind splitting the ARGLIST patch into a separate one? It
seems pretty independent and might be good to explain a bit more by
itself in a commit message. (Easiest way to split a patch is probably
git-reset HEAD^, then git add -i, ...)

>  doc/makepkg.8.txt     |    5 +++++
>  scripts/makepkg.sh.in |   26 +++++++++++++++++++++-----
>  2 files changed, 26 insertions(+), 5 deletions(-)
>
> diff --git a/doc/makepkg.8.txt b/doc/makepkg.8.txt
> index ec02875..8c68143 100644
> --- a/doc/makepkg.8.txt
> +++ b/doc/makepkg.8.txt
> @@ -148,6 +148,11 @@ Options
>        remote builder, or a tarball upload. Because integrity checks are verified,
>        all source files of the package need to be present or downloadable.
>
> +*\--pkg <`list`>*::
> +       Builds only the listed packages. Useful in combination with package
> +       splitting.  The use quotes is necessary when specifying multiple
> +       packages. e.g. `--pkg "pkg1 pkg3"`
> +
If I wasn't reading this with split packages in mind, I might think
this is some sort of yaourt automatic system where it goes an finds
the package I want. "Builds only the designated packages in a split
package build script" or something? I don't know. Now of course I just
read the second sentence and see that you cleared it up; it might be
worth trying to get the package splitting actually in the first
sentence for stupid people like me that only read the first sentence.
And "The use of quotes" might be what you were looking for.

>  *\--noconfirm*::
>        (Passed to pacman) Prevent pacman from waiting for user input before
>        proceeding with operations.
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index 7e10eef..c3672b1 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -72,6 +72,7 @@ IGNOREARCH=0
>  HOLDVER=0
>  PKGFUNC=0
>  SPLITPKG=0
> +PKGLIST=""
>  COLORMSG=0
>
>  # Forces the pkgver of the current PKGBUILD. Used by the fakeroot call
> @@ -1243,6 +1244,15 @@ check_sanity() {
>                done
>        fi
>
> +       if [ -n "$PKGLIST" ]; then
This would only check the first item in $PKGLIST, is that ok?
> +               for pkg in ${PKGLIST[@]}; do
> +                       if ! in_array $pkg ${pkgname[@]}; then
> +                               error "$(gettext "requested package %s is not provided in %s")" "$pkg" "$BUILDSCRIPT"
> +                               return 1
> +                       fi
> +               done
> +       fi
> +
>        return 0
>  }
>
> @@ -1466,6 +1476,7 @@ usage() {
>        echo "$(gettext "  --asroot         Allow makepkg to run as root user")"
>        printf "$(gettext "  --config <file>  Use an alternate config file (instead of '%s')")\n" "$confdir/makepkg.conf"
>        echo "$(gettext "  --holdver        Prevent automatic version bumping for development PKGBUILDs")"
> +       echo "$(gettext "  --pkg <list>     Only build listed packages from a split package")"
So for the man page doc, this sentence is maybe succinct enough to be
the lead sentence, then follow it with more detail.

>        echo "$(gettext "  --skipinteg      Do not fail when integrity checks are missing")"
>        echo "$(gettext "  --source         Generate a source-only tarball without downloaded sources")"
>        echo
> @@ -1496,13 +1507,13 @@ if [ ! $(type -t gettext) ]; then
>        }
>  fi
>
> -ARGLIST=$@
> +ARGLIST=("$@")
>
>  # Parse Command Line Options.
>  OPT_SHORT="AcCdefFghiLmop:rRsV"
>  OPT_LONG="allsource,asroot,ignorearch,clean,cleancache,nodeps"
>  OPT_LONG="$OPT_LONG,noextract,force,forcever:,geninteg,help,holdver"
> -OPT_LONG="$OPT_LONG,install,log,nocolor,nobuild,rmdeps,repackage,skipinteg"
> +OPT_LONG="$OPT_LONG,install,log,nocolor,nobuild,pkg:,rmdeps,repackage,skipinteg"
>  OPT_LONG="$OPT_LONG,source,syncdeps,version,config:"
>  # Pacman Options
>  OPT_LONG="$OPT_LONG,noconfirm,noprogressbar"
> @@ -1540,6 +1551,7 @@ while true; do
>                -m|--nocolor)     USE_COLOR='n' ;;
>                -o|--nobuild)     NOBUILD=1 ;;
>                -p)               shift; BUILDFILE=$1 ;;
> +               --pkg)            shift; PKGLIST=$1 ;;
>                -r|--rmdeps)      RMDEPS=1 ;;
>                -R|--repackage)   REPKG=1 ;;
>                --skipinteg)      SKIPINTEG=1 ;;
> @@ -1722,6 +1734,11 @@ fi
>
>  pkgbase=${pkgbase:-${pkgname[0]}}
>
> +if [ -n "$PKGLIST" ]; then
> +       unset pkgname
> +       pkgname="${PKGLIST[@]}"
> +fi
> +
>  if [ "$SPLITPKG" -eq 0 ]; then
>        if [ \( -f "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}" \
>             -o -f "$PKGDEST/${pkgname}-${pkgver}-${pkgrel}-any${PKGEXT}" \) \
> @@ -1914,11 +1931,10 @@ else
>                fi
>
>                msg "$(gettext "Entering fakeroot environment...")"
> -
>                if [ -n "$newpkgver" ]; then
> -                       fakeroot -- $0 --forcever $newpkgver -F $ARGLIST || exit $?
> +                       fakeroot -- $0 --forcever $newpkgver -F "${ARGLIST[@]}" || exit $?
>                else
> -                       fakeroot -- $0 -F $ARGLIST || exit $?
> +                       fakeroot -- $0 -F "${ARGLIST[@]}" || exit $?
>                fi
>        fi
>  fi
> --
> 1.6.5.1

Without testing, I'm not sure how the flipflopping between treating
$PKGLIST like a string and an array works, but it seems scary. Am I
missing something obvious about the way bash does this?

-Dan


More information about the pacman-dev mailing list