Relative.cmake 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. enable_language(C)
  2. if(NOT CMAKE_SHARED_LIBRARY_RPATH_ORIGIN_TOKEN)
  3. if(CMAKE_C_PLATFORM_ID STREQUAL "Linux")
  4. # Sanity check for platform that is definitely known to support $ORIGIN.
  5. message(FATAL_ERROR "Platform fails to report relative RPATH support")
  6. else()
  7. message(STATUS "Platform does not support relative RPATHs, skipping")
  8. endif()
  9. return()
  10. endif()
  11. set(CMAKE_BUILD_RPATH_USE_ORIGIN ON)
  12. function(CheckRpath target rpath)
  13. add_custom_command(
  14. TARGET ${target}
  15. POST_BUILD
  16. COMMAND ${CMAKE_COMMAND} -Dfile=$<TARGET_FILE:${target}> -Drpath=${rpath}
  17. -P "${CMAKE_CURRENT_SOURCE_DIR}/RelativeCheck.cmake"
  18. VERBATIM
  19. )
  20. endfunction()
  21. if(CMAKE_C_COMPILER_ID STREQUAL "XL" AND CMAKE_BINARY_DIR MATCHES " ")
  22. # XL 16.1.0.0 fails building the library if the output path contains a space.
  23. set(externDir)
  24. message(STATUS "Skipping external library test because of a toolchain bug")
  25. else()
  26. get_filename_component(externDir "${CMAKE_BINARY_DIR}" DIRECTORY)
  27. set(externDir "${externDir}/Relative-extern")
  28. endif()
  29. add_library(utils SHARED A.c)
  30. add_library(utils-sub SHARED A.c)
  31. set_property(TARGET utils-sub PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/libs)
  32. if(externDir)
  33. add_library(utils-extern SHARED A.c)
  34. set_property(TARGET utils-extern PROPERTY LIBRARY_OUTPUT_DIRECTORY ${externDir})
  35. endif()
  36. add_executable(main main.c)
  37. target_link_libraries(main utils)
  38. CheckRpath(main "\$ORIGIN")
  39. add_executable(main-norel main.c)
  40. target_link_libraries(main-norel utils)
  41. set_property(TARGET main-norel PROPERTY BUILD_RPATH_USE_ORIGIN OFF)
  42. CheckRpath(main-norel "${CMAKE_CURRENT_BINARY_DIR}")
  43. add_executable(mainsub main.c)
  44. target_link_libraries(mainsub utils)
  45. set_property(TARGET mainsub PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
  46. CheckRpath(mainsub "\$ORIGIN/../")
  47. add_executable(main-sub main.c)
  48. target_link_libraries(main-sub utils-sub)
  49. CheckRpath(main-sub "\$ORIGIN/libs")
  50. add_executable(mainsub-sub main.c)
  51. target_link_libraries(mainsub-sub utils-sub)
  52. set_property(TARGET mainsub-sub PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
  53. CheckRpath(mainsub-sub "\$ORIGIN/../libs")
  54. if(externDir)
  55. # Binaries linking to libraries outside the build tree should have an absolute RPATH.
  56. add_executable(main-extern main.c)
  57. target_link_libraries(main-extern utils-extern)
  58. CheckRpath(main-extern "${externDir}")
  59. endif()