|
|
|
enable_language(C)
|
|
|
|
|
|
|
|
set(cfg_up)
|
|
|
|
set(cfg_slash /)
|
|
|
|
if(cfg_dir)
|
|
|
|
set(cfg_up /..)
|
|
|
|
set(cfg_slash)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(NOT CMAKE_SHARED_LIBRARY_RPATH_ORIGIN_TOKEN)
|
|
|
|
if(CMAKE_C_PLATFORM_ID STREQUAL "Linux")
|
|
|
|
# Sanity check for platform that is definitely known to support $ORIGIN.
|
|
|
|
message(FATAL_ERROR "Platform fails to report relative RPATH support")
|
|
|
|
else()
|
|
|
|
message(STATUS "Platform does not support relative RPATHs, skipping")
|
|
|
|
endif()
|
|
|
|
return()
|
|
|
|
endif()
|
|
|
|
set(CMAKE_BUILD_RPATH_USE_ORIGIN ON)
|
|
|
|
|
|
|
|
function(CheckRpath target rpath)
|
|
|
|
add_custom_command(
|
|
|
|
TARGET ${target}
|
|
|
|
POST_BUILD
|
|
|
|
COMMAND ${CMAKE_COMMAND} -Dfile=$<TARGET_FILE:${target}> -Drpath=${rpath}
|
|
|
|
-P "${CMAKE_CURRENT_SOURCE_DIR}/RelativeCheck.cmake"
|
|
|
|
VERBATIM
|
|
|
|
)
|
|
|
|
endfunction()
|
|
|
|
|
|
|
|
if(CMAKE_C_COMPILER_ID STREQUAL "XL" AND CMAKE_BINARY_DIR MATCHES " ")
|
|
|
|
# XL 16.1.0.0 fails building the library if the output path contains a space.
|
|
|
|
set(externDir)
|
|
|
|
message(STATUS "Skipping external library test because of a toolchain bug")
|
|
|
|
else()
|
|
|
|
get_filename_component(externDir "${CMAKE_BINARY_DIR}" DIRECTORY)
|
|
|
|
set(externDir "${externDir}/Relative-extern")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
add_library(utils SHARED A.c)
|
|
|
|
add_library(utils-sub SHARED A.c)
|
|
|
|
set_property(TARGET utils-sub PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/libs)
|
|
|
|
if(externDir)
|
|
|
|
add_library(utils-extern SHARED A.c)
|
|
|
|
set_property(TARGET utils-extern PROPERTY LIBRARY_OUTPUT_DIRECTORY ${externDir})
|
|
|
|
endif()
|
|
|
|
|
|
|
|
add_executable(main main.c)
|
|
|
|
target_link_libraries(main utils)
|
|
|
|
CheckRpath(main "\$ORIGIN")
|
|
|
|
|
|
|
|
add_executable(main-norel main.c)
|
|
|
|
target_link_libraries(main-norel utils)
|
|
|
|
set_property(TARGET main-norel PROPERTY BUILD_RPATH_USE_ORIGIN OFF)
|
|
|
|
CheckRpath(main-norel "${CMAKE_CURRENT_BINARY_DIR}${cfg_dir}")
|
|
|
|
|
|
|
|
add_executable(mainsub main.c)
|
|
|
|
target_link_libraries(mainsub utils)
|
|
|
|
set_property(TARGET mainsub PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
|
|
|
|
CheckRpath(mainsub "\$ORIGIN${cfg_up}/..${cfg_dir}${cfg_slash}")
|
|
|
|
|
|
|
|
add_executable(main-sub main.c)
|
|
|
|
target_link_libraries(main-sub utils-sub)
|
|
|
|
CheckRpath(main-sub "\$ORIGIN${cfg_up}/libs${cfg_dir}")
|
|
|
|
|
|
|
|
add_executable(mainsub-sub main.c)
|
|
|
|
target_link_libraries(mainsub-sub utils-sub)
|
|
|
|
set_property(TARGET mainsub-sub PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
|
|
|
|
CheckRpath(mainsub-sub "\$ORIGIN${cfg_up}/../libs${cfg_dir}")
|
|
|
|
|
|
|
|
if(externDir)
|
|
|
|
# Binaries linking to libraries outside the build tree should have an absolute RPATH.
|
|
|
|
add_executable(main-extern main.c)
|
|
|
|
target_link_libraries(main-extern utils-extern)
|
|
|
|
CheckRpath(main-extern "${externDir}${cfg_dir}")
|
|
|
|
endif()
|