Author: tille Date: 2009-04-29 08:59:15 +0000 (Wed, 29 Apr 2009) New Revision: 3333
Modified: trunk/packages/imagej/trunk/debian/imagej.sh Log: Commit a patch by Johan Henriksson <[email protected]> which he describes as follows: it allows dependent packages to add JNI-paths. this is a critical update as an important package (micromanager-ij) depends on it. if you can't get it in very soon, let me know so I can opt for alternative solutions. Modified: trunk/packages/imagej/trunk/debian/imagej.sh =================================================================== --- trunk/packages/imagej/trunk/debian/imagej.sh 2009-04-28 06:08:10 UTC (rev 3332) +++ trunk/packages/imagej/trunk/debian/imagej.sh 2009-04-29 08:59:15 UTC (rev 3333) @@ -4,7 +4,7 @@ # Copyright © 2008 Paolo Ariano # Authors: Paolo Ariano (paolo dot ariano at unito dot it) -# Last modified date: 19 Sept 2008 +# Last modified date: 04 March 2008 # This is a not so simple wrapper script used to run ImageJ in Unix but # optimized for Debian GNU/Linux, this is a merge between my original script @@ -23,13 +23,13 @@ set +u # don't give error for unset variables (matters for environment variables) shopt -s extglob # allow extended pattern matching -##################### DEFINE JAVA_HOME .DEB ##################### +##################### DEFINE JAVA_HOME ##################### if [ -z "$JAVA_HOME" ] ; then - JAVA_HOME=$(dirname $(dirname $(readlink -e /usr/bin/java))) + JAVA_HOME=$(/usr/sbin/update-java-alternatives -l | head -1 | cut -d' ' -f 3) fi -##################### CREATE THE RIGHT ENVIRONMENT .DEB ##################### +##################### CREATE THE RIGHT ENVIRONMENT ##################### # ImageJ path ij_path=/usr/share/java @@ -37,11 +37,14 @@ #ImageJ user path ij_user_path=$HOME/.imagej +# report errors to this user +ijadmin='[email protected]' + # Documentation URL doc_url='http://rsb.info.nih.gov/ij/' # temp folder -ij_tmp='/tmp/imagej' +ij_tmp=$HOME/.imagej/tmp # default behaviour when an ImageJ window is already open newwindow='true' @@ -53,35 +56,12 @@ # use macro functions: args=getArgument(); argArray=split(args, ':'); # to recover macro arguments -# create plugins,macro,tmp dirs -mkdir -p $ij_user_path/plugins -mkdir -p $ij_user_path/macros -mkdir -p $ij_user_path/luts +declare -i mem +declare -i default_mem=500 +declare -i min_mem=16 +declare -i max_mem +declare -i free_mem -# makes symbolik links from shared plugins, macros and luts - -ls /usr/share/imagej/plugins | while read p ; do - if [ ! -e "$ij_user_path/plugins/$p" ] ; then - ln -s /usr/share/imagej/plugins/$p $ij_user_path/plugins/$p - fi -done - -ls /usr/share/imagej/macros | while read p; do - if [ ! -e "$ij_user_path/macros/$p" ] ; then - ln -s "/usr/share/imagej/macros/$p" "$ij_user_path/macros/$p" - fi -done - -ls /usr/share/imagej/luts | while read p ; do - if [ ! -e "$ij_user_path/luts/$p" ] ; then - ln -s /usr/share/imagej/luts/$p $ij_user_path/luts/$p - fi -done - - -# report errors to this user -# ijadmin='[email protected]' - # other variables dir=`pwd` user=`whoami` @@ -103,49 +83,76 @@ macrocmd='' macroargs='' -############ DEFAULT MEMORY SETTINGS ######################### - -declare -i default_mem=768 -declare -i min_mem=32 -declare -i max_32bit=1800 # empirical -declare -i max_64bit=17000000000 # conservative - -############ MEMORY ALLOCATION ######################### - -OS=$(uname) -processor=$(uname -m) # -p doesn't work on debian/ubuntu -declare -i mem -declare -i max_mem -declare -i free_mem - -java_home="${java_home:-$JAVA_HOME}" - -if [[ "$OS" == 'SunOS' ]] ; then - java_arch='-d64' - JAVA_HOME="${java_home_SunOS:-$java_home}" - max_mem=`vmstat | awk 'BEGIN{maxMem='$max_64bit'} NR == 3 {fmem=int($5 / 1024); if (fmem < maxMem) {print fmem} else {print maxMem}}'` +# max memory allocation is 1800MB on 32bit java and 4000 on 64bit java +if [[ `uname` == 'SunOS' ]] ; then + arch='-d64' + java_path="${ij_path}/jre64/bin/java" + max_mem=`vmstat | awk 'NR == 3 {fmem=int($5 / 1024); if (fmem < 4000) {print fmem} else {print 4000}}'` free_mem="max_mem" - mem=${free_mem}/2 + mem=${free_mem}/2*3 if (( $mem > $default_mem || $mem < $min_mem )) ; then mem=$default_mem ; fi -elif [[ "$OS" == 'Linux' ]] ; then - if [[ "$processor" == 'x86_64' ]] ; then - java_arch='-d64' - JAVA_HOME="${java_home_Linux_x86_64:-$java_home}" - max_mem=`free | awk -v maxMem=$max_64bit 'NR == 2 {fmem=int($2 / 1024); if (fmem < maxMem) {print fmem} else {print maxMem}}'` - free_mem=`free | awk -v maxMem=$max_64bit 'NR == 3 {fmem=int($4 / 1024); if (fmem < maxMem) {print fmem} else {print maxMem}}'` +elif [[ `uname` == 'Linux' ]] ; then + if [[ `uname -m` == 'x86_64' ]] ; then + arch='-d64' + java_path="${ij_path}/jre64/bin/java" + max_mem=`free | awk 'NR == 2 {fmem=int($2 / 1024); if (fmem < 4000) {print fmem} else {print 4000}}'` + free_mem=`free | awk 'NR == 3 {fmem=int($4 / 1024); if (fmem < 4000) {print fmem} else {print 4000}}'` mem=${free_mem}/3*2 if (( $mem > $default_mem || $mem < $min_mem )) ; then mem=$default_mem ; fi else - java_arch='-d32' - JAVA_HOME="${java_home_Linux:-$java_home}" - max_mem=`free | awk -v maxMem=$max_32bit 'NR == 2 {fmem=int($2 / 1024); if (fmem < maxMem) {print fmem} else {print maxMem}}'` - free_mem=`free | awk -v maxMem=$max_32bit 'NR == 3 {fmem=int($4 / 1024); if (fmem < maxMem) {print fmem} else {print maxMem}}'` + arch='-d32' + java_path="${ij_path}/jre/bin/java" + free_mem=`free | awk 'NR == 2 {fmem=int($2 / 1024); if (fmem < 1800) {print fmem} else {print 1800}}'` + free_mem=`free | awk 'NR == 3 {fmem=int($4 / 1024); if (fmem < 1800) {print fmem} else {print 1800}}'` mem=${free_mem}/3*2 if (( $mem > $default_mem || $mem < $min_mem )) ; then mem=$default_mem ; fi fi fi +# create plugins,macro,tmp dirs +mkdir -p $ij_user_path/plugins +mkdir -p $ij_user_path/macros +mkdir -p $ij_user_path/luts +# create imagej socket-lock directory if non existant +if [[ ! -d "$ij_tmp" ]] ; then + mkdir -p "$ij_tmp" + #chmod 777 "$ij_user_path/tmp" +fi + +# Warning on syntax change +# for var in "$@" ; do + #if [[ "$var" == @(-batch|-eval|-macro|-mem|-new|-port|-run|-verbose) ]] ; then +# if [ $var == @(-batch|-eval|-macro|-mem|-new|-port|-run|-verbose) ] ; then +# echo "ImageJ command line options have changed!" 1>&2 +# echo "$var is no longer a valid option, type 'imagej -h'" 1>&2 +# echo "for full usage" 1>&2 +# exit 1 +# fi +# done + +# makes symbolik links from shared plugins, macros and luts + +ls /usr/share/imagej/plugins | while read p ; do + if [ ! -e "$ij_user_path/plugins/$p" ] ; then + ln -s /usr/share/imagej/plugins/$p $ij_user_path/plugins/$p + fi +done + +ls /usr/share/imagej/macros | while read p; do + if [ ! -e "$ij_user_path/macros/$p" ] ; then + ln -s "/usr/share/imagej/macros/$p" "$ij_user_path/macros/$p" + fi +done + +ls /usr/share/imagej/luts | while read p ; do + if [ ! -e "$ij_user_path/luts/$p" ] ; then + ln -s /usr/share/imagej/luts/$p $ij_user_path/luts/$p + fi +done + + + ##################### USAGE DESCRIPTION ##################### function usage { @@ -203,66 +210,11 @@ exit 1 } -function getFullPath { - # Return full path to file - # treats multiple arguments as a single file with spaces - if (( $# == 0 )) ; then - echo "error getting full path for '${*}'" 1>&2 - fi - pwd_getFullPath="$PWD" - \cd $(dirname "${*}") > /dev/null - dir_getFullPath="$PWD" - \cd "$pwd_getFullPath" > /dev/null - echo "$dir_getFullPath"/$(basename "${*}") -} -function derefln { - # Returns the full path of file to which link points - # following multiple levels of symbolic links. - # NOTE: if you use this function in a script, don't use any - # of the variable names used here - if (( $# == 0 )) ; then - return - fi - local the_link="$1" - local link_dir - local current_dir="$PWD" - while file "$the_link" | grep symbolic > /dev/null ; do # resolve links until target is regular file - if [[ "$the_link" == */* ]] ; then # path contains / - \cd $(dirname "${the_link}") > /dev/null - the_link=$(basename "$the_link") - fi - link_dir="$PWD" - # some versions of 'file' surround the path in `' quotes, hence the tr to remove them - the_link=$(file "${the_link}" | awk '/symbolic link/ {print $NF}' | tr -d "\140\047" ) - if [[ "$the_link" != /* ]] ; then # path is not absolute path - make it one - the_link="$link_dir/$the_link" - fi - \cd "$current_dir" > /dev/null - done - echo $the_link -} - - # The best way to install .jar libraries required by plugins is to copy them -# to the imagej plugins/jars directory -# Alternatively, either copy them to ${ij_path}/jre/lib/ext/ or add the .jar +# to the imagej ij_path=/usr/share/java alternatively or add the .jar # filepath to the modules line below. Paths are separated by a colon -# Classpath must follow command line arguments, as ij_path is dependent on the -d option - -# Resolving ij.jar path. If ij.jar is a symbolic link to ij_<version>.jar -# this allows updating ij.jar without crashing running sessions -ij_jar_path=$(derefln ${ij_path}/ij.jar) - -for mod_jar in ${ij_path}/lib/*jar ; do - modules="${modules:-}${modules+:}$mod_jar" -done -modules="-cp ${ij_jar_path}:${modules+:}${modules:-}" -#${ij_path}/plugins/jars/dcmie.jar - -export LD_LIBRARY_PATH="${ij_path}/lib/${OS}_$processor" -if (( $verbosity > 0 )) ; then - echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" -fi +# modules="-cp ${ij_path}/ij.jar:${ij_path}/plugins/jars/dcmie.jar" +modules="-cp ${ij_path}/ij.jar" # enable plugins to be compiled in imagej tools="$JAVA_HOME/lib/tools.jar" @@ -270,16 +222,14 @@ ##################### ARGUMENTS PARSING ##################### -while getopts b:cde:hi:m:nop:r:vx: options +while getopts b:ce:hi:m:op:r:vx: options do case $options in b) if [[ -n "$macrocmd" ]] ; then macroCmdError ; fi macrocmd="-batch ${OPTARG}" ;; - c) modules="${modules:-}${modules+:}${tools}" + c) modules="${modules}:${tools}" ;; - d) ij_path="$ij_path_dev" - ;; e) if [[ -n "$macrocmd" ]] ; then macroCmdError ; fi macrocmd='-eval' macroargs="'${OPTARG}'" @@ -292,8 +242,6 @@ m) if [[ -n "$macrocmd" ]] ; then macroCmdError ; fi macrocmd="-macro ${OPTARG}" ;; - n) newwindow='true' - ;; o) newwindow='false' ;; p) newwindow='false' @@ -312,7 +260,6 @@ if (( $verbosity == 3 )) ; then set -v ; fi ;; x) mem="${OPTARG}" - newwindow='true' if (( $mem < $min_mem || $mem > $max_mem )) ; then echo "${OPTARG} is not a permissible value for memory (-x)" 1>&2 echo "min=${min_mem}, max=${max_mem}" 1>&2 @@ -325,7 +272,6 @@ esac done - declare -i i=1 while (( i < $OPTIND )) ; do shift @@ -351,46 +297,26 @@ macroargs="'$macroargs'" fi -# PROTECT POSSIBLE SPACES IN IMAGE FILENAMES +# protect possible spaces in image filenames if (( "$#" > 0 )) ; then while (( "$#" > 0 )) ; do - filearg="${1}" - # full file path required when sending images to running ImageJ panel - if [[ "${newwindow}" == 'false' && -f "${filearg}" ]] && ! expr "${filearg}" : '/.*' > /dev/null; then - filearg="$(getFullPath ${filearg})" - fi - images="${images}'$filearg' " + images="${images}'${1}' " shift done -fi +fi ##################### USING PORT ##################### -# CREATE IMAGEJ SOCKET-LOCK DIRECTORY IF NON EXISTANT -if [[ ! -d "$ij_tmp" ]] ; then - mkdir "$ij_tmp" - chmod 777 "$ij_tmp" -fi - -# CREATE IMAGEJ LOG FILE IF NON EXISTANT -if [[ -n "$ij_log" && ! -f "$ij_log" ]] ; then - touch "$ij_log" - chmod 666 "$ij_log" -fi - -# CREATES A TEMP FILE INDICATING A PORT IS IN USE BY IMAGEJ -cd "$ij_tmp" +# Creates a temp file indicating a port is in use by imagej +pushd "$ij_tmp" > /dev/null declare -i count=1 portopen='false' lockFileCreated='false' declare -a locklist=(`ls | grep '[0-9][0-9]-.*'`) -[[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tNew Window = $newwindow" >> "$ij_log" 2> /dev/null -[[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tPort = $port" >> "$ij_log" 2> /dev/null -[[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tlocklist: \n ${locklist[*]}" >> "$ij_log" 2> /dev/null if (( $verbosity > 0 )) ; then echo -e "locklist: \n ${locklist[*]}" ; fi -# PORT SPECIFIED BY USER +# port specified by user if (( $port > 0 )) ; then # look for a lock on the port specified for lockname in ${locklist[*]} ; do @@ -401,7 +327,7 @@ if (( $verbosity > 0 )) ; then echo "Using socket lock: $lockname" ; fi count=$port break - elif [[ "$lockname" == ${prefix}-* ]] ; then + elif ("$lockname" =~ ${prefix}-* ) ; then echo "Port $port is in use by some other user or a different host" 1>&2 if (( $verbosity > 0 )) ; then echo "Port lock: $lockname" ; fi exit 1 @@ -410,7 +336,7 @@ # specified port not in use count=$port -# IF EXISTING WINDOW IS REQUESTED, LOOK FOR LISTENING PORT +# If existing window is requested, look for listening port elif [[ "$newwindow" == 'false' && ${#locklist} != 0 ]] ; then # look for a lock on the current display for this user for lockname in ${locklist[*]} ; do @@ -425,7 +351,7 @@ done fi -# IF A NEW PORT IS TO BE USED +# if a new port is to be used if [[ "$portopen" == 'false' ]] ; then # new window requested or no matching port found # if port is not specified, look for first free port @@ -450,14 +376,12 @@ done fi fi - # CREATING A NEW PORT LOCK + # creating a new port lock prefix=`printf '%02u' $count` lockname=${prefix}-${user}-${host}-${display} - - [[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tCreating lock\t$lockname" >> "$ij_log" 2> /dev/null if (( $verbosity > 0 )) ; then echo -n "creating lock $lockname ... " ; fi touch $lockname - trap '\rm -f ${ij_tmp}/$lockname >/dev/null ; echo -e "$$\t$(date)\tReleasing lock\t$lockname" >> "$ij_log" 2> /dev/null' EXIT TERM KILL + trap '\rm -f ${ij_tmp}/$lockname >/dev/null ; exit 1' EXIT TERM # Quitting ImageJ sends EXIT, as does a kill/kill -9 # CTRL+C in terminal sends INT + EXIT # System shutdown sends TERM (+EXIT??) @@ -465,25 +389,31 @@ if (( $verbosity > 0 )) ; then echo 'done' ; fi lockFileCreated='true' - if [[ -z "$macrocmd" ]] ; then - echo 'Open other images in this ImageJ panel as follows:' - echo " imagej -p $count <image1> [<image2> ... <imageN>]" - fi - [[ -n "$ij_log" ]] && echo -e "$$\t$(date)\tSocket lock:\t$lockname" >> "$ij_log" 2> /dev/null + echo 'Open other images in this ImageJ panel as follows:' + echo " imagej -p $count <image1> [<image2> ... <imageN>]" if (( $verbosity > 0 )) ; then echo "Socket lock: $lockname" ; fi echo fi +# Report number of port locks - more than 50 may indicate error in this script +if [[ $count -gt 50 && $port == 0 && "$ijadmin" != '' ]] ; then +mail -s "ImageJ ports on $host" $ijadmin << EOF +Port locks on $host reached $count +EOF +fi + ##################### FINALLY RUN IMAGEJ ##################### -#popd > /dev/null +popd > /dev/null +jni=-Djava.library.path=$(cat /usr/share/imagej/jni/* | tr '\n' ':') + if [ "$JAVA_HOME" ] ; then if (( $verbosity > 0 )) ; then echo ${modules} - echo $JAVA_HOME/bin/java ${java_arch} -mx${mem}m ${modules} ij.ImageJ -ijpath ${ij_user_path} -port${count} ${images} ${macrocmd} ${macroargs} + echo $JAVA_HOME/bin/java ${arch} -mx${mem}m ${jni} ${modules} ij.ImageJ -ijpath ${ij_user_path} -port${count} ${images} ${macrocmd} ${macroargs} else - eval $JAVA_HOME/bin/java ${java_arch} -mx${mem}m ${modules} ij.ImageJ -ijpath ${ij_user_path} -port${count} ${images} ${macrocmd} ${macroargs} + eval $JAVA_HOME/bin/java ${arch} -mx${mem}m ${jni} ${modules} ij.ImageJ -ijpath ${ij_user_path} -port${count} ${images} ${macrocmd} ${macroargs} fi else echo "No JVM found to run ImageJ" _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/mailman/listinfo/debian-med-commit
