1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 16:10:06 +02:00
Dmitry Vedenko 4e6a1a81a9 Updates the way shared libraries are hadled
1. We put all shared libraries into one place. Both conan and locally built
2. We invoke CopyLibs to copy the libraries to a proper location and to correctly set the RPATH
Fixes CopyLibs script on Windows


Fixes CopyLibs.cmake for Linux

Fixes CopyLibs on macOS


Fixes CopyLibs on macOS
2021-05-26 12:46:45 +03:00

128 lines
3.4 KiB
CMake

# Copy library during build and, on the Mac, modify the dependent
# library paths.
#
# Defines required:
#
# SRC source library name
# DST destination directory
#
message( "==================================================================" )
message( "Copying shared libraries:" )
message( "==================================================================" )
# list command no longer ignores empty elements.
cmake_policy( SET CMP0007 NEW )
function( execute )
list( POP_FRONT ARGV outlist )
execute_process(
COMMAND
${ARGV}
OUTPUT_VARIABLE
cmd_out
# COMMAND_ECHO STDOUT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
#message("OUTPUT\n${cmd_out}")
# Convert output to list and strip
string( REPLACE "\n" ";" cmd_out "${cmd_out}" )
list( TRANSFORM cmd_out STRIP )
set( ${outlist} ${cmd_out} PARENT_SCOPE )
endfunction()
function( gather_libs src )
if( CMAKE_HOST_SYSTEM_NAME MATCHES "Windows" )
execute( output cmd /k dumpbin /dependents ${src} )
foreach( line ${output} )
set( lib ${WXWIN}/${line} )
if( EXISTS "${lib}" )
list( APPEND libs ${lib} )
gather_libs( ${lib} )
elseif ( EXISTS "${DST}/${line}" )
gather_libs( "${DST}/${line}" )
endif()
endforeach()
elseif( CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin" )
message(STATUS "Checking ${src} for libraries...")
execute( output otool -L ${src} )
set( libname "${src}" )
foreach( line ${output} )
if( line MATCHES "^.*\\.dylib " )
string( REGEX REPLACE "dylib .*" "dylib" line "${line}" )
get_filename_component( dylib_name "${line}" NAME)
message(STATUS "Checking out ${line}")
set( lib "${WXWIN}/${dylib_name}" )
if( NOT lib STREQUAL "${src}" AND NOT line MATCHES "@executable" AND EXISTS "${lib}")
message(STATUS "\tProcessing ${lib}...")
list( APPEND libs ${lib} )
get_filename_component( refname "${lib}" NAME )
message(STATUS "\t\tAdding ${refname} to ${src}")
list( APPEND postcmds "sh -c 'install_name_tool -change ${line} @executable_path/../Frameworks/${refname} ${src}'" )
gather_libs( ${lib} )
endif()
endif()
endforeach()
elseif( CMAKE_HOST_SYSTEM_NAME MATCHES "Linux" )
message(STATUS "Executing LD_LIBRARY_PATH='${WXWIN}' ldd ${src}")
execute( output sh -c "LD_LIBRARY_PATH='${WXWIN}' ldd ${src}" )
get_filename_component( libname "${src}" NAME )
foreach( line ${output} )
string( REGEX REPLACE "(.*) => .* \\(.*$" "\\1" line "${line}" )
message (STATUS "\tChecking ${line}...")
set(line "${WXWIN}/${line}")
if (EXISTS "${line}")
message (STATUS "\tAdding ${line}...")
set( lib ${line} )
list( APPEND libs ${lib} )
gather_libs( ${lib} )
endif()
endforeach()
endif()
set( libs ${libs} PARENT_SCOPE )
set( postcmds ${postcmds} PARENT_SCOPE )
endfunction()
gather_libs( "${SRC}" )
list( REMOVE_DUPLICATES postcmds )
foreach( cmd ${postcmds} )
execute_process(
COMMAND
sh -c "${cmd}"
COMMAND_ECHO STDOUT
)
endforeach()
list( REMOVE_DUPLICATES libs )
file( INSTALL ${libs} DESTINATION ${DST} FOLLOW_SYMLINK_CHAIN )