Skip to content

rpath compilation rules for Darwin

Functionality to add/problem to solve

Work-around for empty DYLD_LIBARY_PATH variable (which is cleared by System Integrity Protection).

Target audience

OpenFOAM users on macOS operating system.

Proposal

Correct OpenFOAM execution depends on the right contents of the DYLD_LIBRARY_PATH environment variable. On Darwin System Integrity Protection clears this variable for protected binaries. For the reason Allrun scripts become useless.

Previous solution for the problem was to restore values of the DYLD_LIBRARY_PATH variable from backup environment variable FOAM_LD_LIBRARY_PATH in the beginning of RunFunctions file. The approach was limited to the scripts, which use RunFunctions file and execute utulities and solvers with shell functions. I.e. it only partly solved the problem.

In the new approach -rpath flag is used during link phase to compile-in list of paths to search for the dynamic libraries. The following list is used:

  • $FOAM_USER_LIBBIN (usually OpenFOAM is compiled manually on Darwin, so I think this location is known during compilation and relevant to user).
  • $FOAM_SITE_LIBBIN
  • $FOAM_LIBBIN
  • $FOAM_LIBBIN/$FOAM_MPI
  • $FOAM_LIBBIN/dymmy

The first two folders are used as absolute paths. The last three entries are substituted, using dynamic linker variables: @loader_path and @executable_path. @loaded_path is used in dynamic libraries and it usually points to $FOAM_LIBBIN. @executable_path is used in executables and there $FOAM_LIBBIN is encoded as @executable_path/../lib (so it assumes, that bin and lib folders are at the same directory tree level).

This approach still allows us to use DYLD_LIBRARY_PATH environment variable to override dynamic libraries search paths, while maintaining OpenFOAM in functional state if the variable is empty.

We still need to maintain backup variable FOAM_LD_LIBRARY_PATH as it is used by dlOpen function as a fallback.

What does success look like, and how can we measure that?

OpenFOAM solvers and utilities are correctly executed in shell scripts (ex. Allrun, foamJob) without workarounds with restoration of DYLD_LIBRARY_PATH from backup variable.

Links / references

  1. The Library Search Process section in https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryUsageGuidelines.html#//apple_ref/doc/uid/TP40001928-SW10
  2. Run-path dependent libraries section https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/RunpathDependentLibraries.html

Functionality is implemented in attached 01-feature-darwin-rpath-wmake-rules.patch.