diff --git a/README.md b/README.md index 320365ef921..66cdb30c9ce 100644 --- a/README.md +++ b/README.md @@ -343,15 +343,15 @@ Each time a binary package is created, a package signature must be created with ### Rebuilding and overwriting existing local packages -If for whatever reason a package has been built and it is available in your local repository -and you have to rebuild it without bumping its `version` or `revision` fields, it is possible -to accomplish this task easily with `xbps-src`: +Packages are overwritten on every build to make getting package with changed build options easy. +To make xbps-src skip build and preserve first package build with with given version and revision, +same as in official void repository, set `XBPS_PRESERVE_PKGS=yes` in `etc/conf` file. - $ ./xbps-src -f pkg xbps +Reinstalling a package in your target `rootdir` can be easily done too: -Reinstalling this package in your target `rootdir` can be easily done too: + $ xbps-install --repository=/path/to/local/repo -yf xbps-0.25_1 - $ xbps-install --repository=/path/to/local/repo -yff xbps-0.25_1 +Using `-f` flag twice will overwrite configuration files. > Please note that the `package expression` must be properly defined to explicitly pick up the package from the desired repository. diff --git a/common/hooks/do-pkg/00-gen-pkg.sh b/common/hooks/do-pkg/00-gen-pkg.sh index cfe0238839d..e61f0532bd7 100644 --- a/common/hooks/do-pkg/00-gen-pkg.sh +++ b/common/hooks/do-pkg/00-gen-pkg.sh @@ -19,7 +19,7 @@ genpkg() { done # Don't overwrite existing binpkgs by default, skip them. - if [ -f $pkgdir/$binpkg -a -z "$XBPS_BUILD_FORCEMODE" ]; then + if [ -e $pkgdir/$binpkg ] && [ "$XBPS_PRESERVE_PKGS" ] && [ -z "$XBPS_BUILD_FORCEMODE" ]; then msg_normal "${pkgver}: skipping existing $binpkg pkg...\n" return 0 fi diff --git a/common/xbps-src/libexec/build.sh b/common/xbps-src/libexec/build.sh index 3ac5a962d15..72432316e6e 100755 --- a/common/xbps-src/libexec/build.sh +++ b/common/xbps-src/libexec/build.sh @@ -35,6 +35,8 @@ esac setup_pkg "$PKGNAME" $XBPS_CROSS_BUILD readonly SOURCEPKG="$sourcepkg" +check_existing_pkg + show_pkg_build_options check_pkg_arch $XBPS_CROSS_BUILD @@ -104,18 +106,21 @@ cut -d: -f 1,2 ${XBPS_STATEDIR}/.${sourcepkg}_register_pkg | sort -u | \ while IFS=: read -r arch repo; do paths=$(grep "^$arch:$repo:" "${XBPS_STATEDIR}/.${sourcepkg}_register_pkg" | \ cut -d : -f 2,3 | tr ':' '/') + if [ -z "$XBPS_PRESERVE_PKGS" ] || [ "$XBPS_BUILD_FORCEMODE" ]; then + force=-f + fi if [ -n "${arch}" ]; then msg_normal "Registering new packages to $repo ($arch)\n" XBPS_TARGET_ARCH=${arch} $XBPS_RINDEX_CMD \ - ${XBPS_REPO_COMPTYPE:+--compression $XBPS_REPO_COMPTYPE} ${XBPS_BUILD_FORCEMODE:+-f} -a ${paths} + ${XBPS_REPO_COMPTYPE:+--compression $XBPS_REPO_COMPTYPE} ${force} -a ${paths} else msg_normal "Registering new packages to $repo\n" if [ -n "$XBPS_CROSS_BUILD" ]; then $XBPS_RINDEX_XCMD ${XBPS_REPO_COMPTYPE:+--compression $XBPS_REPO_COMPTYPE} \ - ${XBPS_BUILD_FORCEMODE:+-f} -a ${paths} + ${force} -a ${paths} else $XBPS_RINDEX_CMD ${XBPS_REPO_COMPTYPE:+--compression $XBPS_REPO_COMPTYPE} \ - ${XBPS_BUILD_FORCEMODE:+-f} -a ${paths} + ${force} -a ${paths} fi fi done diff --git a/common/xbps-src/shutils/pkgtarget.sh b/common/xbps-src/shutils/pkgtarget.sh index 13430b3157f..06fbcd844cc 100644 --- a/common/xbps-src/shutils/pkgtarget.sh +++ b/common/xbps-src/shutils/pkgtarget.sh @@ -1,5 +1,18 @@ # vim: set ts=4 sw=4 et: +check_existing_pkg() { + local arch= curpkg= + if [ -z "$XBPS_PRESERVE_PKGS" ] || [ "$XBPS_BUILD_FORCEMODE" ]; then + return + fi + arch=$XBPS_TARGET_MACHINE + curpkg=$XBPS_REPOSITORY/$repository/$pkgver.$arch.xbps + if [ -e $curpkg ]; then + msg_warn "$pkgver: skipping build due to existing $curpkg\n" + exit 0 + fi +} + check_pkg_arch() { local cross="$1" _arch f match nonegation diff --git a/etc/defaults.conf b/etc/defaults.conf index 6147954a18a..58369e95cbc 100644 --- a/etc/defaults.conf +++ b/etc/defaults.conf @@ -147,3 +147,9 @@ XBPS_SUCMD="sudo /bin/sh -c" # meant as safeguard against users casually destroying their systems # #XBPS_ALLOW_CHROOT_BREAKOUT=yes + +# [OPTIONAL] +# Skip building package if it exists in local repository, emitting warning. +# When unset, newly build package overwrites the older one. +# +#XBPS_PRESERVE_PKGS=yes diff --git a/xbps-src b/xbps-src index 7fe0ac55ffd..ff249015ed0 100755 --- a/xbps-src +++ b/xbps-src @@ -638,7 +638,8 @@ export XBPS_SHUTILSDIR XBPS_CROSSPFDIR XBPS_TRIGGERSDIR \ XBPS_DESTDIR XBPS_MACHINE XBPS_TEMP_MASTERDIR XBPS_BINPKG_EXISTS \ XBPS_LIBEXECDIR XBPS_DISTDIR XBPS_DISTFILES_MIRROR XBPS_ALLOW_RESTRICTED \ XBPS_USE_GIT_COMMIT_DATE XBPS_PKG_COMPTYPE XBPS_REPO_COMPTYPE \ - XBPS_BUILDHELPERDIR XBPS_USE_BUILD_MTIME XBPS_BUILD_ENVIRONMENT + XBPS_BUILDHELPERDIR XBPS_USE_BUILD_MTIME XBPS_BUILD_ENVIRONMENT \ + XBPS_PRESERVE_PKGS for i in REPOSITORY DESTDIR BUILDDIR SRCDISTDIR; do eval val="\$XBPS_$i"