diff --git a/bin/tools/foamCreateModuleInclude b/bin/tools/foamCreateModuleInclude new file mode 100755 index 0000000000..83877b495a --- /dev/null +++ b/bin/tools/foamCreateModuleInclude @@ -0,0 +1,364 @@ +#!/bin/sh +#------------------------------------------------------------------------------ +# ========= | +# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox +# \\ / O peration | +# \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. +# \\/ M anipulation | Copyright (C) 2016-2017 CINECA +#------------------------------------------------------------------------------ +# License +# This file is part of OpenFOAM. +# +# OpenFOAM is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# OpenFOAM is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenFOAM. If not, see . +# +# Script +# foamCreateModuleInclude +# +# Description +# Script to create module settings. +# This is still incomplete, but can be a useful basis when using a module +# system. +#------------------------------------------------------------------------------ +usage() { + exec 1>&2 + while [ "$#" -ge 1 ]; do echo "$1"; shift; done + cat<&2 + echo + echo "Error encountered:" + while [ "$#" -ge 1 ]; do echo " $1"; shift; done + echo + echo "See '${0##*/} -help' for usage" + echo + exit 1 +} + +#------------------------------------------------------------------------------ + +unset optBackend optDebug preload projectDir +unset moduleOutput moduleTmpDir + +# Parse some options +while [ "$#" -gt 0 ] +do + case "$1" in + '') + # Ignore empty args + ;; + -h | -help) + usage + ;; + -debug) + optDebug=true + ;; + -preload=*) + preload="$preload${preload:+ }${1#*=}" + ;; + --recursive-backend--) + optBackend=true + ;; + --output=*) + moduleOutput="${1#*=}" + ;; + --tmpdir=*) + moduleTmpDir="${1#*=}" + ;; + -*) + die "unknown option: $1" + ;; + *) + break + ;; + esac + shift +done + +[ "$#" -eq 1 ] || die "missing projectDir, or too many arguments" +projectDir="${1%/}" + +#------------------------------------------------------------------------------ + +# Filter accepts system paths only +syspath() { + local path + + set -- $(echo "${1}" | tr ':' '\n' ) + for i in $@ + do + case $i in + /bin | /usr/bin | /usr/lib*) + path="${path}${path:+:}$i";; + esac + done + echo "$path" +} + + +# Frontend: do all basic sanity checks in the front-end only +if [ -z "$optBackend" ] +then + # Check that it appears to be an OpenFOAM installation + [ -d "$projectDir" -a -f "$projectDir/etc/bashrc" ] || \ + die "Incorrect projectDir? $projectDir" + + # Check preloads + for file in $preloads + do + [ -f "$file" ] || echo "No such file to preload: $file" 1>&2 + done + + # Call itself with clean environment. + # Tag the start/end of the original PATH, LD_LIBRARY_PATH + exec env -i \ + HOME=$HOME \ + USER=$USER \ + PATH=":MOD_PREPEND:$(syspath $PATH):MOD_APPEND:" \ + LD_LIBRARY_PATH=":MOD_PREPEND:$(syspath $LD_LIBRARY_PATH):MOD_APPEND:" \ + $0 \ + --recursive-backend-- \ + "${optDebug:+-debug}" \ + "${output:+-output=$moduleOutput}" \ + "${preloads:+-preload=$preloads}" \ + "${moduleTmpDir:+-tmpdir=$moduleTmpDir}" \ + $projectDir + + exitCode=$? # exec failed? + + echo "exec somehow failed?" 1>&2 + exit $exitCode +fi + +#------------------------------------------------------------------------------ +# Backend + +: ${moduleOutput:=ModuleInclude.tcl} +: ${moduleTmpDir:=${TMPDIR:-/tmp}} + +# Preload any/all modules +for file in $preloads +do + [ -f "$file" ] && . "$file" '' +done + +# Temporary files +tmpFiles="$moduleTmpDir/modules-$USER.$$" +if [ -n "$optDebug" ] +then + echo "Preserving intermediate files: $tmpFiles.*" 1>&2 +else + trap 'rm -f $tmpFiles.* 2>/dev/null; exit 0' EXIT TERM INT +fi + + +# Snapshot of aliases - sorted +printAlias() +{ + alias | sort -f +} + + +# Snapshot of environment - without functions +# Sorted as non-OpenFOAM, WM_*, FOAM_* +printEnv() +{ + # Non FOAM_*, WM_* settings + echo "# non-OpenFOAM" + env | sed -n -e '\@^FOAM_@d' -e '\@^WM_@d' -e '\@^[^ {}]@p' \ + | sort -f + + # WM_* settings + echo "# OpenFOAM" + env | sed -n -e '\@^WM_@p' \ + | sort -f + + # FOAM_* settings + echo "# OpenFOAM" + env | sed -n -e '\@^FOAM_@p' \ + | sort -f +} + +# +# Initial snapshot of the environment (without functions) +# +printEnv > $tmpFiles.env.pre.log +printAlias > $tmpFiles.alias.pre.log + +# OpenFOAM settings +. $projectDir/etc/bashrc '' + +echo "Using openfoam: $WM_PROJECT_DIR" 1>&2 +echo "==> $moduleOutput" 1>&2 + +# Remove some cruft +unset FOAM_JOB_DIR FOAM_RUN FOAM_SETTINGS FOAM_INST_DIR +unset WM_PROJECT_USER_DIR WM_THIRD_PARTY_DIR +unset SCOTCH_VERSION + + +# Also remove user directories as being unreliable + +foamOldDirs="$CEI_HOME $BOOST_ARCH_PATH $CGAL_ARCH_PATH $FFTW_ARCH_PATH $MPI_ARCH_PATH $SCOTCH_ARCH_PATH \ +$FOAM_SITE_APPBIN $FOAM_SITE_LIBBIN $WM_PROJECT_SITE \ +$FOAM_USER_APPBIN $FOAM_USER_LIBBIN" +foamClean=$WM_PROJECT_DIR/bin/foamCleanPath + +if [ -x "$foamClean" ] +then + cleaned=$($foamClean "$PATH" "$foamOldDirs") && PATH="$cleaned" + cleaned=$($foamClean "$LD_LIBRARY_PATH" "$foamOldDirs") \ + && LD_LIBRARY_PATH="$cleaned" + + # May not have/need any third party at all + if [ -n "$FOAM_EXT_LIBBIN" -a ! -d "$FOAM_EXT_LIBBIN" ] + then + cleaned=$($foamClean "$LD_LIBRARY_PATH" "$FOAM_EXT_LIBBIN") \ + && LD_LIBRARY_PATH="$cleaned" + + unset FOAM_EXT_LIBBIN + fi +fi +unset CEI_HOME +unset ENSIGHT9_INPUT ENSIGHT9_READER +unset ENSIGHT10_INPUT ENSIGHT10_READER + +# Always consider site to be bogus. If needed, should be done elsewhere. +unset FOAM_SITE_APPBIN FOAM_SITE_LIBBIN WM_PROJECT_SITE + +# Remove non-essential aliases +unalias wmDP 2>/dev/null +unalias wmInt32 2>/dev/null +unalias wmInt64 2>/dev/null +unalias wmSP 2>/dev/null +unalias wmSchedOff 2>/dev/null +unalias wmSchedOn 2>/dev/null +unalias wmSet 2>/dev/null +unalias wmUnset 2>/dev/null +unalias app 2>/dev/null +unalias foamSite 2>/dev/null +unalias lib 2>/dev/null +unalias run 2>/dev/null +unalias sol 2>/dev/null +unalias src 2>/dev/null +unalias tut 2>/dev/null +unalias util 2>/dev/null + +#------------------------------------------------ + +# Generalize environment. +# This needs rethinking since it largely duplicates logic from the etc/config.sh/settings +rewriteEnv() +{ + sed \ + -e 's@^\(FOAM_USER_APPBIN=\).*@\1$env(HOME)/OpenFOAM/$env(USER)-$env(WM_PROJECT_VERSION)/platforms/$env(WM_OPTIONS)/bin@' \ + -e 's@^\(FOAM_USER_LIBBIN=\).*@\1$env(HOME)/OpenFOAM/$env(USER)-$env(WM_PROJECT_VERSION)/platforms/$env(WM_OPTIONS)/lib@' \ + ; +} + +# +# Updated snapshot of the environment (without functions) +# +printEnv | rewriteEnv > $tmpFiles.env.post.log +printAlias > $tmpFiles.alias.post.log + + +# Create a diff of the environment and aliases +diff $tmpFiles.env.pre.log $tmpFiles.env.post.log > $tmpFiles.env.diff.log +diff $tmpFiles.alias.pre.log $tmpFiles.alias.post.log > $tmpFiles.alias.diff.log + +echo "# -------------------" > $moduleOutput + +# -------------------------------------------------- +# Environment other than PATH, LD_LIBRARY_PATH +echo "# Environment" >> $moduleOutput +grep '> ' $tmpFiles.env.diff.log | \ +sed \ + -e '/^> *PATH=/d' \ + -e '/^> *LD_LIBRARY_PATH=/d' \ + -e 's/^>/setenv /' \ + -e 's/=/ "/' -e 's/$/\"/' >> $moduleOutput + + +# -------------------------------------------------- +# Changes in PATH - without junk and system directories +echo "# PATH" >> $moduleOutput + +sed -ne 's/^< *PATH=//p' $tmpFiles.env.diff.log | tr ':' '\n' > $tmpFiles.path.pre.log +sed -ne 's/^> *PATH=//p' $tmpFiles.env.diff.log | tr ':' '\n' > $tmpFiles.path.post.log + +grep -vxFf $tmpFiles.path.pre.log $tmpFiles.path.post.log | \ +sed \ + -e '\@^/bin$@d' \ + -e '\@^/usr/bin$@d' \ + -e '\@^/usr/local/bin$@d' \ + -e '\@^[.]$@d' \ + -e '\@^$@d' \ + > $tmpFiles.path.diff.log + +sed \ + -e 's/^/append-path PATH "/' \ + -e 's/$/\"/' \ + $tmpFiles.path.diff.log >> $moduleOutput +# -------------------------------------------------- + +# -------------------------------------------------- +# Changes in LD_LIBRARY_PATH - without junk and system directories +echo "# LD_LIBRARY_PATH" >> $moduleOutput + +sed -ne 's/^< *LD_LIBRARY_PATH=//p' $tmpFiles.env.diff.log | tr ':' '\n' > $tmpFiles.ldpath.pre.log +sed -ne 's/^> *LD_LIBRARY_PATH=//p' $tmpFiles.env.diff.log | tr ':' '\n' > $tmpFiles.ldpath.post.log + +grep -vxFf $tmpFiles.ldpath.pre.log $tmpFiles.ldpath.post.log | \ +sed \ + -e '\@^/lib.*$@d' \ + -e '\@^/usr/lib.*$@d' \ + -e '\@^/usr/local/lib.*$@d' \ + -e '\@^[.]$@d' \ + -e '\@^$@d' \ + > $tmpFiles.ldpath.diff.log + +sed \ + -e 's/^/append-path LD_LIBRARY_PATH "/' \ + -e 's/$/\"/' \ + $tmpFiles.ldpath.diff.log >> $moduleOutput + + +# ------------------- +# aliases +# Some diff give "> alias". Others give ">", needed extended regular expressions '-r' + +echo "# aliases" >> $moduleOutput +cat $tmpFiles.alias.diff.log | \ + sed -r -n -e 's/^> (alias)?/set-alias /p' | \ + sed -e "s/='/ \"/" -e "s/'/\"/g" >> $moduleOutput + +echo "# -------------------" >> $moduleOutput + +# -----------------------------------------------------------------------------