Bug in `RPATH`/`RUNPATH` specification in `CMakeLists.txt`

It seems to me like there is a bug in CMakeLists.txt with respect to the correct RPATH setting.

Note: While this issue was detected and verified on Linux, it is likely it pertains also to macOS.

In

the CMAKE_INSTALL_RPATH is set to ${LIBINSTALL}. However, the LIBINSTALL variable is never set, which leaves all library products with an empty RUNPATH, as verified, e.g., by running

readelf -d path/to/install/prefix/lib/libOPENFHEpke.so | grep RUNPATH

and receiving an empty string.

This setting causes problems for applications that explicitly link only to libOPENFHEpke.so but not to libOPENFHEbinfhe.so and/or libOPENFHEcore.so, since libOPENFHEbinfhe.so is a dependency of libOPENFHEpke.so, and libOPENFHEcore.so is a dependency of both libOPENFHEbinfhe.so and libOPENFHEbinfhe.so:

$> readelf -d libOPENFHEbinfhe.so | grep NEEDED | grep OPENFHE
 0x0000000000000001 (NEEDED)             Shared library: [libOPENFHEcore.so.1]
$> readelf -d libOPENFHEpke.so | grep NEEDED | grep OPENFHE
 0x0000000000000001 (NEEDED)             Shared library: [libOPENFHEbinfhe.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libOPENFHEcore.so.1]

Since the RUNPATH is not transitive, it means that a user application linking only to libOPENFHEpke.so will get load errors such as libOPENFHEbinfhe.so.1: cannot open shared object file: No such file or directory. The reason is that libOPENFHEpke.so needs libOPENFHEbinfhe.so.1, but cannot find it, since its RUNPATH is not set.

I have confirmed that adding

set(LIBINSTALL "${CMAKE_INSTALL_PREFIX}/lib")

before the line set(CMAKE_INSTALL_RPATH "${LIBINSTALL}") in CMakeLists.txt would fix this problem, as confirmed by the existence of the RUNPATH entry in the relevant libraries, e.g.,

$> readelf -d ../install/lib/libOPENFHEpke.so | grep RUNPATH
 0x000000000000001d (RUNPATH)            Library runpath: [/path/to/openfhe/install/prefix/lib]

If the solution approach is confirmed by the core developers, I’d be happy to create a PR to fix this.

cc @Arseniy

For the time being, as a workaround you can amend the CMake command for OpenFHE without having to edit CMakeLists.txt directly. After cloning openfhe-development, create a build subdirectory, enter it, and call

cmake .. \
  -DCMAKE_INSTALL_PREFIX=/path/to/install/prefix \
  -DLIBINSTALL=/path/to/install/prefix/lib

CMAKE_INSTALL_RPATH is not set correctly · Issue #670 · openfheorg/openfhe-development · GitHub was created to address this issue