| 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() |