diff --git a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C index f24962b01dabf2fd624df22793a831f7856ab799..d1bda27c3195ed18bb91a2bd2279a5d4f02dc103 100644 --- a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C +++ b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C @@ -2307,7 +2307,9 @@ int main(int argc, char *argv[]) // ~~~~~~~~~~~~~~~~ // (replacement for setRootCase that does not abort) - Foam::argList args(argc, argv); + argList args(argc, argv); + #include "foamDlOpenLibs.H" + const bool reconstruct = args.found("reconstruct"); const bool writeCellDist = args.found("cellDist"); const bool dryrun = args.found("dry-run"); diff --git a/applications/utilities/preProcessing/mapFields/mapFields.C b/applications/utilities/preProcessing/mapFields/mapFields.C index 73914dd86d4f26dd681cb94bea01cf80d260d643..9e7872165d1e69e3b0ba08195d1897f27c53fcd0 100644 --- a/applications/utilities/preProcessing/mapFields/mapFields.C +++ b/applications/utilities/preProcessing/mapFields/mapFields.C @@ -276,11 +276,11 @@ int main(int argc, char *argv[]) argList args(argc, argv); - if (!args.check()) { FatalError.exit(); } + #include "foamDlOpenLibs.H" fileName rootDirTarget(args.rootPath()); fileName caseDirTarget(args.globalCaseName()); diff --git a/applications/utilities/preProcessing/mapFieldsPar/mapFieldsPar.C b/applications/utilities/preProcessing/mapFieldsPar/mapFieldsPar.C index 4b580f6a878ddc639e1c97ae57870fd2bcd86b9c..13494ace9e23efc6bb909bf34b6dd2689ab4b5ad 100644 --- a/applications/utilities/preProcessing/mapFieldsPar/mapFieldsPar.C +++ b/applications/utilities/preProcessing/mapFieldsPar/mapFieldsPar.C @@ -208,6 +208,7 @@ int main(int argc, char *argv[]) ); argList args(argc, argv); + #include "foamDlOpenLibs.H" fileName rootDirTarget(args.rootPath()); fileName caseDirTarget(args.globalCaseName()); diff --git a/src/OpenFOAM/include/foamDlOpenLibs.H b/src/OpenFOAM/include/foamDlOpenLibs.H new file mode 100644 index 0000000000000000000000000000000000000000..27ee219943d9adcbf568f62f2fce0a111d87526c --- /dev/null +++ b/src/OpenFOAM/include/foamDlOpenLibs.H @@ -0,0 +1,12 @@ +// Force dlOpen of FOAM_DLOPEN_LIBS, +// which is a comma-separated list of quoted library names +// (eg, "finiteVolume","fvOptions","meshTools") +// +// Principally for Windows applications where library loading may otherwise +// be incomplete. + +#ifdef FOAM_DLOPEN_LIBS + +Foam::dlOpen({ FOAM_DLOPEN_LIBS }, false); // Silent on errors + +#endif diff --git a/src/OpenFOAM/include/setRootCase.H b/src/OpenFOAM/include/setRootCase.H index 6205697d9549c6a164b86d20560c72e82d53c079..e90a7410c690c65f9f58dd1126ae0cb5fea5d802 100644 --- a/src/OpenFOAM/include/setRootCase.H +++ b/src/OpenFOAM/include/setRootCase.H @@ -15,3 +15,6 @@ if (!args.checkRootCase()) // { // Foam::FatalError.exit(); // } + +// Force dlOpen of FOAM_DLOPEN_LIBS (principally for Windows applications) +#include "foamDlOpenLibs.H" diff --git a/wmake/makefiles/files b/wmake/makefiles/files index 52a0b2db5658a3ce5d5b994baf0a238e8b989e15..fb825976c9343a934ff95f8672bc1d065f4bfbe9 100644 --- a/wmake/makefiles/files +++ b/wmake/makefiles/files @@ -35,6 +35,12 @@ SFILES = $(OBJECTS_DIR)/sourceFiles sinclude $(OPTIONS) +#------------------------------------------------------------------------------ +# Directory containing the wmake scripts +#------------------------------------------------------------------------------ + +WM_SCRIPTS = $(WM_DIR)/scripts + #------------------------------------------------------------------------------ # Declare dependency of all make system files on FILES @@ -45,7 +51,9 @@ all : $(OPTIONS) $(SFILES) $(VARS) $(OPTIONS) : $(MAKE_DIR)/options @$(CPP) $(GFLAGS) $(MAKE_DIR)/options | sed -e 's@ *@ @g' > $(OPTIONS) - +ifeq ("$(WM_OSTYPE)","MSwindows") + @$(WM_SCRIPTS)/wmakeWindowsDlOpenLibs $(OPTIONS) >> $(OPTIONS) +endif $(SFILES): $(MAKE_DIR)/files @$(CPP) $(GFLAGS) $(MAKE_DIR)/files | sed -e 's@ *@ @g' > $(FILES) diff --git a/wmake/scripts/wmakeWindowsDlOpenLibs b/wmake/scripts/wmakeWindowsDlOpenLibs new file mode 100755 index 0000000000000000000000000000000000000000..44074a80bafe00d9c8ff362eb2f81beab3dc169c --- /dev/null +++ b/wmake/scripts/wmakeWindowsDlOpenLibs @@ -0,0 +1,101 @@ +#!/bin/sh +#------------------------------------------------------------------------------ +# ========= | +# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox +# \\ / O peration | +# \\ / A nd | Copyright (C) 2019 OpenCFD Ltd. +# \\/ M anipulation | +#------------------------------------------------------------------------------- +# | Copyright (C) 2011-2017 blueCAPE Lda +#------------------------------------------------------------------------------ +# 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 <http://www.gnu.org/licenses/>. +# +# Script +# wmakeWindowsDlOpenLibs +# +# Usage +# wmakeWindowsDlOpenLibs <build/applications/.../options> +# +# Description +# Extract library dependencies from the EXE_LIBS entry for Windows +# applications and emit as FOAM_DLOPEN_LIBS for use with setRootCase.H +# Forcibly dlOpen'ing these libraries ensures that they are truly loaded +# for the windows application binary. +# +# An alternative means is to define external entry points into particular +# libraries and linking with '-u symbol', which would possibly have a lower +# overhead but is more code-intrusive and somewhat ad hoc. +# +#------------------------------------------------------------------------------ +optionsFile="$1" + +[ "$#" -gt 0 ] || exit 1 +[ -f "$optionsFile" ] || exit 2 +[ -r "$optionsFile" ] || exit 2 + +# Representative exeName from the build path (for messages only) +# Eg, build/.../basic/laplacianFoam/options -> laplacianFoam + +exeName="${optionsFile%/options}" # Strip trailing '/options' +exeName="${exeName##*/}" # Strip leading path + +# Use only OpenFOAM-related libraries that we will can actually find +hasLib() +{ + libFile="lib${1}.dll" # NB: Windows only (.dll) + + [ -e "$FOAM_LIBBIN/$libFile" ] || \ + [ -e "$FOAM_USER_LIBBIN/$libFile" ] || \ + [ -e "$FOAM_LIBBIN/$FOAM_MPI/$libFile" ] +} + + +# After the cpp stage, the EXE_LIBS (if they exist) will be on a single line +# Extract EXE_LIBS = -labc ..., ignoring -L and .o entries +# +# The libNames output comprises comma-separated quoted strings +# "lib1","lib2","libN" +# these are suitable for C-code or a std::initializer_list<fileName> etc. + +# The $() sub-shell is unquoted to ensure we get whitespace splitting +# and read individual words, not lines. +unset libNames +for lib in $(sed -ne 's@^.*EXE\_LIBS.*=[ ]*@@p' "$optionsFile") +do + case "$lib" in + (*.o | *')'*) + ;; + + (-l[0-9A-Za-z]*) + lib="${lib#-l}" + hasLib "$lib" && libNames="$libNames${libNames:+,}\"$lib\"" + ;; + esac +done + +## Debugging: echo "$exeName: libNames=$libNames" 1>&2 + +# Emit define for using with Foam::dlOpen() +if [ -n "$libNames" ] +then + echo "Adding dlOpen(dll) list for $exeName" 1>&2 + echo "EXE_INC += -DFOAM_DLOPEN_LIBS='$libNames'" +fi + +exit 0 # clean exit + +#------------------------------------------------------------------------------