diff --git a/Manual.md b/Manual.md index 37e9f06fbe..449a5b2ce6 100644 --- a/Manual.md +++ b/Manual.md @@ -121,6 +121,8 @@ function, which is the directory to be used to compile the `source package`. - `build` This phase compiles/prepares the `source files` via `make` or any other compatible method. +- `check` This optional phase checks the result of the `build` phase for example by running `make -k check`. + - `install` This phase installs the `package files` into the package destdir `/destdir/-`, via `make install` or any other compatible method. @@ -359,6 +361,10 @@ will be installed to the master directory. There is no need to specify a version because the current version in srcpkgs will always be required. Example `makedepends="foo blah"`. +- `checkdepends` The list of dependencies required to run the package checks, i.e. +the script or make rule specified in the template's `do_check()` function. +Example `checkdepends="gtest"`. + - `depends` The list of dependencies required to run the package. These dependencies are not installed to the master directory, rather are only checked if a binary package in the local repository exists to satisfy the required version. Dependencies diff --git a/common/environment/README b/common/environment/README index d5422326d3..2491ff502d 100644 --- a/common/environment/README +++ b/common/environment/README @@ -18,6 +18,7 @@ should be read by xbps-src: * extract (before running extract phase) * configure (before running configure phase) * build (before running build phase) + * check (before running check phase) * install (before running install phase) * pkg (before running pkg phase) diff --git a/common/environment/check/bootstrap.sh b/common/environment/check/bootstrap.sh new file mode 120000 index 0000000000..a0cf1d22cd --- /dev/null +++ b/common/environment/check/bootstrap.sh @@ -0,0 +1 @@ +../configure/bootstrap.sh \ No newline at end of file diff --git a/common/environment/check/cross.sh b/common/environment/check/cross.sh new file mode 120000 index 0000000000..43f6c48d9c --- /dev/null +++ b/common/environment/check/cross.sh @@ -0,0 +1 @@ +../configure/cross.sh \ No newline at end of file diff --git a/common/environment/check/hardening.sh b/common/environment/check/hardening.sh new file mode 120000 index 0000000000..f043590b72 --- /dev/null +++ b/common/environment/check/hardening.sh @@ -0,0 +1 @@ +../configure/hardening.sh \ No newline at end of file diff --git a/common/environment/check/pkg-config.sh b/common/environment/check/pkg-config.sh new file mode 120000 index 0000000000..b8f8c440ed --- /dev/null +++ b/common/environment/check/pkg-config.sh @@ -0,0 +1 @@ +../configure/pkg-config.sh \ No newline at end of file diff --git a/common/environment/setup/sourcepkg.sh b/common/environment/setup/sourcepkg.sh index ab57f0fd20..d7dc8cd3b3 100644 --- a/common/environment/setup/sourcepkg.sh +++ b/common/environment/setup/sourcepkg.sh @@ -7,7 +7,7 @@ unset -v only_for_archs distfiles checksum build_style nocross broken unset -v configure_script configure_args wrksrc build_wrksrc create_wrksrc unset -v make_cmd make_build_args make_install_args make_build_target make_install_target python_version stackage unset -v patch_args disable_parallel_build keep_libtool_archives -unset -v reverts subpackages makedepends hostmakedepends depends restricted +unset -v reverts subpackages makedepends hostmakedepends checkdepends depends restricted unset -v nopie build_options build_options_default bootstrap repository reverts unset -v CFLAGS CXXFLAGS CPPFLAGS LDFLAGS LD_LIBRARY_PATH unset -v CC CXX CPP GCC LD AR AS RANLIB NM OBJDUMP OBJCOPY STRIP READELF diff --git a/common/xbps-src/libexec/build.sh b/common/xbps-src/libexec/build.sh index 61a459f69c..931f888a29 100755 --- a/common/xbps-src/libexec/build.sh +++ b/common/xbps-src/libexec/build.sh @@ -61,6 +61,10 @@ $XBPS_LIBEXECDIR/xbps-src-doconfigure.sh $SOURCEPKG $XBPS_CROSS_BUILD || exit 1 $XBPS_LIBEXECDIR/xbps-src-dobuild.sh $SOURCEPKG $XBPS_CROSS_BUILD || exit 1 [ "$XBPS_TARGET" = "build" ] && exit 0 +# Run check phase +$XBPS_LIBEXECDIR/xbps-src-docheck.sh $SOURCEPKG $XBPS_CROSS_BUILD || exit 1 +[ "$XBPS_TARGET" = "check" ] && exit 0 + # Install pkgs into destdir. $XBPS_LIBEXECDIR/xbps-src-doinstall.sh $SOURCEPKG no $XBPS_CROSS_BUILD || exit 1 diff --git a/common/xbps-src/libexec/xbps-src-docheck.sh b/common/xbps-src/libexec/xbps-src-docheck.sh new file mode 100755 index 0000000000..654cc99617 --- /dev/null +++ b/common/xbps-src/libexec/xbps-src-docheck.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# +# vim: set ts=4 sw=4 et: +# +# Passed arguments: +# $1 - pkgname to build [REQUIRED] +# $2 - cross target [OPTIONAL] + +if [ $# -lt 1 -o $# -gt 2 ]; then + echo "${0##*/}: invalid number of arguments: pkgname [cross-target]" + exit 1 +fi + +PKGNAME="$1" +XBPS_CROSS_BUILD="$2" + +for f in $XBPS_SHUTILSDIR/*.sh; do + . $f +done + +setup_pkg "$PKGNAME" $XBPS_CROSS_BUILD + +XBPS_CHECK_DONE="${XBPS_STATEDIR}/${sourcepkg}_${XBPS_CROSS_BUILD}_check_done" + +if [ -n "$XBPS_CROSS_BUILD" ]; then + msg_normal "${pkgname}-${version}_${revision}: skipping check (cross build for $XBPS_CROSS_BUILD) ...\n" + exit 0 +fi + +if [ -z "$XBPS_CHECK_PKGS" -o "$XBPS_CHECK_PKGS" = "0" -o "$XBPS_CHECK_PKGS" = "no" ]; then + msg_normal "${pkgname}-${version}_${revision}: skipping check (XBPS_CHECK_PKGS is disabled) ...\n" + exit 0 +fi + +for f in $XBPS_COMMONDIR/environment/check/*.sh; do + source_file "$f" +done + +cd "$wrksrc" || msg_error "$pkgver: cannot access wrksrc directory [$wrksrc]\n" +if [ -n "$build_wrksrc" ]; then + cd $build_wrksrc || \ + msg_error "$pkgver: cannot access build_wrksrc directory [$build_wrksrc]\n" +fi + +# Run do_check() if the function is defined +if declare -f do_check > /dev/null; then + run_func do_check +else + msg_normal "${pkgname}-${version}_${revision}: template does not have do_check() ...\n" +fi + +touch -f $XBPS_CHECK_DONE + +exit 0 diff --git a/common/xbps-src/shutils/build_dependencies.sh b/common/xbps-src/shutils/build_dependencies.sh index 958782c21a..e04f81b9dd 100644 --- a/common/xbps-src/shutils/build_dependencies.sh +++ b/common/xbps-src/shutils/build_dependencies.sh @@ -49,6 +49,13 @@ setup_pkg_depends() { _depver=$(srcpkg_get_version ${_depname}) || exit $? host_build_depends+=" ${_depname}-${_depver}" done + if ! [ -z "$XBPS_CHECK_PKGS" -o "$XBPS_CHECK_PKGS" = "0" -o "$XBPS_CHECK_PKGS" = "no" ]; then + for j in ${checkdepends}; do + _depname="${j%\?*}" + _depver=$(srcpkg_get_version ${_depname}) || exit $? + host_check_depends+=" ${_depname}-${_depver}" + done + fi for j in ${makedepends}; do _depname="${j%\?*}" _depver=$(srcpkg_get_version ${_depname}) || exit $? @@ -183,7 +190,8 @@ install_pkg_deps() { local rval _realpkg _vpkg _curpkg curpkgdepname pkgn iver local i j found rundep repo - local -a host_binpkg_deps binpkg_deps host_missing_deps missing_deps missing_rdeps + local -a host_binpkg_deps check_binpkg_deps binpkg_deps + local -a host_missing_deps check_missing_deps missing_deps missing_rdeps [ -z "$pkgname" ] && return 2 @@ -195,7 +203,7 @@ install_pkg_deps() { msg_normal "$pkgver: building ...\n" fi - if [ -z "$build_depends" -a -z "$host_build_depends" -a -z "$run_depends" ]; then + if [ -z "$build_depends" -a -z "$host_build_depends" -a -z "$host_check_depends" -a -z "$run_depends" ]; then return 0 fi @@ -231,6 +239,39 @@ install_pkg_deps() { host_missing_deps+=("${i}") done + # + # Host check dependencies. + # + for i in ${host_check_depends}; do + check_pkgdep_matched "$i" version + local rval=$? + if [ $rval -eq 0 ]; then + echo " [check] ${i}: installed." + continue + elif [ $rval -eq 1 ]; then + _realpkg="$($XBPS_UHELPER_CMD getpkgname $i 2>/dev/null)" + iver=$($XBPS_UHELPER_CMD version ${_realpkg}) + if [ $? -eq 0 -a -n "$iver" ]; then + echo " [check] ${i}: installed $iver (virtualpkg)." + continue + else + echo " [check] ${i}: unresolved check dependency!" + return 1 + fi + else + repo=$($XBPS_QUERY_CMD -R -prepository ${i} 2>/dev/null) + if [ -n "${repo}" ]; then + echo " [check] ${i}: found ($repo)" + check_binpkg_deps+=("${i}") + continue + else + echo " [check] ${i}: not found." + fi + fi + check_missing_deps+=("${i}") + done + + # # Target build dependencies. # @@ -324,7 +365,7 @@ install_pkg_deps() { missing_rdeps+=("${_realpkg}") done - # Host missing dependencies, build from srcpkgs. + # Missing host dependencies, build from srcpkgs. for i in ${host_missing_deps[@]}; do # packages not found in repos, install from source. ( @@ -336,7 +377,19 @@ install_pkg_deps() { host_binpkg_deps+=("$i") done - # Target missing dependencies, build from srcpkgs. + # Missing check dependencies, build from srcpkgs. + for i in ${check_missing_deps[@]}; do + # packages not found in repos, install from source. + ( + curpkgdepname=$($XBPS_UHELPER_CMD getpkgname "$i" 2>/dev/null) + setup_pkg $curpkgdepname + exec env XBPS_DEPENDENCY=1 XBPS_BINPKG_EXISTS=1 \ + $XBPS_LIBEXECDIR/build.sh $sourcepkg $pkg $target || exit $? + ) || exit $? + check_binpkg_deps+=("$i") + done + + # Missing target dependencies, build from srcpkgs. for i in ${missing_deps[@]}; do # packages not found in repos, install from source. ( @@ -374,6 +427,11 @@ install_pkg_deps() { install_pkg_from_repos "${i}" done + for i in ${check_binpkg_deps[@]}; do + msg_normal "$pkgver: installing check dependency '$i' ...\n" + install_pkg_from_repos "${i}" + done + for i in ${binpkg_deps[@]}; do msg_normal "$pkgver: installing target dependency '$i' ...\n" install_pkg_from_repos "$i" $cross diff --git a/common/xbps-src/shutils/chroot.sh b/common/xbps-src/shutils/chroot.sh index 307eb183f6..f367fdb37b 100644 --- a/common/xbps-src/shutils/chroot.sh +++ b/common/xbps-src/shutils/chroot.sh @@ -33,7 +33,7 @@ XBPS_SRC_VERSION="$XBPS_SRC_VERSION" PATH=/void-packages:/usr/bin:/usr/sbin exec env -i SHELL=/bin/sh PATH="\$PATH" DISTCC_HOSTS="\$XBPS_DISTCC_HOSTS" DISTCC_DIR="/host/distcc" @@XARCH@@ \ - CCACHE_DIR="/host/ccache" IN_CHROOT=1 LC_COLLATE=C LANG=en_US.UTF-8 TERM=linux HOME="/tmp" \ + @@CHECK@@ CCACHE_DIR="/host/ccache" IN_CHROOT=1 LC_COLLATE=C LANG=en_US.UTF-8 TERM=linux HOME="/tmp" \ PS1="[\u@$XBPS_MASTERDIR \W]$ " /bin/bash +h _EOF if [ -n "$XBPS_ARCH" ]; then @@ -41,6 +41,11 @@ _EOF else sed -e 's,@@XARCH@@,,g' -i $XBPS_MASTERDIR/bin/xbps-shell fi + if [ -z "$XBPS_CHECK_PKGS" -o "$XBPS_CHECK_PKGS" = "0" -o "$XBPS_CHECK_PKGS" = "no" ]; then + sed -e 's,@@CHECK@@,,g' -i $XBPS_MASTERDIR/bin/xbps-shell + else + sed -e "s,@@CHECK@@,XBPS_CHECK_PKGS=$XBPS_CHECK_PKGS,g" -i $XBPS_MASTERDIR/bin/xbps-shell + fi chmod 755 $XBPS_MASTERDIR/bin/xbps-shell cp -f /etc/resolv.conf $XBPS_MASTERDIR/etc @@ -170,7 +175,7 @@ chroot_handler() { [ -z "$action" -a -z "$pkg" ] && return 1 case "$action" in - fetch|extract|build|configure|install|install-destdir|pkg|build-pkg|bootstrap-update|chroot) + fetch|extract|build|check|configure|install|install-destdir|pkg|build-pkg|bootstrap-update|chroot) chroot_prepare || return $? chroot_init || return $? chroot_sync_repos || return $? @@ -188,6 +193,7 @@ chroot_handler() { [ -n "$XBPS_BUILD_FORCEMODE" ] && arg="$arg -f" [ -n "$XBPS_MAKEJOBS" ] && arg="$arg -j$XBPS_MAKEJOBS" [ -n "$XBPS_DEBUG_PKGS" ] && arg="$arg -g" + [ -z "$XBPS_CHECK_PKGS" -o "$XBPS_CHECK_PKGS" = "0" -o "$XBPS_CHECK_PKGS" = "no" ] && arg="$arg -q" [ -n "$XBPS_SKIP_DEPS" ] && arg="$arg -I" [ -n "$XBPS_ALT_REPOSITORY" ] && arg="$arg -r $XBPS_ALT_REPOSITORY" [ -n "$XBPS_USE_GIT_REVS" ] && arg="$arg -G" diff --git a/common/xbps-src/shutils/consistency_check.sh b/common/xbps-src/shutils/consistency_check.sh index 0dbb194e46..6ac405da86 100644 --- a/common/xbps-src/shutils/consistency_check.sh +++ b/common/xbps-src/shutils/consistency_check.sh @@ -4,7 +4,7 @@ consistency_check_existing () { while IFS=" " read -r dep origname deplabel; do [ -f "$XBPS_SRCPKGDIR/$dep/template" ] && continue case "$deplabel" in - makedepends|hostmakedepends) + makedepends|hostmakedepends|checkdepends) msg_warn "unsatisfied $deplabel in $origname: $dep does not exist\n"; ;; *) printf "%s %s %s\n" "$dep" "$origname" "$deplabel" ;; @@ -16,7 +16,7 @@ consistency_convert_pkgname () { local origname= pkgname version= revision= while IFS=" " read -r dep origname deplabel; do case "$deplabel" in - makedepends|hostmakedepends) + makedepends|hostmakedepends|checkdepends) printf "%s %s %s\n" "$dep" "$origname" "$deplabel" continue ;; @@ -41,7 +41,7 @@ consistency_check_smart () { local pkgname= depdef= dep= while IFS=" " read -r depdef origname deplabel; do case "$deplabel" in - makedepends|hostmakedepends) + makedepends|hostmakedepends|checkdepends) printf "%s %s %s\n" "$depdef" "$origname" "$deplabel" continue ;; @@ -73,6 +73,7 @@ consistency_check() { [ -L "$XBPS_SRCPKGDIR/$XBPS_TARGET_PKG" ] && continue [ "$makedepends" ] && printf "%s $pkgname makedepends\n" $makedepends [ "$hostmakedepends" ] && printf "%s $pkgname hostmakedepends\n" $hostmakedepends + [ "$checkdepends" ] && printf "%s $pkgname checkdepends\n" $checkdepends ) done | grep -v "^virtual?" | sed "s/^[^ ]*?//" | consistency_check_existing | \ consistency_convert_pkgname | consistency_check_smart diff --git a/etc/defaults.conf b/etc/defaults.conf index 72ee2462a1..701444500a 100644 --- a/etc/defaults.conf +++ b/etc/defaults.conf @@ -63,6 +63,11 @@ XBPS_SUCMD="sudo /bin/sh -c" # #XBPS_USE_GIT_REVS=yes +# [OPTIONAL] +# Enable running the (optional) do_check() function of a package. +# +#XBPS_CHECK_PKGS=yes + # [OPTIONAL] # Enable building -dbg subpackages with debugging symbols. Please note # that building with debugging symbols make take a long while in some diff --git a/xbps-src b/xbps-src index a7858c6ee7..713691cb03 100755 --- a/xbps-src +++ b/xbps-src @@ -30,6 +30,9 @@ bootstrap-update build Build package source (fetch + extract + configure + build). +check + Run the package check(s) after building the package source. + consistency-check Runs a consistency check on all packages @@ -412,7 +415,7 @@ readonly XBPS_GCC_VERSION=${XBPS_GCC_VERSION_MAJOR}.${XBPS_GCC_VERSION_MINOR}.${ # main() # XBPS_OPTIONS= -XBPS_OPTSTRING="a:CEfgGhH:Ij:Lm:No:r:tV" +XBPS_OPTSTRING="a:CEfgGhH:Ij:Lm:No:qr:tV" # Preprocess arguments in order to allow options before and after XBPS_TARGET. eval set -- $(getopt -- "$XBPS_OPTSTRING" "$@"); @@ -433,6 +436,7 @@ while getopts "$XBPS_OPTSTRING" opt; do m) readonly XBPS_MASTERDIR=$(readlink -m $OPTARG 2>/dev/null); XBPS_OPTIONS+=" -m $XBPS_MASTERDIR";; N) readonly XBPS_SKIP_REMOTEREPOS=1; XBPS_OPTIONS+=" -N";; o) readonly XBPS_PKG_OPTIONS="$OPTARG"; XBPS_OPTIONS+=" -o $OPTARG";; + q) export XBPS_CHECK_PKGS=0; XBPS_OPTIONS+=" -q";; r) readonly XBPS_ALT_REPOSITORY="$OPTARG"; XBPS_OPTIONS+=" -r $OPTARG";; t) export XBPS_TEMP_MASTERDIR=1; XBPS_OPTIONS+=" -t -C";; V) echo $XBPS_SRC_VERSION && exit 0;; @@ -569,7 +573,7 @@ export XBPS_SHUTILSDIR XBPS_CROSSPFDIR XBPS_TRIGGERSDIR \ XBPS_CMPVER_CMD XBPS_FETCH_CMD XBPS_VERSION XBPS_APIVER \ XBPS_BUILDSTYLEDIR XBPS_CPPFLAGS XBPS_CFLAGS XBPS_CXXFLAGS XBPS_LDFLAGS \ XBPS_MAKEJOBS XBPS_BUILD_FORCEMODE XBPS_USE_GIT_REVS XBPS_DEBUG_PKGS \ - XBPS_CCACHE XBPS_DISTCC XBPS_DISTCC_HOSTS XBPS_SKIP_DEPS \ + XBPS_CHECK_PKGS XBPS_CCACHE XBPS_DISTCC XBPS_DISTCC_HOSTS XBPS_SKIP_DEPS \ XBPS_SKIP_REMOTEREPOS XBPS_CROSS_BUILD XBPS_PKG_OPTIONS XBPS_CONFIG_FILE \ XBPS_KEEP_ALL XBPS_HOSTDIR XBPS_MASTERDIR XBPS_SRC_VERSION \ XBPS_DESTDIR XBPS_MACHINE XBPS_TEMP_MASTERDIR XBPS_BINPKG_EXISTS \ @@ -697,7 +701,7 @@ case "$XBPS_TARGET" in remove_pkg_autodeps fi ;; - fetch|extract|build|configure|install|pkg) + fetch|extract|build|check|configure|install|pkg) read_pkg if [ -n "$CHROOT_READY" -a -z "$IN_CHROOT" ]; then chroot_handler $XBPS_TARGET $XBPS_TARGET_PKG