VERSION="v0.35"
VERSIONSTRING="\
Build package utility from PLD Linux Packages repository
-$VERSION (C) 1999-2016 Free Penguins".
+$VERSION (C) 1999-2021 Free Penguins".
-CLEAN_PATH="/bin:/usr/bin:/usr/sbin:/sbin:/usr/X11R6/bin"
+# Clean PATH without /usr/local or user paths
+CLEAN_PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin"
# required rpm-build-macros
RPM_MACROS_VER=1.534
IPOPT=""
# use lftp by default when available
-USE_LFTP=
-lftp --version > /dev/null 2>&1 && USE_LFTP=yes
+test -z "${USE_LFTP+x}" && lftp --version > /dev/null 2>&1 && USE_LFTP=yes
PARALLEL_DOWNLOADS=10
WGET_RETRIES=${MAX_WGET_RETRIES:-0}
if rpm --specsrpm 2>/dev/null; then
FETCH_BUILD_REQUIRES_RPMSPECSRPM="yes"
+ FETCH_BUILD_REQUIRES_RPMSPEC_BINARY="no"
FETCH_BUILD_REQUIRES_RPMGETDEPS="no"
-else
+elif [ -x /usr/bin/rpmspec ]; then
FETCH_BUILD_REQUIRES_RPMSPECSRPM="no"
+ FETCH_BUILD_REQUIRES_RPMSPEC_BINARY="yes"
+ FETCH_BUILD_REQUIRES_RPMGETDEPS="no"
+else
if [ -x /usr/bin/rpm-getdeps ]; then
FETCH_BUILD_REQUIRES_RPMGETDEPS="yes"
else
#LOGFILE='../LOGS/log.$PACKAGE_NAME.$DATE'
#TITLECHANGE=no
-SU_SUDO="sudo"
+if [ "$(id -u )" != "0" ]; then
+ SU_SUDO="sudo"
+fi
if [ -n "$HOME_ETC" ]; then
USER_CFG="$HOME_ETC/.builderrc"
GETLOCAL=${GETLOCAL:-cp -a}
-if rpm --version 2>&1 | grep -q '4.0.[0-2]'; then
- RPM="rpm"
- RPMBUILD="rpm"
-else
- RPM="rpm"
- RPMBUILD="rpmbuild"
-fi
+RPM="rpm"
+RPMBUILD="rpmbuild"
#
# sanity checks
}
download_wget() {
- local outfile=$1 url=$2 retval
- wget --help 2>&1 | grep -q -- ' --no-check-certificate ' && WGET_OPTS="$WGET_OPTS --no-check-certificate"
- wget --help 2>&1 | grep -q -- ' --inet ' && WGET_OPTS="$WGET_OPTS --inet"
- wget --help 2>&1 | grep -q -- ' --retry-connrefused ' && WGET_OPTS="$WGET_OPTS --retry-connrefused"
- wget --help 2>&1 | grep -q -- ' --no-iri ' && WGET_OPTS="$WGET_OPTS --no-iri"
- WGET_OPTS="$WGET_OPTS --user-agent=$USER_AGENT"
-
- GETURI="wget -c -nd -t$WGET_RETRIES $WGET_OPTS $IPOPT"
+ local outfile=$1 url=$2 retval wget_help
+ if [ -z "${WGET_OPTS_SET+x}" ]; then
+ wget_help="$(wget --help 2>&1)"
+ echo "$wget_help" | grep -q -- ' --inet ' && WGET_OPTS="$WGET_OPTS --inet"
+ echo "$wget_help" | grep -q -- ' --retry-connrefused ' && WGET_OPTS="$WGET_OPTS --retry-connrefused"
+ echo "$wget_help" | grep -q -- ' --no-iri ' && WGET_OPTS="$WGET_OPTS --no-iri"
+ WGET_OPTS="-c -nd -t$WGET_RETRIES $WGET_OPTS --user-agent=$USER_AGENT $IPOPT --passive-ftp"
+ WGET_OPTS_SET=1
+ fi
- ${GETURI} --passive-ftp -O "$outfile" "$url"
+ wget $WGET_OPTS -O "$outfile" "$url"
retval=$?
if [ $retval -ne 0 ]; then
if [ "`echo $url | grep -E 'ftp://'`" ]; then
"
}
+is_rpmorg() {
+ local v
+
+ v=$(LC_ALL=C LANG=C rpm --version 2>&1)
+ v=${v#RPM version } # rpm 4
+ v=${v#rpm \(RPM\) } # rpm 5
+
+ case "$v" in
+ 4.5|5.*)
+ return 1
+ ;;
+ 4.*)
+ return 0;
+ ;;
+ *)
+ echo "ERROR: unsupported RPM version $v" >&2
+ exit 1
+ esac
+}
+
# create tempfile. as secure as possible
tempfile() {
local prefix=builder.$PACKAGE_NAME${1:+.$1}
s/apache\(EAPI\)-devel/apache-devel/
- s/db-devel/db5.3-devel/
+ s/^db-devel/db5.3-devel/
s/libjpeg-devel/libjpeg-turbo-devel/
'
}
# runs rpm with minimal macroset
minirpm() {
- safe_macrofiles=$(rpm $TARGET_SWITCH --showrc | awk -F: '/^macrofiles/ { gsub(/^macrofiles[ \t]+:/, "", $0); print $0 } ')
-
# TODO: move these to /usr/lib/rpm/macros
cat > $BUILDER_MACROS <<'EOF'
%x8664 x86_64 amd64 ia32e
%_sourcedir ./
EOF
fi
- eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --macros "$safe_macrofiles:$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1
+ if ! is_rpmorg; then
+ local safe_macrofiles
+ safe_macrofiles=$(rpm $TARGET_SWITCH --showrc | awk -F: '/^macrofiles/ { gsub(/^macrofiles[ \t]+:/, "", $0); print $0 } ')
+ eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --macros "$safe_macrofiles:$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1
+ else
+ eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --load "$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1
+ fi
}
cache_rpm_dump() {
if [ -n "$CVSTAG" ]; then
if git rev-parse --verify -q "$CVSTAG" >/dev/null; then
- git checkout "$CVSTAG" --
+ # checkout only if differs, so this will not trash git reflog
+ if [ $(git rev-parse "$CVSTAG") != $(git rev-parse HEAD) ]; then
+ git checkout "$CVSTAG" --
+ fi
elif git rev-parse --verify -q "refs/remotes/${REMOTE_PLD}/$CVSTAG"; then
git checkout -t "refs/remotes/${REMOTE_PLD}/$CVSTAG" > /dev/null
fi
# this may be set by user
unset GIT_SSH
# may be set by user
- unset GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_TESTING_PORCELAIN_COMMAND_LIST
+ unset GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_TESTING_PORCELAIN_COMMAND_LIST GIT_EDITOR
# fail if something still set
- env | grep ^GIT_ && Exit_error err_build_fail
+ env | grep ^GIT_ && Exit_error err_build_fail "One of GIT_* env variables is still set. The builder script needs to be updated to unset that variable. In the meantime, unset it manually."
local specdir=$(insert_gitlog $SPECFILE)
+ ulimit -c unlimited
# FIXME: eval here is exactly why?
PATH=$CLEAN_PATH eval teeboth "'$logfile'" ${TIME_COMMAND} ${NICE_COMMAND} $RPMBUILD $TARGET_SWITCH $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $RPMBUILDOPTS $BCOND --define \'_specdir $PACKAGE_DIR\' --define \'_sourcedir $PACKAGE_DIR\' $specdir/$SPECFILE
retval=$?
without_*)
bcond=${opt#without_}
case "$BCOND" in
- *--without?${bcond}*)
+ *--without?${bcond}\ *|*--without?${bcond})
AVAIL_BCONDS_WITHOUT="$AVAIL_BCONDS_WITHOUT <$bcond>"
;;
*)
with_*)
bcond=${opt#with_}
case "$BCOND" in
- *--with?${bcond}*)
+ *--with?${bcond}\ *|*--with?${bcond})
AVAIL_BCONDS_WITH="$AVAIL_BCONDS_WITH <$bcond>"
;;
*)
# @return exit code from poldek
#
# this requires following sudo rules:
-# - poldek --noask --caplookup -uG
+# - poldek --noask --caplookup -ug
poldek_install() {
- LANG=C $POLDEK_CMD --noask --caplookup --uniq -uG "$@"
+ LC_ALL=C LANG=C $POLDEK_CMD --noask --caplookup --uniq -ug "$@"
}
# install packages
DEPS=$(cat)
fi
- LANG=C rpm -q --whatprovides $DEPS 2>/dev/null | awk '!/no package provides/ { print }'
+ LC_ALL=C LANG=C rpm -q --whatprovides $DEPS 2>/dev/null | awk '!/no package provides/ { print }'
}
# install deps via information from 'rpm-getdeps' or 'rpm --specsrpm'
CNFL=$(eval rpm-getdeps $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '/^\-/ { print $3 } ' | _rpm_cnfl_check | xargs)
DEPS=$(eval rpm-getdeps $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '/^\+/ { print $3 } ' | _rpm_prov_check | xargs)
fi
+ if [ "$FETCH_BUILD_REQUIRES_RPMSPEC_BINARY" = "yes" ]; then
+ CNFL=$(eval rpmspec --query --buildconflicts $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '{print $1}' | _rpm_cnfl_check | xargs);
+ DEPS=$(eval rpmspec --query --buildrequires $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '{print $1}' | _rpm_prov_check | xargs);
+ fi
if [ "$FETCH_BUILD_REQUIRES_RPMSPECSRPM" = "yes" ]; then
CNFL=$(eval rpm -q --specsrpm --conflicts $BCOND $RPMOPTS $SPECFILE | awk '{print $1}' | _rpm_cnfl_check | xargs)
DEPS=$(eval rpm -q --specsrpm --requires $BCOND $RPMOPTS $SPECFILE | awk '{print $1}' | _rpm_prov_check | xargs)
fi
update_shell_title "fetch build requires"
- if [ "$FETCH_BUILD_REQUIRES_RPMGETDEPS" = "yes" ] || [ "$FETCH_BUILD_REQUIRES_RPMSPECSRPM" = "yes" ]; then
+ if [ "$FETCH_BUILD_REQUIRES_RPMGETDEPS" = "yes" ] || [ "$FETCH_BUILD_REQUIRES_RPMSPECSRPM" = "yes" ] || [ "$FETCH_BUILD_REQUIRES_RPMSPEC_BINARY" = "yes" ]; then
install_build_requires_rpmdeps
return
fi
--http )
PROTOCOL="http"; shift ;;
-j)
- RPMOPTS="${RPMOPTS} --define \"_smp_mflags -j$2\""
+ RPMOPTS="${RPMOPTS} --define \"__jobs $2\""
shift 2
;;
-j[0-9]*)
- RPMOPTS="${RPMOPTS} --define \"_smp_mflags $1\""
+ RPMOPTS="${RPMOPTS} --define \"__jobs ${1#-j}\""
shift
;;
-p)
if [ -f "`pwd`/.${SPECFILE}_INSTALLED_PACKAGES" -a "$REMOVE_BUILD_REQUIRES" != "" ]; then
rm "`pwd`/.${SPECFILE}_INSTALLED_PACKAGES"
fi
-cd "$__PWD"
+test -d "$__PWD" && cd "$__PWD"
# vi:syntax=sh:ts=4:sw=4:noet