VERSION="v0.35"
VERSIONSTRING="\
Build package utility from PLD Linux Packages repository
-$VERSION (C) 1999-2016 Free Penguins".
+$VERSION (C) 1999-2020 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
"
}
+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}
%_sourcedir ./
EOF
fi
- if rpm --version 2>&1 | grep -qE '5\.[0-9]+\.[0-9]+'; then
+ 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
local _rev=$(get_pkgrev "$CVSTAG")
echo "$_rev" | grep -q -E "^ERROR$" || CVSTAG="$_rev"
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
${GETURI} "$target" "$url"
fi
+
if [ -s "$target" ]; then
cvsignore_df $target
else
local specdir=$(insert_gitlog $SPECFILE)
ulimit -c unlimited
+ # If required exclude directories with systemd related files from package contents
+ if grep -q -E 'systemd(unitdir|userunitdir|tmpfilesdir)' $specdir/$SPECFILE; then
+ sed -i -e '/^%exclude_systemd_files/d; /^%files/s/$/\n%exclude_systemd_files/g;' $specdir/$SPECFILE
+ fi
+ # Enable/disable distro wide bconds based on ~/.distbcond
+ process_distbcond "$specdir/$SPECFILE"
+ # Add %tld macro to release to allow release control
+ sed -i -r -e '/^Release:/s/%\{\?tld\}//g; s/^Release:\s+(.*)$/Release:\t\1%{?tld}/;' $specdir/$SPECFILE
# 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=$?
update_shell_title "parse ~/.bcondrc: DONE!"
}
+process_distbcond() {
+ # apply bconds from ~/.distbcond to spec
+ # The file structure is like gentoo's package.use:
+ # ---
+ # * -selinux
+ # samba -mysql -pgsql
+ # w32codec-installer license_agreement
+ # php +mysqli
+ # ---
+ if [ -f $HOME/.distbcond ] || ([ -n $HOME_ETC ] && [ -f $HOME_ETC/.distbcond ]); then
+ :
+ else
+ return
+ fi
+
+ SN=${SPECFILE%%\.spec}
+
+ local distbcond=$HOME/.distbcond
+ [ -n $HOME_ETC ] && [ -f $HOME_ETC/.distbcond ] && distbcond=$HOME_ETC/.distbcond
+
+ local bcond_avail=$(find_spec_bcond $SPECFILE)
+
+ while read pkg flags; do
+ # ignore comments
+ [[ "$pkg" == \#* ]] && continue
+
+ # any package or current package?
+ if [ "$pkg" = "*" ] || [ "$pkg" = "$PACKAGE_NAME" ] || [ "$pkg" = "$SN" ]; then
+ for flag in $flags; do
+ local opt=${flag#[+-]}
+
+ # use only flags which are in this package.
+ if [[ $bcond_avail = *${opt}* ]]; then
+ if [[ $flag = -* ]]; then
+ sed -i -r -e '/^%bcond_(with|without)\s+'$opt'/s/^%bcond_(with|without)/%bcond_with/g;' $specdir/$SPECFILE
+ elif [[ $flag = +* ]]; then
+ sed -i -r -e '/^%bcond_(with|without)\s+'$opt'/s/^%bcond_(with|without)/%bcond_without/g;' $specdir/$SPECFILE
+ fi
+ fi
+ done
+ fi
+ done < $distbcond
+ update_shell_title "parse ~/.distbcond: DONE!"
+}
+
set_bconds_values() {
update_shell_title "set bcond values"
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>"
;;
*)
# this requires following sudo rules:
# - 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'