diff --git a/common/hooks/README b/common/hooks/README index 22028e84c81..81acadeb7de 100644 --- a/common/hooks/README +++ b/common/hooks/README @@ -13,18 +13,40 @@ The following directories are used to set the order in which the hooks should be processed by xbps-src: * pre-fetch (before running fetch phase) + * do-fetch (running fetch phase) * post-fetch (after running fetch phase) + * pre-extract (before running extract phase) + * do-extract (running extract phase) * post-extract (after running extract phase) + * pre-configure (before running configure phase) + * do-configure (running configure phase) * post-configure (after running configure phase) + * pre-build (before running build phase) + * do-build (running build phase) * post-build (after running build phase) + * pre-install (before running install phase) + * do-install (running install phase) * post-install (after running install phase) + * pre-pkg (before running pkg phase) + * do-pkg (running pkg phase) * post-pkg (after running pkg phase) NOTES ~~~~~ * Symlinks can be created (relative) to make a hook available in multiple phases. + +* The phases do-fetch, do-extract, do-configure, do-build, and do-install can + be overwritten by the template file. That means if a template contains a + do_install function, the hooks defined for do-install won't be executed. + Note that this is only true for the do-* hooks. + +* the pre_* function of the template will be run *after* the corresponding + pre-* hooks. + +* the post_* function of the template will be run *before* the corresponding + post-* hooks. diff --git a/common/hooks/do-build/.empty b/common/hooks/do-build/.empty new file mode 100644 index 00000000000..e69de29bb2d diff --git a/common/hooks/do-configure/.empty b/common/hooks/do-configure/.empty new file mode 100644 index 00000000000..e69de29bb2d diff --git a/common/hooks/do-extract/.empty b/common/hooks/do-extract/.empty new file mode 100644 index 00000000000..e69de29bb2d diff --git a/common/hooks/do-extract/00-distfiles.sh b/common/hooks/do-extract/00-distfiles.sh new file mode 100644 index 00000000000..78c095bbe1d --- /dev/null +++ b/common/hooks/do-extract/00-distfiles.sh @@ -0,0 +1,119 @@ +# This hook extracts $distfiles into $XBPS_BUILDDIR if $distfiles and $checksum +# variables are set. + +hook() { + local srcdir="$XBPS_SRCDISTDIR/$pkgname-$version" + + if [ -z "$distfiles" -a -z "$checksum" ]; then + mkdir -p $wrksrc + exit 0 + fi + + # Check that distfiles are there before anything else. + for f in ${distfiles}; do + curfile=$(basename $f) + if [ ! -f $srcdir/$curfile ]; then + msg_error "$pkgver: cannot find ${curfile}, use 'xbps-src fetch' first.\n" + fi + done + + if [ -n "$create_wrksrc" ]; then + mkdir -p ${wrksrc} || msg_error "$pkgver: failed to create wrksrc.\n" + fi + + msg_normal "$pkgver: extracting distfile(s), please wait...\n" + + for f in ${distfiles}; do + curfile=$(basename $f) + for j in ${skip_extraction}; do + if [ "$curfile" = "$j" ]; then + found=1 + break + fi + done + if [ -n "$found" ]; then + unset found + continue + fi + + if $(echo $f|grep -q '.tar.lzma'); then + cursufx="txz" + elif $(echo $f|grep -q '.tar.xz'); then + cursufx="txz" + elif $(echo $f|grep -q '.txz'); then + cursufx="txz" + elif $(echo $f|grep -q '.tar.bz2'); then + cursufx="tbz" + elif $(echo $f|grep -q '.tbz'); then + cursufx="tbz" + elif $(echo $f|grep -q '.tar.gz'); then + cursufx="tgz" + elif $(echo $f|grep -q '.tgz'); then + cursufx="tgz" + elif $(echo $f|grep -q '.gz'); then + cursufx="gz" + elif $(echo $f|grep -q '.bz2'); then + cursufx="bz2" + elif $(echo $f|grep -q '.tar'); then + cursufx="tar" + elif $(echo $f|grep -q '.zip'); then + cursufx="zip" + else + msg_error "$pkgver: unknown distfile suffix for $curfile.\n" + fi + + if [ -n "$create_wrksrc" ]; then + extractdir="$wrksrc" + else + extractdir="$XBPS_BUILDDIR" + fi + + case ${cursufx} in + txz) + unxz -cf $srcdir/$curfile | tar xf - -C $extractdir + if [ $? -ne 0 ]; then + msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n" + fi + ;; + tbz) + bunzip2 -cf $srcdir/$curfile | tar xf - -C $extractdir + if [ $? -ne 0 ]; then + msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n" + fi + ;; + tgz) + gunzip -cf $srcdir/$curfile | tar xf - -C $extractdir + if [ $? -ne 0 ]; then + msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n" + fi + ;; + gz|bz2) + cp -f $srcdir/$curfile $extractdir + if [ "$cursufx" = ".gz" ]; then + cd $extractdir && gunzip $curfile + else + cd $extractdir && bunzip2 $curfile + fi + ;; + tar) + tar xf $srcdir/$curfile -C $extractdir + if [ $? -ne 0 ]; then + msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n" + fi + ;; + zip) + if command -v unzip 2>&1 >/dev/null; then + unzip -q $srcdir/$curfile -d $extractdir + if [ $? -ne 0 ]; then + msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n" + fi + else + msg_error "$pkgver: cannot find unzip bin for extraction.\n" + fi + ;; + *) + msg_error "$pkgver: cannot guess $curfile extract suffix. ($cursufx)\n" + ;; + esac + done +} diff --git a/common/hooks/do-fetch/.empty b/common/hooks/do-fetch/.empty new file mode 100644 index 00000000000..e69de29bb2d diff --git a/common/hooks/do-fetch/00-distfiles.sh b/common/hooks/do-fetch/00-distfiles.sh new file mode 100644 index 00000000000..2dc3ba246db --- /dev/null +++ b/common/hooks/do-fetch/00-distfiles.sh @@ -0,0 +1,102 @@ +# This hook downloads the distfiles specified in a template by +# the $distfiles variable and then verifies its sha256 checksum comparing +# its value with the one stored in the $checksum variable. + +verify_sha256_cksum() { + local file="$1" origsum="$2" distfile="$3" + + [ -z "$file" -o -z "$cksum" ] && return 1 + + msg_normal "$pkgver: verifying checksum for distfile '$file'... " + filesum=$(${XBPS_DIGEST_CMD} $distfile) + if [ "$origsum" != "$filesum" ]; then + echo + msg_red "SHA256 mismatch for '$file:'\n$filesum\n" + return 1 + else + msg_normal_append "OK.\n" + fi +} + +hook() { + local srcdir="$XBPS_SRCDISTDIR/$pkgname-$version" + + if [ ! -d "$srcdir" ]; then + mkdir -p -m775 "$srcdir" + chgrp $(id -g) "$srcdir" + fi + + cd $srcdir || msg_error "$pkgver: cannot change dir to $srcdir!\n" + + for f in ${distfiles}; do + curfile=$(basename $f) + distfile="$srcdir/$curfile" + while true; do + flock -w 1 ${distfile}.part true + if [ $? -eq 0 ]; then + break + fi + msg_warn "$pkgver: ${distfile} is being already downloaded, waiting for 1s ...\n" + done + if [ -f "$distfile" ]; then + flock -n ${distfile}.part rm -f ${distfile}.part + for i in ${checksum}; do + if [ $dfcount -eq $ckcount -a -n "$i" ]; then + cksum=$i + found=yes + break + fi + ckcount=$(($ckcount + 1)) + done + if [ -z $found ]; then + msg_error "$pkgver: cannot find checksum for $curfile.\n" + fi + + verify_sha256_cksum $curfile $cksum $distfile + rval=$? + unset cksum found + ckcount=0 + dfcount=$(($dfcount + 1)) + continue + fi + + msg_normal "$pkgver: fetching distfile '$curfile'...\n" + + if [ -n "$distfiles" ]; then + localurl="$f" + else + localurl="$url/$curfile" + fi + + flock ${distfile}.part $XBPS_FETCH_CMD $localurl + if [ $? -ne 0 ]; then + unset localurl + if [ ! -f $distfile ]; then + msg_error "$pkgver: couldn't fetch $curfile.\n" + else + msg_error "$pkgver: there was an error fetching $curfile.\n" + fi + else + unset localurl + # + # XXX duplicate code. + # + for i in ${checksum}; do + if [ $dfcount -eq $ckcount -a -n "$i" ]; then + cksum=$i + found=yes + break + fi + ckcount=$(($ckcount + 1)) + done + if [ -z $found ]; then + msg_error "$pkgver: cannot find checksum for $curfile.\n" + fi + verify_sha256_cksum $curfile $cksum $distfile + rval=$? + unset cksum found + ckcount=0 + fi + dfcount=$(($dfcount + 1)) + done +} diff --git a/common/hooks/do-install/.empty b/common/hooks/do-install/.empty new file mode 100644 index 00000000000..e69de29bb2d diff --git a/common/hooks/do-pkg/.empty b/common/hooks/do-pkg/.empty new file mode 100644 index 00000000000..e69de29bb2d diff --git a/common/hooks/pre-pkg/00-gen-pkg.sh b/common/hooks/do-pkg/00-gen-pkg.sh similarity index 100% rename from common/hooks/pre-pkg/00-gen-pkg.sh rename to common/hooks/do-pkg/00-gen-pkg.sh diff --git a/common/hooks/post-extract/apply-patches.sh b/common/hooks/post-extract/00-patches.sh similarity index 100% rename from common/hooks/post-extract/apply-patches.sh rename to common/hooks/post-extract/00-patches.sh diff --git a/common/hooks/pre-configure/gnu-configure-asneeded.sh b/common/hooks/pre-configure/00-gnu-configure-asneeded.sh similarity index 100% rename from common/hooks/pre-configure/gnu-configure-asneeded.sh rename to common/hooks/pre-configure/00-gnu-configure-asneeded.sh diff --git a/common/hooks/pre-configure/musl-override-configsub.sh b/common/hooks/pre-configure/01-musl-override-configsub.sh similarity index 100% rename from common/hooks/pre-configure/musl-override-configsub.sh rename to common/hooks/pre-configure/01-musl-override-configsub.sh