makepkg: Add check() function for running test suites

A PKGBUILD can have an option check() function for running test suites
between the build() and package() stages.  This function is run by
default but can be disabled globally in with "!check" in BUILDENV in
makepkg.conf. This setting can be controlled on an individual package
basis using makepkg's --check and --nocheck flags. Addition dependencies
needed for running the test suite can be specified in the checkdepends
array and are only checked when running the check() function.

Original-work-by: Jeff C <jeff@kcaccess.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Allan McRae 2010-12-16 00:06:43 +10:00 committed by Dan McGee
parent d227771464
commit 0c29eb431a
7 changed files with 70 additions and 8 deletions

View File

@ -16,6 +16,7 @@ license=('GPL')
groups=() groups=()
depends=() depends=()
makedepends=() makedepends=()
checkdepends=()
provides=() provides=()
conflicts=() conflicts=()
replaces=() replaces=()
@ -33,6 +34,11 @@ build() {
make make
} }
check() {
cd "$srcdir/$pkgname-$pkgver"
make -k check
}
package_pkg1() { package_pkg1() {
# options and directives that can be overridden # options and directives that can be overridden
pkgver= pkgver=

View File

@ -15,6 +15,7 @@ license=('GPL')
groups=() groups=()
depends=() depends=()
makedepends=() makedepends=()
checkdepends=()
optdepends=() optdepends=()
provides=() provides=()
conflicts=() conflicts=()
@ -29,14 +30,17 @@ md5sums=() #generate with 'makepkg -g'
build() { build() {
cd "$srcdir/$pkgname-$pkgver" cd "$srcdir/$pkgname-$pkgver"
./configure --prefix=/usr ./configure --prefix=/usr
make make
} }
check() {
cd "$srcdir/$pkgname-$pkgver"
make -k check
}
package() { package() {
cd "$srcdir/$pkgname-$pkgver" cd "$srcdir/$pkgname-$pkgver"
make DESTDIR="$pkgdir/" install make DESTDIR="$pkgdir/" install
} }

View File

@ -156,6 +156,12 @@ name. The syntax is: `source=('filename::url')`.
needed at runtime. Packages in this list follow the same format as needed at runtime. Packages in this list follow the same format as
depends. depends.
*checkdepends (array)*::
An array of packages that this package depends on to run its test suite,
but are not needed at runtime. Packages in this list follow the same
format as depends. These dependencies are only considered when the
check() function is present and is to be run by makepkg.
*optdepends (array)*:: *optdepends (array)*::
An array of packages (and accompanying reasons) that are not essential for An array of packages (and accompanying reasons) that are not essential for
base functionality, but may be necessary to make full use of the contents base functionality, but may be necessary to make full use of the contents
@ -263,10 +269,18 @@ If you create any variables of your own in the build function, it is
recommended to use the bash `local` keyword to scope the variable to inside recommended to use the bash `local` keyword to scope the variable to inside
the build function. the build function.
check() Function
----------------
An optional check() function can be specified in which a packages test-suite
may be run. This function is run between the build() and package() functions.
The function is run in `bash -e` mode, meaning any command that exits with a
non-zero status will cause the function to exit. Be sure any exotic commands
used are covered by `checkdepends`.
package() Function package() Function
------------------ ------------------
An optional package() function can be specified in addition to the build() An optional package() function can be specified in addition to the build()
function. This function is run immediately after the build() function. The function. This function is run after the build() and check() functions. The
function is run in `bash -e` mode, meaning any command that exits with a function is run in `bash -e` mode, meaning any command that exits with a
non-zero status will cause the function to exit. When specified in combination non-zero status will cause the function to exit. When specified in combination
with the fakeroot BUILDENV option in linkman:makepkg.conf[5], fakeroot usage with the fakeroot BUILDENV option in linkman:makepkg.conf[5], fakeroot usage

View File

@ -153,6 +153,13 @@ Options
Only build listed packages from a split package. The use of quotes is Only build listed packages from a split package. The use of quotes is
necessary when specifying multiple packages. e.g. `--pkg "pkg1 pkg3"` necessary when specifying multiple packages. e.g. `--pkg "pkg1 pkg3"`
*\--check*::
Run the check() function in the PKGBUILD, overriding the setting in
linkman:makepkg.conf[5].
*\--nocheck*::
Do not run the check() function in the PKGBUILD or handle the checkdepends.
*\--noconfirm*:: *\--noconfirm*::
(Passed to pacman) Prevent pacman from waiting for user input before (Passed to pacman) Prevent pacman from waiting for user input before
proceeding with operations. proceeding with operations.

View File

@ -93,6 +93,11 @@ Options
be disabled for individual packages by placing `!ccache` in the be disabled for individual packages by placing `!ccache` in the
PKGBUILD options array. PKGBUILD options array.
*check*;;
Run the check() function if present in the PKGBUILD. This can be
enabled or disabled for individual packages through the use of
makepkg's `--check` and `--nocheck` options respectively.
**DISTCC_HOSTS=**"host1 ...":: **DISTCC_HOSTS=**"host1 ..."::
If using DistCC, this is used to specify a space-delimited list of hosts If using DistCC, this is used to specify a space-delimited list of hosts
running in the DistCC cluster. In addition, you will want to modify your running in the DistCC cluster. In addition, you will want to modify your

View File

@ -39,15 +39,16 @@ CXXFLAGS="@CARCHFLAGS@-mtune=generic -O2 -pipe"
# BUILD ENVIRONMENT # BUILD ENVIRONMENT
######################################################################### #########################################################################
# #
# Defaults: BUILDENV=(fakeroot !distcc color !ccache) # Defaults: BUILDENV=(fakeroot !distcc color !ccache check)
# A negated environment option will do the opposite of the comments below. # A negated environment option will do the opposite of the comments below.
# #
#-- fakeroot: Allow building packages as a non-root user #-- fakeroot: Allow building packages as a non-root user
#-- distcc: Use the Distributed C/C++/ObjC compiler #-- distcc: Use the Distributed C/C++/ObjC compiler
#-- color: Colorize output messages #-- color: Colorize output messages
#-- ccache: Use ccache to cache compilation #-- ccache: Use ccache to cache compilation
#-- check: Run the check() function if present in the PKGBUILD
# #
BUILDENV=(fakeroot !distcc color !ccache) BUILDENV=(fakeroot !distcc color !ccache check)
# #
#-- If using DistCC, your MAKEFLAGS will also need modification. In addition, #-- If using DistCC, your MAKEFLAGS will also need modification. In addition,
#-- specify a space-delimited list of hosts running in the DistCC cluster. #-- specify a space-delimited list of hosts running in the DistCC cluster.

View File

@ -71,6 +71,7 @@ SOURCEONLY=0
IGNOREARCH=0 IGNOREARCH=0
HOLDVER=0 HOLDVER=0
BUILDFUNC=0 BUILDFUNC=0
CHECKFUNC=0
PKGFUNC=0 PKGFUNC=0
SPLITPKG=0 SPLITPKG=0
PKGLIST=() PKGLIST=()
@ -145,6 +146,9 @@ clean_up() {
if (( BUILDFUNC )); then if (( BUILDFUNC )); then
rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-build.log"* rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-build.log"*
fi fi
if (( CHECKFUNC )); then
rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-check.log"*
fi
if (( PKGFUNC )); then if (( PKGFUNC )); then
rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-package.log"* rm -f "${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-package.log"*
elif (( SPLITPKG )); then elif (( SPLITPKG )); then
@ -805,6 +809,10 @@ run_build() {
run_function "build" run_function "build"
} }
run_check() {
run_function "check"
}
run_package() { run_package() {
local pkgfunc local pkgfunc
if [[ -z $1 ]]; then if [[ -z $1 ]]; then
@ -1547,8 +1555,10 @@ usage() {
echo "$(gettext " -s, --syncdeps Install missing dependencies with pacman")" echo "$(gettext " -s, --syncdeps Install missing dependencies with pacman")"
echo "$(gettext " --allsource Generate a source-only tarball including downloaded sources")" echo "$(gettext " --allsource Generate a source-only tarball including downloaded sources")"
echo "$(gettext " --asroot Allow makepkg to run as root user")" echo "$(gettext " --asroot Allow makepkg to run as root user")"
printf "$(gettext " --check Run the check() function in the %s")\n" "$BUILDSCRIPT"
printf "$(gettext " --config <file> Use an alternate config file (instead of '%s')")\n" "$confdir/makepkg.conf" printf "$(gettext " --config <file> Use an alternate config file (instead of '%s')")\n" "$confdir/makepkg.conf"
printf "$(gettext " --holdver Prevent automatic version bumping for development %ss")\n" "$BUILDSCRIPT" printf "$(gettext " --holdver Prevent automatic version bumping for development %ss")\n" "$BUILDSCRIPT"
printf "$(gettext " --nocheck Do not run the check() function in the %s")\n" "$BUILDSCRIPT"
echo "$(gettext " --pkg <list> Only build listed packages from a split package")" echo "$(gettext " --pkg <list> Only build listed packages from a split package")"
echo "$(gettext " --skipinteg Do not fail when integrity checks are missing")" echo "$(gettext " --skipinteg Do not fail when integrity checks are missing")"
echo "$(gettext " --source Generate a source-only tarball without downloaded sources")" echo "$(gettext " --source Generate a source-only tarball without downloaded sources")"
@ -1584,10 +1594,10 @@ ARGLIST=("$@")
# Parse Command Line Options. # Parse Command Line Options.
OPT_SHORT="AcCdefFghiLmop:rRsV" OPT_SHORT="AcCdefFghiLmop:rRsV"
OPT_LONG="allsource,asroot,ignorearch,clean,cleancache,nodeps" OPT_LONG="allsource,asroot,ignorearch,check,clean,cleancache,nodeps"
OPT_LONG+=",noextract,force,forcever:,geninteg,help,holdver" OPT_LONG+=",noextract,force,forcever:,geninteg,help,holdver"
OPT_LONG+=",install,log,nocolor,nobuild,pkg:,rmdeps,repackage,skipinteg" OPT_LONG+=",install,log,nocolor,nobuild,nocheck,pkg:,rmdeps"
OPT_LONG+=",source,syncdeps,version,config:" OPT_LONG+=",repackage,skipinteg,source,syncdeps,version,config:"
# Pacman Options # Pacman Options
OPT_LONG+=",noconfirm,noprogressbar" OPT_LONG+=",noconfirm,noprogressbar"
OPT_TEMP="$(parse_options $OPT_SHORT $OPT_LONG "$@" || echo 'PARSE_OPTIONS FAILED')" OPT_TEMP="$(parse_options $OPT_SHORT $OPT_LONG "$@" || echo 'PARSE_OPTIONS FAILED')"
@ -1610,6 +1620,7 @@ while true; do
-A|--ignorearch) IGNOREARCH=1 ;; -A|--ignorearch) IGNOREARCH=1 ;;
-c|--clean) CLEANUP=1 ;; -c|--clean) CLEANUP=1 ;;
-C|--cleancache) CLEANCACHE=1 ;; -C|--cleancache) CLEANCACHE=1 ;;
--check) RUN_CHECK='y' ;;
--config) shift; MAKEPKG_CONF=$1 ;; --config) shift; MAKEPKG_CONF=$1 ;;
-d|--nodeps) NODEPS=1 ;; -d|--nodeps) NODEPS=1 ;;
-e|--noextract) NOEXTRACT=1 ;; -e|--noextract) NOEXTRACT=1 ;;
@ -1622,6 +1633,7 @@ while true; do
-i|--install) INSTALL=1 ;; -i|--install) INSTALL=1 ;;
-L|--log) LOGGING=1 ;; -L|--log) LOGGING=1 ;;
-m|--nocolor) USE_COLOR='n' ;; -m|--nocolor) USE_COLOR='n' ;;
--nocheck) RUN_CHECK='n' ;;
-o|--nobuild) NOBUILD=1 ;; -o|--nobuild) NOBUILD=1 ;;
-p) shift; BUILDFILE=$1 ;; -p) shift; BUILDFILE=$1 ;;
--pkg) shift; PKGLIST=($1) ;; --pkg) shift; PKGLIST=($1) ;;
@ -1837,6 +1849,12 @@ fi
if declare -f build >/dev/null; then if declare -f build >/dev/null; then
BUILDFUNC=1 BUILDFUNC=1
fi fi
if declare -f check >/dev/null; then
# "Hide" check() function if not going to be run
if [[ $RUN_CHECK = 'y' || (! $(check_buildenv check) = "n" && ! $RUN_CHECK = "n") ]]; then
CHECKFUNC=1
fi
fi
if declare -f package >/dev/null; then if declare -f package >/dev/null; then
PKGFUNC=1 PKGFUNC=1
elif [[ $SPLITPKG -eq 0 ]] && declare -f package_${pkgname} >/dev/null; then elif [[ $SPLITPKG -eq 0 ]] && declare -f package_${pkgname} >/dev/null; then
@ -1900,6 +1918,7 @@ if (( INFAKEROOT )); then
if (( ! REPKG )); then if (( ! REPKG )); then
if (( BUILDFUNC )); then if (( BUILDFUNC )); then
run_build run_build
(( CHECKFUNC )) && run_check
tidy_install tidy_install
fi fi
else else
@ -1950,6 +1969,10 @@ elif type -p "${PACMAN%% *}" >/dev/null; then
msg "$(gettext "Checking buildtime dependencies...")" msg "$(gettext "Checking buildtime dependencies...")"
resolve_deps ${makedepends[@]} || deperr=1 resolve_deps ${makedepends[@]} || deperr=1
if (( CHECKFUNC )); then
resolve_deps ${checkdepends[@]} || deperr=1
fi
if (( RMDEPS )); then if (( RMDEPS )); then
current_pkglist=($(run_pacman -Qq)) # required by remove_deps current_pkglist=($(run_pacman -Qq)) # required by remove_deps
fi fi
@ -2015,6 +2038,7 @@ else
if (( ! REPKG )); then if (( ! REPKG )); then
devel_update devel_update
(( BUILDFUNC )) && run_build (( BUILDFUNC )) && run_build
(( CHECKFUNC )) && run_check
fi fi
if (( ! SPLITPKG )); then if (( ! SPLITPKG )); then
if (( PKGFUNC )); then if (( PKGFUNC )); then
@ -2036,6 +2060,7 @@ else
if (( ! REPKG && ( PKGFUNC || SPLITPKG ) )); then if (( ! REPKG && ( PKGFUNC || SPLITPKG ) )); then
devel_update devel_update
(( BUILDFUNC )) && run_build (( BUILDFUNC )) && run_build
(( CHECKFUNC )) && run_check
cd "$startdir" cd "$startdir"
fi fi