Fix rpath for private libraries on Linux
authorBenjamin Drung <benjamin.drung@canonical.com>
Thu, 22 Sep 2022 17:52:43 +0000 (19:52 +0200)
committerDennis Braun <snd@debian.org>
Sun, 28 Apr 2024 18:57:45 +0000 (20:57 +0200)
Installing audacity on Linux will produce private libraries that have
`RUNPATH` set to the build directory instead of the installation
directory.

The root cause is that the library directory is copied to the
installation directory without touching the libraries. The cmake wiki
says in RPATH handling caveats [1]: "Since install-side RPATH tweaking
is an operation that is done by target-specific installation handling,
any target that should have its install RPATH changed (e.g. to
`CMAKE_INSTALL_RPATH`) needs to end up in the installation via an
`install(TARGETS ...)` signature and not via directory-based copying."

So replace `install(DIRECTORY ...)` by individual `install(TARGETS ...)`
for the libraries and modules. Then cmake will replace the `RUNPATH` to
`$ORIGIN/../lib/audacity`, which is still incorrect. Therefore set
`INSTALL_RPATH` explicitly.

Fixes: https://github.com/audacity/audacity/issues/3289
Forwarded: https://github.com/audacity/audacity/pull/3671
[1] https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling#caveats
Signed-off-by: Benjamin Drung <benjamin.drung@canonical.com>
Gbp-Pq: Name Fix-rpath-for-private-libraries-on-Linux.patch

CMakeLists.txt
cmake-proxies/cmake-modules/AudacityFunctions.cmake
modules/mod-script-pipe/CMakeLists.txt
src/CMakeLists.txt

index 384567856c71c2429c5988d21b1f49af84b7157f..2b495e5661fc7878da50bdc7e0ae88b0ed75a98d 100644 (file)
@@ -425,6 +425,7 @@ set( INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" )
 set( _LIBDIR "${CMAKE_INSTALL_LIBDIR}" )
 set( _DATADIR "${CMAKE_INSTALL_DATADIR}" )
 set( _PKGLIB "${_LIBDIR}/audacity" )
+set( _PKGMODULE "${_PKGLIB}/modules" )
 set( _PKGDATA "${_DATADIR}/audacity/" )
 set( _MANDIR "${CMAKE_INSTALL_MANDIR}" )
 set( _MODDIR "${_PKGLIB}/modules" )
index b51c6041459c3b7a5ea0944752dae9bd18c0e86d..ac9f583df6fac113b7cad935fa268c172b9ff0e0 100644 (file)
@@ -472,6 +472,17 @@ function ( make_interface_alias TARGET REAL_LIBTYTPE )
    endif()
 endfunction()
 
+# Call install(TARGETS...) only on Linux systems (i.e. exclude MacOS and Windows)
+macro( install_target_linux target destination )
+   if( NOT "${CMAKE_GENERATOR}" MATCHES "Xcode|Visual Studio*" AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin" )
+      install( TARGETS "${target}" DESTINATION "${destination}" )
+   endif()
+endmacro()
+
+macro( install_audacity_module target )
+   install_target_linux( "${target}" "${_PKGMODULE}" )
+endmacro()
+
 function( audacity_module_fn NAME SOURCES IMPORT_TARGETS
    ADDITIONAL_DEFINES ADDITIONAL_LIBRARIES LIBTYPE )
 
@@ -515,6 +526,7 @@ function( audacity_module_fn NAME SOURCES IMPORT_TARGETS
          PROPERTIES
             PREFIX ""
             FOLDER "modules" # for IDE organization
+            INSTALL_RPATH "$ORIGIN/.."
       )
 
       if( NOT CMAKE_SYSTEM_NAME MATCHES "Windows|Darwin" )
@@ -599,6 +611,12 @@ function( audacity_module_fn NAME SOURCES IMPORT_TARGETS
    collect_edges( ${TARGET} "${IMPORT_TARGETS}" ${LIBTYPE} )
    set( GRAPH_EDGES "${GRAPH_EDGES}" PARENT_SCOPE )
 
+   # Note: Some modules set EXCLUDE_FROM_ALL afterwards to not be installed.
+   # Therefore only install libraries, but not modules here.
+   if( NOT REAL_LIBTYPE STREQUAL "MODULE" )
+      install_target_linux( "${TARGET}" "${_PKGLIB}" )
+   endif()
+
    # collect unit test targets if they are present
    if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests")
       add_subdirectory(tests)
index 5ee18627febdc87a4070710fe78690b5ae015e09..ccfd50f41c0e9d5cefbe8592d26aaf7c457fa37f 100644 (file)
@@ -15,3 +15,4 @@ set( DEFINES
 )
 audacity_module( mod-script-pipe "${SOURCES}" "Audacity"
    "${DEFINES}" "" )
+install_audacity_module( mod-script-pipe )
index ab0b3cc231e9eebc06c58b00558a080b4e5ae96e..2b34e9d9a7d21257299cfc012ac61768b7d680a1 100644 (file)
@@ -1426,11 +1426,6 @@ else()
                RUNTIME
                RESOURCE DESTINATION "${_PKGDATA}" )
 
-      install( DIRECTORY "${_DEST}/${_LIBDIR}/"
-               DESTINATION "${_LIBDIR}"
-               USE_SOURCE_PERMISSIONS
-               FILES_MATCHING PATTERN "*.so*" )
-
       install( FILES "${_INTDIR}/audacity.desktop"
                DESTINATION "${_DATADIR}/applications" )
       install( FILES "${topdir}/LICENSE.txt" "${topdir}/README.md"