From eb9db68a2b86b33308ca0e82eeb3dd5266045332 Mon Sep 17 00:00:00 2001
From: Martin Hierholzer <martin.hierholzer@desy.de>
Date: Wed, 19 Apr 2023 14:48:44 +0200
Subject: [PATCH] fix(project-template): remove extra rpath from DOOCS imported
 targets

---
 cmake/Modules/FindDOOCS.cmake | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/cmake/Modules/FindDOOCS.cmake b/cmake/Modules/FindDOOCS.cmake
index a6b76c0..944493e 100644
--- a/cmake/Modules/FindDOOCS.cmake
+++ b/cmake/Modules/FindDOOCS.cmake
@@ -38,7 +38,7 @@
 
 SET(DOOCS_FOUND 0)
 
-# if set, include the --no-as-needed linker flag which helps if inner dependencies between libs are not properly 
+# if set, include the --no-as-needed linker flag which helps if inner dependencies between libs are not properly
 # set inside the library binaries
 set(DOOCS_noAsNeededFlag 1)
 
@@ -59,7 +59,7 @@ if (NOT DOOCS_FIND_QUIETLY)
     message("FindDOOCS: Using PKG_CONFIG_PATH=$ENV{PKG_CONFIG_PATH}")
 endif()
 
-# We add the always - required API component 
+# We add the always - required API component
 if (NOT (";${DOOCS_FIND_COMPONENTS};" MATCHES ";api;"))
     list(PREPEND DOOCS_FIND_COMPONENTS "api")
 endif()
@@ -108,8 +108,9 @@ foreach(component ${DOOCS_FIND_COMPONENTS})
                 message(STATUS "FindDOOCS: imported target is ${importedTarget}. Defining alias DOOCS::${component}")
             endif()
             add_library(DOOCS::${component} ALIAS ${importedTarget})
+
             set(DOOCS_LIBRARIES ${DOOCS_LIBRARIES} "DOOCS::${component}")
-            
+
             if (${component} STREQUAL "api")
                 # add Threads lib only if not yet in
                 get_target_property(doocsLinkLibs ${importedTarget} INTERFACE_LINK_LIBRARIES)
@@ -128,7 +129,21 @@ foreach(component ${DOOCS_FIND_COMPONENTS})
                 string(REGEX REPLACE ".*-NOTFOUND" "" doocsLinkLibs "${doocsLinkLibs}")
                 set_target_properties(${importedTarget} PROPERTIES INTERFACE_LINK_LIBRARIES "DOOCS::api;${doocsLinkLibs}")
             endif()
-            
+
+            # strip the RPATH from the INTERFACE_LINK_OPTIONS of the imported target
+            # cmake will handle the RPATH properly itself when using imported targets. Adding the rpath linker flags
+            # explicitly will not only add the directories to the RPATH twice but also destroy the proper ordering,
+            # since the directories from the linker flags will be added first and e.g. the build directory will end up
+            # too late in the list. As a consequence, test executables might use the installed libraries instead of the
+            # library under test from the build directory - even for tests and libraries quite unrelated to DOOCS, as
+            # long as they have a DOOCS library as a (direct or indirect) dependency.
+            get_target_property(MY_LINK_OPTIONS ${importedTarget} INTERFACE_LINK_OPTIONS)
+            string(REGEX REPLACE "-Wl,-rpath,[^;]*" "" MY_LINK_OPTIONS "${MY_LINK_OPTIONS}")
+            string(REGEX REPLACE ";;" ";" MY_LINK_OPTIONS "${MY_LINK_OPTIONS}")
+            string(REGEX REPLACE "^;" "" MY_LINK_OPTIONS "${MY_LINK_OPTIONS}")
+            string(REGEX REPLACE ";$" "" MY_LINK_OPTIONS "${MY_LINK_OPTIONS}")
+            set_target_properties(${importedTarget} PROPERTIES INTERFACE_LINK_OPTIONS "${MY_LINK_OPTIONS}")
+
             # print some info about targets
             get_target_property(doocsIncDirs ${importedTarget} INTERFACE_INCLUDE_DIRECTORIES)
             message(VERBOSE "  include dirs: ${doocsIncDirs}")
@@ -140,7 +155,7 @@ foreach(component ${DOOCS_FIND_COMPONENTS})
             message(VERBOSE "  link libs: ${doocsLinkLibs}")
             get_target_property(doocsLinkDirs ${importedTarget} INTERFACE_LINK_DIRECTORIES)
             message(VERBOSE "  link dirs: ${doocsLinkDirs}")
-       
+
         else()
             message(FATAL_ERROR "DOOCS component ${component} not found!")
         endif()
@@ -176,7 +191,7 @@ macro(DOOCS_appendListToList list arg)
     endforeach()
 endmacro()
 
-# note, pkg_check_modules output variables <prefix>_VERSION and <prefix>_LIBDIR are different, 
+# note, pkg_check_modules output variables <prefix>_VERSION and <prefix>_LIBDIR are different,
 # depending on length of given module list!
 set(DOOCS_DIR "${DOOCS_api_LIBDIR}")
 set(DOOCS_VERSION "${DOOCS_api_VERSION}")
@@ -204,4 +219,4 @@ set(DOOCS_LINK_FLAGS ${DOOCS_LINKER_FLAGS})
 
 # use a macro provided by CMake to check if all the listed arguments are valid and set DOOCS_FOUND accordingly
 include(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(DOOCS REQUIRED_VARS DOOCS_DIR VERSION_VAR DOOCS_VERSION )
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(DOOCS REQUIRED_VARS DOOCS_DIR VERSION_VAR DOOCS_VERSION)
-- 
GitLab