X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=builder.sh;h=68bb875cefd28034cd1956df8a4592cf195e3889;hb=b1e8c12b2d66e7aadd9bb2c0d1acfc612d50aa22;hp=7612557d0823bcfac1e581b1f013e778010fcf6f;hpb=c8c52be7cc9daf24a9a3ef23a034580a8fdb3fdf;p=packages%2Frpm-build-tools.git diff --git a/builder.sh b/builder.sh index 7612557..68bb875 100755 --- a/builder.sh +++ b/builder.sh @@ -38,9 +38,10 @@ APPDIR=$(d=$0; [ -L "$d" ] && d=$(readlink -f "$d"); dirname "$d") 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 @@ -114,8 +115,7 @@ PROTOCOL="http" 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} @@ -151,9 +151,13 @@ REVERT_BROKEN_UPGRADE="yes" 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 @@ -182,7 +186,9 @@ fi #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" @@ -214,13 +220,8 @@ fi 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 @@ -275,16 +276,17 @@ download_axel() { } 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 @@ -479,6 +481,26 @@ Usage: builder [--all-branches] [-D|--debug] [-V|--version] [--short-version] [ " } +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} @@ -576,7 +598,7 @@ depspecname() { s/apache\(EAPI\)-devel/apache-devel/ - s/db-devel/db5.3-devel/ + s/^db-devel/db5.3-devel/ s/libjpeg-devel/libjpeg-turbo-devel/ ' } @@ -630,8 +652,6 @@ set_spec_target() { # 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 @@ -694,7 +714,13 @@ EOF %_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() { @@ -1051,7 +1077,10 @@ get_spec() { 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 @@ -1675,11 +1704,12 @@ build_package() { # 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=$? @@ -1803,7 +1833,7 @@ set_bconds_values() { without_*) bcond=${opt#without_} case "$BCOND" in - *--without?${bcond}*) + *--without?${bcond}\ *|*--without?${bcond}) AVAIL_BCONDS_WITHOUT="$AVAIL_BCONDS_WITHOUT <$bcond>" ;; *) @@ -1814,7 +1844,7 @@ set_bconds_values() { with_*) bcond=${opt#with_} case "$BCOND" in - *--with?${bcond}*) + *--with?${bcond}\ *|*--with?${bcond}) AVAIL_BCONDS_WITH="$AVAIL_BCONDS_WITH <$bcond>" ;; *) @@ -1869,9 +1899,9 @@ run_sub_builder() { # @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 @@ -2000,7 +2030,7 @@ _rpm_cnfl_check() { 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' @@ -2011,6 +2041,10 @@ install_build_requires_rpmdeps() { 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) @@ -2034,7 +2068,7 @@ fetch_build_requires() 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 @@ -2165,11 +2199,11 @@ while [ $# -gt 0 ]; do --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) @@ -2722,6 +2756,5 @@ esac if [ -f "`pwd`/.${SPECFILE}_INSTALLED_PACKAGES" -a "$REMOVE_BUILD_REQUIRES" != "" ]; then rm "`pwd`/.${SPECFILE}_INSTALLED_PACKAGES" fi -cd "$__PWD" # vi:syntax=sh:ts=4:sw=4:noet