]> git.pld-linux.org Git - packages/rpm-build-macros.git/blobdiff - rpm-java-requires
- move java macros and javaprov here from rpm package
[packages/rpm-build-macros.git] / rpm-java-requires
diff --git a/rpm-java-requires b/rpm-java-requires
new file mode 100755 (executable)
index 0000000..8bbac6f
--- /dev/null
@@ -0,0 +1,137 @@
+#!/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 <glen@pld-linux.org>
+
+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
This page took 0.040745 seconds and 4 git commands to generate.