#!/bin/sh # This script reads filenames from STDIN and outputs any relevant requires # information that needs to be included in the package. # # Based on rpm-4.4.2/scripts/find-req.pl # Authors: Elan Ruusamäe export PATH="/sbin:/usr/sbin:/bin:/usr/bin" # Set the prefix, unless it is overriden : ${RPM_LIBDIR=/usr/lib/rpm} # Enable debug: JAVADEPS_DEBUG=true : ${JAVADEPS_DEBUG=false} # xsltproc for eclipse feature.xml : ${xsltproc=/usr/bin/xsltproc} # "%define java_min_classdataversion 51.0" in spec to minimum version to be 51.0 : ${MIN_CLASSDATAVERSION=} # save $- state, to enable in functions debug=$- javaclassversionfilter() { if [ "$MIN_CLASSDATAVERSION" ]; then set -- $* "$MIN_CLASSDATAVERSION" fi local v for v in $*; do echo "java(ClassDataVersion) >= $v" done | sort -V | tail -n 1 } javaclassversion() { set -$debug local mode=$1; shift [ $# -gt 0 ] || return 1 $JAVADEPS_DEBUG && echo >&2 ">> javaclassversion($mode): $*" # process only requires [ "$mode" = requires ] || return $ret local classver=$(echo "$@" | xargs -r file | grep -o 'compiled Java class data, version [0-9.]*' | awk '{print $NF}' | sort -u) if [ -z "$classver" ]; then return 1 fi javaclassversionfilter $classver return 0 } javajarversion() { set -$debug local mode=$1; shift local jar=$1 local tmp ret=0 $JAVADEPS_DEBUG && echo >&2 ">> javajarversion($mode): $jar" # check only files, symlinks could point outside buildroot [ -f "$jar" -a ! -L "$jar" ] || return $ret tmp=$(mktemp -d) unzip -q -d $tmp $jar >&2 # workaround for .jar files with stupid permissions chmod -R u+rwX $tmp # find .jar and .class files find_javadeps $mode $(find $tmp -type f -regextype posix-extended -regex '^.+\.(class|jar)$') || ret=1 rm -rf $tmp return $ret } eclipse_feature() { set -$debug local mode=$1; shift local file=$1 local ret=0 $JAVADEPS_DEBUG && echo >&2 ">> eclipse_feature($mode): $file" if [ ! -x $xsltproc ]; then return 0 fi $xsltproc --stringparam mode $mode ${RPM_LIBDIR}/eclipse-feature.xslt $file } find_javadeps() { set -$debug local mode=$1; shift local ret=0 $JAVADEPS_DEBUG && echo >&2 ">> find_javadeps($mode): $*" for file in $@; do case $file in *.jar) javajarversion $mode "$file" || ret=1 ;; *.class) javaclassversion $mode "$file" || { echo >&2 "ERROR: Class version could not be extracted from $file" ret=1 } ;; */feature.xml) eclipse_feature $mode "$file" || ret=1 ;; *) $JAVADEPS_DEBUG && echo >&2 ">> find_javadeps($mode): no handle: $file" ;; esac done return $ret } ret=0 # default mode to requires for backward compat mode=requires case $1 in -P|--provides) mode=provides shift ;; -R|--requires) mode=requires shift ;; esac t=$(mktemp) find_javadeps $mode $(cat -) > $t || ret=1 sort -u $t rm -f $t exit $ret