Skip to content

Commit

Permalink
Merge pull request #1074 from plumed/load-library-version
Browse files Browse the repository at this point in the history
  • Loading branch information
GiovanniBussi authored May 13, 2024
2 parents 9a820fa + 0520704 commit 75c2a13
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 16 deletions.
81 changes: 69 additions & 12 deletions scripts/mklib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,32 @@

if [ "$1" = --description ] ; then
echo "compile one or more *.cpp files into a shared library"
echo " you can create and export the variable PLUMED_MKLIB_CFLAGS with some extra compile time flags to be used"
echo " you can create and export the variable PLUMED_MKLIB_LDFLAGS with some extra link time flags (and libraries) to be used"
exit 0
fi

if [ "$1" = --options ] ; then
echo "--description --options"
exit 0
fi
MANUAL='Compile one or more *.cpp files into a shared library.
Usage:
plumed mklib [options] files1.cpp [file2.cpp ...]
Options:
-h, --help
Print this help and exit
-o LIBNAME, --out LIBNAME
Name of the output library. If missing, the name
of the first input file will me used, with its
suffix properly adjusted.
-n No-clobber mode, similar to `mv -n`.
Does not overwrite an existing library.
If the library exists when the command is started,
skip also the compilation phase.
Environment variables:
PLUMED_MKLIB_CFLAGS Extra compile time flags to be used
PLUMED_MKLIB_LDFLAGS Extra link time flags (and libraries) to be used
'

OPTIONS="--description --options -h --help -o --out -n"

if [ $# == 0 ]
then
Expand All @@ -21,17 +38,53 @@ fi

source "$PLUMED_ROOT"/src/config/compile_options.sh

lib="${1%%.cpp}".$soext
prefix=""
lib=""
no_clobber=""
files=() # empty array
for opt
do
prefixopt="$prefix$opt"
prefix=""
case "$prefixopt" in
(-o|--out) prefix="--out=";;
(-h|--help) echo "$MANUAL" ; exit ;;
(--options) echo "$OPTIONS" ; exit ;;
(--out=*) lib="${prefixopt#--out=}";;
(-n) no_clobber=yes;;
(-*)
echo "ERROR: Unknown option $opt. Use --help for help."
exit 1 ;;
(*)
files+=("${prefixopt}");;
esac
done

if [ ${#files[@]} = 0 ] ; then
echo ERROR
echo "pass at least one file"
exit 1
fi

if [ -z "$lib" ]
then
firstfile="${files[0]}"
lib="${firstfile%%.cpp}".$soext
fi

recompile=no
for file
for file in "${files[@]}"
do
if ! test $lib -nt $file ;
then
recompile=yes
fi
done

if test -z "$no_clobber" ; then
recompile=yes
fi

if test $recompile = no ; then
echo "$lib is already up to date"
exit 0
Expand All @@ -53,7 +106,7 @@ tmpdir=$(mktemp -d "plumed_mklib.XXXXXX")

toRemove="${toRemove} $tmpdir"

for file
for file in "${files[@]}"
do

if [[ "$file" != *.cpp ]] ;
Expand Down Expand Up @@ -114,5 +167,9 @@ fi

eval "$link_command" "$PLUMED_MKLIB_LDFLAGS" $objs -o "$tmpdir/$lib"

# || true is necessary with recent coreutils
mv -n "$tmpdir/$lib" $lib || true
if test -n "$no_clobber" ; then
# || true is necessary with recent coreutils
mv -n "$tmpdir/$lib" $lib || true
else
mv "$tmpdir/$lib" $lib
fi
11 changes: 7 additions & 4 deletions src/core/PlumedMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1255,14 +1255,16 @@ void PlumedMain::load(const std::string& fileName) {
extension=libName.substr(n+1);
if(n!=std::string::npos && n<libName.length())
base=libName.substr(0,n);

if(extension=="cpp") {
libName="./"+base+"."+config::getVersionLong()+"."+config::getSoExt();
// full path command, including environment setup
// this will work even if plumed is not in the execution path or if it has been
// installed with a name different from "plumed"
std::string cmd=config::getEnvCommand()+" \""+config::getPlumedRoot()+"\"/scripts/mklib.sh "+libName;
std::string cmd=config::getEnvCommand()+" \""+config::getPlumedRoot()+"\"/scripts/mklib.sh -n -o "+libName+" "+fileName;

if(std::getenv("PLUMED_LOAD_ACTION_DEBUG")) log<<"Executing: "<<cmd;
else log<<"Compiling: "<<libName;
else log<<"Compiling: "<<fileName<<" to "<<libName;

if(comm.Get_size()>0) log<<" (only on master node)";
log<<"\n";
Expand All @@ -1280,9 +1282,10 @@ void PlumedMain::load(const std::string& fileName) {
if(ret!=0) plumed_error() <<"An error happened while executing command "<<cmd<<"\n";
}
comm.Barrier();
base="./"+base;
} else {
libName=base+"."+config::getSoExt();
}
libName=base+"."+config::getSoExt();

// If we have multiple threads (each holding a Plumed object), each of them
// will load the library, but each of them will only see actions registered
// from the owned library
Expand Down

1 comment on commit 75c2a13

@PlumedBot
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found broken examples in automatic/ANGLES.tmp
Found broken examples in automatic/ANN.tmp
Found broken examples in automatic/CAVITY.tmp
Found broken examples in automatic/CLASSICAL_MDS.tmp
Found broken examples in automatic/CLUSTER_DIAMETER.tmp
Found broken examples in automatic/CLUSTER_DISTRIBUTION.tmp
Found broken examples in automatic/CLUSTER_PROPERTIES.tmp
Found broken examples in automatic/CONSTANT.tmp
Found broken examples in automatic/CONTACT_MATRIX.tmp
Found broken examples in automatic/CONTACT_MATRIX_PROPER.tmp
Found broken examples in automatic/COORDINATIONNUMBER.tmp
Found broken examples in automatic/DFSCLUSTERING.tmp
Found broken examples in automatic/DISTANCE_FROM_CONTOUR.tmp
Found broken examples in automatic/EDS.tmp
Found broken examples in automatic/EMMI.tmp
Found broken examples in automatic/ENVIRONMENTSIMILARITY.tmp
Found broken examples in automatic/FIND_CONTOUR.tmp
Found broken examples in automatic/FIND_CONTOUR_SURFACE.tmp
Found broken examples in automatic/FIND_SPHERICAL_CONTOUR.tmp
Found broken examples in automatic/FOURIER_TRANSFORM.tmp
Found broken examples in automatic/FUNCPATHGENERAL.tmp
Found broken examples in automatic/FUNCPATHMSD.tmp
Found broken examples in automatic/FUNNEL.tmp
Found broken examples in automatic/FUNNEL_PS.tmp
Found broken examples in automatic/GHBFIX.tmp
Found broken examples in automatic/GPROPERTYMAP.tmp
Found broken examples in automatic/HBOND_MATRIX.tmp
Found broken examples in automatic/INCLUDE.tmp
Found broken examples in automatic/INCYLINDER.tmp
Found broken examples in automatic/INENVELOPE.tmp
Found broken examples in automatic/INTERPOLATE_GRID.tmp
Found broken examples in automatic/LOCAL_AVERAGE.tmp
Found broken examples in automatic/MAZE_OPTIMIZER_BIAS.tmp
Found broken examples in automatic/MAZE_RANDOM_ACCELERATION_MD.tmp
Found broken examples in automatic/MAZE_SIMULATED_ANNEALING.tmp
Found broken examples in automatic/MAZE_STEERED_MD.tmp
Found broken examples in automatic/MULTICOLVARDENS.tmp
Found broken examples in automatic/OUTPUT_CLUSTER.tmp
Found broken examples in automatic/PAMM.tmp
Found broken examples in automatic/PCA.tmp
Found broken examples in automatic/PCAVARS.tmp
Found broken examples in automatic/PIV.tmp
Found broken examples in automatic/PLUMED.tmp
Found broken examples in automatic/PYCVINTERFACE.tmp
Found broken examples in automatic/PYTHONFUNCTION.tmp
Found broken examples in automatic/Q3.tmp
Found broken examples in automatic/Q4.tmp
Found broken examples in automatic/Q6.tmp
Found broken examples in automatic/QUATERNION.tmp
Found broken examples in automatic/SIZESHAPE_POSITION_LINEAR_PROJ.tmp
Found broken examples in automatic/SIZESHAPE_POSITION_MAHA_DIST.tmp
Found broken examples in automatic/SPRINT.tmp
Found broken examples in automatic/TETRAHEDRALPORE.tmp
Found broken examples in automatic/TORSIONS.tmp
Found broken examples in automatic/WHAM_WEIGHTS.tmp
Found broken examples in AnalysisPP.md
Found broken examples in CollectiveVariablesPP.md
Found broken examples in MiscelaneousPP.md

Please sign in to comment.