#!/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" # save $- state, to enable in functions debug=$- # enable debug: FIND_JAVAREQ_DEBUG=true FIND_JAVAREQ_DEBUG=${FIND_JAVAREQ_DEBUG:-false} javaclassversion() { set -$debug [ $# -gt 0 ] || return 1 $FIND_JAVAREQ_DEBUG && echo >&2 ">> class: $*" 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 local v for v in $classver; do echo "java(ClassDataVersion) >= $v" done return 0 } javajarversion() { set -$debug local jar="$1" local tmp ret=0 $FIND_JAVAREQ_DEBUG && echo >&2 ">> jar: $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_requires $(find $tmp -type f -regex '^.+\.(class|jar)$') || ret=1 rm -rf $tmp return $ret } find_requires() { set -$debug local ret=0 $FIND_JAVAREQ_DEBUG && echo >&2 ">> find_requires: $*" for file in $@; do case $file in *.jar) javajarversion "$file" || ret=1 ;; *.class) javaclassversion "$file" || { echo >&2 "ERROR: Class version could not be extracted from $file" ret=1 } ;; *) $FIND_JAVAREQ_DEBUG && echo >&2 ">> find_requires: no handle: $file" ;; esac done return $ret } t=$(mktemp) ret=0 find_requires $(cat -) > $t || ret=1 sort -u $t rm -f $t exit $ret