enable_language(C) set(testlib_names preexcluded executable_path executable_path_bundle executable_path_postexcluded loader_path loader_path_unresolved loader_path_postexcluded rpath rpath_unresolved rpath_postexcluded rpath_executable_path rpath_executable_path_bundle rpath_executable_path_postexcluded rpath_loader_path rpath_loader_path_unresolved rpath_loader_path_postexcluded normal normal_unresolved normal_postexcluded conflict ) file(REMOVE "${CMAKE_BINARY_DIR}/testlib.c") add_library(testlib SHARED "${CMAKE_BINARY_DIR}/testlib.c") foreach(name ${testlib_names}) if(name STREQUAL "normal") file(WRITE "${CMAKE_BINARY_DIR}/normal.c" "extern void rpath(void);\nvoid normal(void)\n{\n rpath();\n}\n") else() file(WRITE "${CMAKE_BINARY_DIR}/${name}.c" "void ${name}(void) {}\n") endif() add_library(${name} SHARED "${CMAKE_BINARY_DIR}/${name}.c") file(APPEND "${CMAKE_BINARY_DIR}/testlib.c" "extern void ${name}(void);\n") endforeach() file(APPEND "${CMAKE_BINARY_DIR}/testlib.c" "void testlib(void)\n{\n") foreach(name ${testlib_names}) file(APPEND "${CMAKE_BINARY_DIR}/testlib.c" " ${name}();\n") endforeach() file(APPEND "${CMAKE_BINARY_DIR}/testlib.c" "}\n") set_property(TARGET ${testlib_names} PROPERTY BUILD_WITH_INSTALL_NAME_DIR 1) target_link_libraries(normal PRIVATE rpath) set_property(TARGET normal PROPERTY INSTALL_RPATH "${CMAKE_BINARY_DIR}/root-all/executable/lib/normal/../rpath" ) file(WRITE "${CMAKE_BINARY_DIR}/testlib_conflict.c" "extern void conflict(void);\nvoid testlib_conflict(void)\n{\n conflict();\n}\n") add_library(testlib_conflict SHARED "${CMAKE_BINARY_DIR}/testlib_conflict.c") target_link_libraries(testlib_conflict PRIVATE conflict) set_property(TARGET testlib PROPERTY INSTALL_RPATH "${CMAKE_BINARY_DIR}/root-all/executable/lib/rpath" "${CMAKE_BINARY_DIR}/root-all/executable/lib/rpath_unresolved" "${CMAKE_BINARY_DIR}/root-all/executable/lib/rpath_postexcluded" "${CMAKE_BINARY_DIR}/root-all/executable/lib/conflict" @executable_path/../lib/rpath_executable_path @executable_path/../lib/rpath_executable_path_unresolved @executable_path/../lib/rpath_executable_path_postexcluded @loader_path/rpath_loader_path @loader_path/rpath_loader_path_unresolved @loader_path/rpath_loader_path_postexcluded ) set_property(TARGET testlib_conflict PROPERTY INSTALL_RPATH "${CMAKE_BINARY_DIR}/root-all/executable/lib/conflict2" ) foreach(t executable_path executable_path_postexcluded loader_path loader_path_postexcluded rpath rpath_postexcluded rpath_executable_path rpath_executable_path_postexcluded rpath_loader_path rpath_loader_path_postexcluded conflict ) install(TARGETS ${t} DESTINATION executable/lib/${t}) endforeach() install(TARGETS conflict DESTINATION executable/lib/conflict2) foreach(t executable_path_bundle executable_path_postexcluded loader_path_postexcluded rpath_postexcluded rpath_executable_path_bundle rpath_executable_path_postexcluded rpath_loader_path_postexcluded ) install(TARGETS ${t} DESTINATION bundle_executable/lib/${t}) endforeach() foreach(t executable_path executable_path_bundle executable_path_postexcluded) set_property(TARGET ${t} PROPERTY INSTALL_NAME_DIR @executable_path/../lib/${t}) endforeach() foreach(t loader_path loader_path_unresolved loader_path_postexcluded) set_property(TARGET ${t} PROPERTY INSTALL_NAME_DIR @loader_path/${t}) endforeach() foreach(t rpath rpath_unresolved rpath_postexcluded rpath_executable_path rpath_executable_path_bundle rpath_executable_path_postexcluded rpath_loader_path rpath_loader_path_unresolved rpath_loader_path_postexcluded conflict ) set_property(TARGET ${t} PROPERTY INSTALL_NAME_DIR @rpath) endforeach() foreach(t normal normal_unresolved normal_postexcluded) set_property(TARGET ${t} PROPERTY INSTALL_NAME_DIR "${CMAKE_BINARY_DIR}/root-all/executable/lib/${t}") if(NOT t STREQUAL "normal_unresolved") install(TARGETS ${t} DESTINATION executable/lib/${t}) endif() endforeach() target_link_libraries(testlib PRIVATE ${testlib_names}) add_executable(topexe macos/topexe.c) add_executable(topexe_weak macos/topexe.c) add_library(toplib SHARED macos/toplib.c) add_library(topmod MODULE macos/toplib.c) target_link_libraries(topexe PRIVATE testlib) target_link_libraries(topexe_weak PRIVATE "-weak_library" testlib) target_link_libraries(toplib PRIVATE testlib) target_link_libraries(topmod PRIVATE testlib) set_property(TARGET topexe toplib topmod PROPERTY INSTALL_RPATH "${CMAKE_BINARY_DIR}/root-all/executable/lib") set_property(TARGET topexe_weak toplib topmod PROPERTY INSTALL_RPATH "${CMAKE_BINARY_DIR}/root-all/executable/lib") install(TARGETS topexe topexe_weak toplib topmod testlib testlib_conflict RUNTIME DESTINATION executable/bin LIBRARY DESTINATION executable/lib) install(TARGETS topexe topexe_weak toplib topmod testlib testlib_conflict RUNTIME DESTINATION bundle_executable/bin LIBRARY DESTINATION bundle_executable/lib) install(CODE [[ function(exec_get_runtime_dependencies depsfile udepsfile cdepsfile) file(GET_RUNTIME_DEPENDENCIES RESOLVED_DEPENDENCIES_VAR deps UNRESOLVED_DEPENDENCIES_VAR udeps CONFLICTING_DEPENDENCIES_PREFIX cdeps PRE_INCLUDE_REGEXES "^.*/lib(testlib|executable_path|executable_path_bundle|executable_path_postexcluded|loader_path|loader_path_unresolved|loader_path_postexcluded|rpath|rpath_unresolved|rpath_postexcluded|rpath_executable_path|rpath_executable_path_bundle|rpath_executable_path_postexcluded|rpath_loader_path|rpath_loader_path_unresolved|rpath_loader_path_postexcluded|normal|normal_unresolved|normal_postexcluded|conflict|System\\.B)\\.dylib$" PRE_EXCLUDE_REGEXES ".*" POST_INCLUDE_REGEXES "^.*/lib(testlib|executable_path|executable_path_bundle|loader_path|rpath|rpath_executable_path|rpath_executable_path_bundle|rpath_loader_path|normal|conflict|System\\.B)\\.dylib$" POST_EXCLUDE_REGEXES ".*" ${ARGN} ) list(SORT deps) list(SORT udeps) list(SORT cdeps_FILENAMES) file(WRITE "${CMAKE_INSTALL_PREFIX}/deps/${depsfile}" "${deps}") file(WRITE "${CMAKE_INSTALL_PREFIX}/deps/${udepsfile}" "${udeps}") file(WRITE "${CMAKE_INSTALL_PREFIX}/deps/${cdepsfile}" "") foreach(cdep IN LISTS cdeps_FILENAMES) set(cdep_values ${cdeps_${cdep}}) list(SORT cdep_values) file(APPEND "${CMAKE_INSTALL_PREFIX}/deps/${cdepsfile}" "${cdep}:${cdep_values}\n") endforeach() endfunction() exec_get_runtime_dependencies( deps1.txt udeps1.txt cdeps1.txt EXECUTABLES "${CMAKE_INSTALL_PREFIX}/executable/bin/$" LIBRARIES "${CMAKE_INSTALL_PREFIX}/executable/lib/$" ) exec_get_runtime_dependencies( deps2.txt udeps2.txt cdeps2.txt LIBRARIES "${CMAKE_INSTALL_PREFIX}/executable/lib/$" "${CMAKE_INSTALL_PREFIX}/executable/lib/$" ) exec_get_runtime_dependencies( deps3.txt udeps3.txt cdeps3.txt MODULES "${CMAKE_INSTALL_PREFIX}/executable/lib/$" LIBRARIES "${CMAKE_INSTALL_PREFIX}/executable/lib/$" ) exec_get_runtime_dependencies( deps4.txt udeps4.txt cdeps4.txt EXECUTABLES "${CMAKE_INSTALL_PREFIX}/executable/bin/$" LIBRARIES "${CMAKE_INSTALL_PREFIX}/executable/lib/$" BUNDLE_EXECUTABLE "${CMAKE_INSTALL_PREFIX}/bundle_executable/bin/$" ) exec_get_runtime_dependencies( deps5.txt udeps5.txt cdeps5.txt LIBRARIES "${CMAKE_INSTALL_PREFIX}/executable/lib/$" "${CMAKE_INSTALL_PREFIX}/executable/lib/$" BUNDLE_EXECUTABLE "${CMAKE_INSTALL_PREFIX}/bundle_executable/bin/$" ) exec_get_runtime_dependencies( deps6.txt udeps6.txt cdeps6.txt MODULES "${CMAKE_INSTALL_PREFIX}/executable/lib/$" LIBRARIES "${CMAKE_INSTALL_PREFIX}/executable/lib/$" BUNDLE_EXECUTABLE "${CMAKE_INSTALL_PREFIX}/bundle_executable/bin/$" ) exec_get_runtime_dependencies( deps7.txt udeps7.txt cdeps7.txt EXECUTABLES "${CMAKE_INSTALL_PREFIX}/executable/bin/$" LIBRARIES "${CMAKE_INSTALL_PREFIX}/executable/lib/$" ) ]])