#!/bin/sh # 2012 (c) Etersoft www.etersoft.ru # Author: Vitaly Lipatov <lav@etersoft.ru> # Public domain # VERBOSE= # load common functions, compatible with local and installed script . `dirname $0`/../share/eterbuild/functions/common load_mod spec rpm if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then echo "rpmreqs [package(s) file(s)] - print out package requires" exit 0 fi # moved from aptU get_rpm_package_requires() { (rpmquery --requires "$@" || return ) | cut -f1 -d" " | sed -e "s|\(^lib.*\)(.*[0-9])|\1|g" | grep -v "^rpmlib" | sort -u } filter_pkgname() { sed -e "s/^i586-//g s/.*(64bit)$//g s/\.32bit$//g" } filter_multiple_provides() { estrlist list - | sed -e "s|/usr/bin/lpstat|cups|g s|libldap_r-2.4.so.*|libldap|g s|liblber-2.4.so.*|libldap|g s|libudev.so.*|libudev1|g s|/usr/bin/wineboot||g s|/usr/bin/winepath||g s|/usr/bin/winetricks||g s|/usr/bin/wineserver||g s|/usr/bin/wine||g s|/usr/bin/jconsole|java-1.7.0-openjdk-devel|g s|/sbin/modprobe||g s|gcc-c++|gcc9-c++|g s|libltdl-devel|libltdl7-devel|g s|liblua5-devel|liblua5.3-devel|g s|clang-devel|clang10.0-devel|g s|libXcomp.so.3.*|nx-libs|g s|python3(samba.*||g s|libwine.so.1.*||g" } convert_pkgfile_to_pkgname() { for ni in $@ ; do # drop internal reqs (already converted via apt) #echo $ni | grep -q "/" && continue #echo $ni | grep -q "\.so" && continue #echo $ni | grep -q "(OPENSSL_1)" && continue # extra words when run on x86_64 ni=$(querypackage $ni NAME) echo $ni | filter_pkgname done | sort -u } # Translate requires from local rpm package to package names (on local ALT Linux Sisyphus) # FIXME: do not support x86_64 issues, use only with 32 bit packages # Use test from tests/test_cget_depends.sh trans_rpmdeps_to_pkgname_ldv() { # partially copied from aptU local ALREADYHANDLEDRPM="rpmlib.* rtld libgcc_s\..* libstdc\+\+.* libc\.so.* ld-linux\.so.* libpthread\.so.* librt\.so.*" local REQLIST="$@" REQLIST=$(estrlist reg_exclude "$ALREADYHANDLEDRPM" "$REQLIST") REALPKGNAMELIST=$(estrlist reg_exclude ". /*" "$REQLIST") REQCONVLIST=$(estrlist exclude "$REALPKGNAMELIST" "$REQLIST") set_hasherdir HASHERDIR=$HASHERDIR-pkgreqs mkdir -p $HASHERDIR PKGFILES=$(mkaptbox -f $HASHERDIR && $HASHERDIR/aptbox/apt-get install -qqqy -oRPM::PM=external -oDir::Bin::rpm=hsh-rpmi-print-files $REQCONVLIST) # partially copied from aptU #VIRTREQ=$(LANG=C apt-get install --print-uris $REQLIST 2>&1 | grep "is a virtual package provided by" | cut -f2 -d" " | sort -u) # FIXME: f.i., we got /usr/bin/lpstat in VIRTREQ (select cups or lprng package?). Skip now #REQLIST=$(regexp_exclude_list "VIRTREQ" "$REQLIST") #TRREALREQ=$(LANG=C apt-get install --print-uris $REQLIST 2>&1 | grep "^Selecting" | cut -f2 -d" " | sort -u) # remove basesystem packages ALREADYHANDLEDRPM=" bash sh filesystem alt-gpgkeys glibc-core glibc-locales glibc-preinstall tcb-utils nss_tcb libtcb chkconfig service setup shadow-utils shadow-convert module-init-tools kmod util-linux-control pam alternatives automake-common glib2-locales rpm-macros-alternatives emacs-base pam0-config pam0_mktemp pam0_passwdqc pam0_tcb pam0_userpass pam-config pam-config-control sysvinit-utils libpam0 control libbeecrypt7 libX11-locales glib2-locales libtic libpasswdqc librpm libshell ca-certificates common-licenses librpmbuild passwdqc-control" REQLIST=$(estrlist union $(convert_pkgfile_to_pkgname $PKGFILES) $REALPKGNAMELIST) REQLIST=$(estrlist reg_exclude "$ALREADYHANDLEDRPM" "$REQLIST" ) estrlist union $REQLIST } # Translate requires from local rpm package to package names (on local ALT Linux Sisyphus) # FIXME: do not support x86_64 issues, use only with 32 bit packages # Use test from tests/test_cget_depends.sh # TODO: use hasher (see func before) # TODO: do not run apt-get install directly trans_rpmdeps_to_pkgname_lav() { # partially copied from aptU local ALREADYHANDLEDRPM="rpmlib.* rtld libgcc_s\..* libstdc\+\+.* libc\.so.* libm\.so.* ld-linux\.so.* ld-linux-x86-64\.so.* libpthread\.so.* librt\.so.* libdl\.so.*" local REQLIST="$@" REQLIST=$(estrlist reg_exclude "$ALREADYHANDLEDRPM" "$REQLIST") # FIXME: strange regexp for drop libNAME.so.NUM and perl(Package) and /bin/sh REALPKGNAMELIST=$(estrlist reg_exclude ".*\.so\..* .*/.* .*(.*" "$REQLIST") # FIXME: external list? Set priorities/ REQCONVLIST="$(estrlist exclude "$REALPKGNAMELIST" "$REQLIST" | filter_multiple_provides | sed -e "s|\([^)]\)(64bit)|\1.*(64bit)|g")" # partially copied from aptU #VIRTREQ=$(LANG=C apt-get install --print-uris $REQLIST 2>&1 | grep "is a virtual package provided by" | cut -f2 -d" " | sort -u) #FIXME: f.i., we got /usr/bin/lpstat in VIRTREQ (select cups or lprng package?). Skip now #REQLIST=$(estrlist reg_exclude "VIRTREQ" "$REQLIST") # TODO: we have store_output function TFILE=$(make_temp_file) PKGFILES= if [ -n "$REQCONVLIST" ] ; then PKGFILES=$(LANG=C apt-get install --print-uris $REQCONVLIST 2>$TFILE | grep -E "(^Selecting|.* is already the newest version.)" | sed -e "s|^Selecting ||g" | sed -e "s| is already the newest version.||g" | sed -e "s| .*||g" | sort -u | filter_pkgname) || warning "Error return code from apt-get install" if grep -q "is a virtual package provided by" $TFILE ; then local INSTALLMARK="\[Installed\]" if ! grep -q "$INSTALLMARK" $TFILE ; then fatal "multiple provides: $(cat $TFILE)" fi PKGINSTALLED="$(grep "$INSTALLMARK" $TFILE | estrlist filter_strip_spaces | sed -e "s| .*||g")" if [ -z "$PKGINSTALLED" ] ; then fatal "can't resolve multiple provides: $(cat $TFILE)" fi PKGFILES="$PKGFILES $PKGINSTALLED" fi fi if grep -q "Couldn't find package" $TFILE ; then fatal "$(cat $TFILE | grep "Couldn't find package")" fi #grep -q "^E:" $TFILE && fatal "Can't get correct result from apt: $(cat $TFILE)" rm -f $TFILE # remove ALT basesystem packages ALREADYHANDLEDRPM=" bash sh filesystem alt-gpgkeys glibc-core glibc-locales glibc-preinstall rpm apt apt-repo apt-scripts update-kernel tcb-utils nss_tcb libtcb chkconfig service setup shadow-utils shadow-convert module-init-tools kmod util-linux-control pam alternatives automake-common glib2-locales altlinux-release rpm-macros-alternatives emacs-base pam0-config pam0_mktemp pam0_passwdqc pam0_tcb pam0_userpass pam-config pam-config-control sysvinit-utils libpam0 control libbeecrypt7 libX11-locales gcc-c++ liblua5-devel libltdl-devel glib2-locales libtic libpasswdqc librpm libshell ca-certificates common-licenses librpmbuild passwdqc-control" REQLIST=$(estrlist union $PKGFILES $REALPKGNAMELIST) REQLIST=$(estrlist reg_exclude "$ALREADYHANDLEDRPM" "$REQLIST" ) estrlist union $REQLIST | estrlist list - } if [ "$1" = "-p" ] ; then [ -s "$2" ] || fatal "Missed file $2" fi REQLIST=$(get_rpm_package_requires "$@") || fatal "can't get primary requires" trans_rpmdeps_to_pkgname_lav $REQLIST