CMake: do not set RPATH when installing to a system directory
authorPeter Wu <peter@lekensteyn.nl>
Sat, 19 Jan 2019 00:59:29 +0000 (01:59 +0100)
committerPeter Wu <peter@lekensteyn.nl>
Sun, 20 Jan 2019 21:59:42 +0000 (21:59 +0000)
When built with -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=lib
(as is done by many Linux distributions), do not set an unnecessary
RPATH. This was the case before v2.9.0rc0-2727-g697623411c.

Relocatable builds will still be possible with the default options as
/usr/local/lib is typically not considered a system library path.

Change-Id: Ic6ff1760183c20d3f9f9fb787604e888e116534e
Reviewed-on: https://code.wireshark.org/review/31602
Petri-Dish: Peter Wu <peter@lekensteyn.nl>
Tested-by: Petri Dish Buildbot
Reviewed-by: João Valverde <j@v6e.pt>
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
CMakeLists.txt
extcap/CMakeLists.txt

index e36f0cb93b36033dd0553f7e81cfe7c9918d8d1d..5e143c205e1d698cf983fdb87c53c8b8d358d901 100644 (file)
@@ -180,30 +180,29 @@ include(GNUInstallDirs)
 
 # Make sure our executables can can load our libraries if we install into
 # a non-default directory on Unix-like systems other than macOS.
-# https://cmake.org/Wiki/CMake_RPATH_handling
+# https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling
 if(NOT CMAKE_INSTALL_RPATH AND NOT (WIN32 OR APPLE))
-       # Some systems may have limited or non-existent support for $ORIGIN.
-       # https://www.lekensteyn.nl/rpath.html
-       set(_enable_rpath_origin 0)
-       if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|SunOS|FreeBSD)$")
-               set(_enable_rpath_origin 1)
-       endif()
-       set(ENABLE_RPATH_ORIGIN ${_enable_rpath_origin} CACHE BOOL "Use \$ORIGIN with RPATH")
-       mark_as_advanced(ENABLE_RPATH_ORIGIN)
-
-       if(ENABLE_RPATH_ORIGIN)
-               # Set an install RPATH relative to the location of the binary, to
-               # provide a fully relocatable package.
-               set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}")
-               # Add the automatically determined parts of the RPATH
-               # which point to directories outside the build tree to the install RPATH.
-               set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
-       else()
-               # Add an absolute RPATH if it is not already included in the
-               # default search list.
-               list(FIND CMAKE_C_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_FULL_LIBDIR}" IS_SYSTEM_DIR)
-               if(IS_SYSTEM_DIR STREQUAL "-1")
+       # Try to set a RPATH for installed binaries if the library directory is
+       # not already included in the default search list.
+       list(FIND CMAKE_C_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_FULL_LIBDIR}" IS_SYSTEM_DIR)
+       if(IS_SYSTEM_DIR EQUAL -1)
+               # Some systems support $ORIGIN in RPATH to enable relocatable
+               # binaries. In other cases, only absolute paths can be used.
+               # https://www.lekensteyn.nl/rpath.html
+               if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|SunOS|FreeBSD)$")
+                       set(ENABLE_RPATH_ORIGIN TRUE CACHE BOOL
+                               "Use $ORIGIN with INSTALL_RPATH")
+                       mark_as_advanced(ENABLE_RPATH_ORIGIN)
+               else()
+                       set(ENABLE_RPATH_ORIGIN FALSE)
+               endif()
+               if(ENABLE_RPATH_ORIGIN)
+                       set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}")
+               else()
                        set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}")
+               endif()
+               # Include non-standard external libraries by default in RPATH.
+               if(NOT DEFINED CMAKE_INSTALL_RPATH_USE_LINK_PATH)
                        set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
                endif()
        endif()
index 384e62cb2dd3dee1394d9b6b10da0e6585da7931..58547ff031757dc905eb10d43cd1b605ecd3c48f 100644 (file)
@@ -46,9 +46,10 @@ macro(set_extcap_executable_properties _executable)
                        LINK_FLAGS "${WS_LINK_FLAGS}"
                        RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/run/extcap
                )
-               if(ENABLE_RPATH_ORIGIN)
+               if(CMAKE_INSTALL_RPATH MATCHES "\\$ORIGIN")
+                       # Use relative path from ${EXTCAP_INSTALL_LIBDIR} to ${CMAKE_INSTALL_LIBDIR}
                        set_target_properties(${_executable} PROPERTIES
-                               INSTALL_RPATH "\$ORIGIN/../.."
+                               INSTALL_RPATH "$ORIGIN/../.."
                        )
                endif()
                if(ENABLE_APPLICATION_BUNDLE)