blob: d82d8fbb566e91ad1c48bdba2583f18142e7a407 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
enable_language(C)
cmake_policy(SET CMP0095 NEW)
set(test_rpath_names
preexcluded
rpath_postexcluded
rpath
rpath_parent_postexcluded
rpath_parent
rpath_origin_postexcluded
rpath_origin
rpath_search_postexcluded
rpath_search
rpath_unresolved
conflict
)
set(test_runpath_names
runpath_postexcluded
runpath
runpath_origin_postexcluded
runpath_origin
runpath_parent_unresolved
runpath_search_postexcluded
runpath_search
runpath_unresolved
)
file(REMOVE "${CMAKE_BINARY_DIR}/test_rpath.c")
add_library(test_rpath SHARED "${CMAKE_BINARY_DIR}/test_rpath.c")
foreach(name ${test_rpath_names})
file(WRITE "${CMAKE_BINARY_DIR}/${name}.c" "void ${name}(void) {}\n")
add_library(${name} SHARED "${CMAKE_BINARY_DIR}/${name}.c")
file(APPEND "${CMAKE_BINARY_DIR}/test_rpath.c" "extern void ${name}(void);\n")
endforeach()
file(APPEND "${CMAKE_BINARY_DIR}/test_rpath.c" "void test_rpath(void)\n{\n")
foreach(name ${test_rpath_names})
file(APPEND "${CMAKE_BINARY_DIR}/test_rpath.c" " ${name}();\n")
endforeach()
file(APPEND "${CMAKE_BINARY_DIR}/test_rpath.c" "}\n")
install(TARGETS rpath_postexcluded DESTINATION lib/rpath_postexcluded)
install(TARGETS rpath DESTINATION lib/rpath)
install(TARGETS rpath_origin_postexcluded DESTINATION lib/rpath_origin_postexcluded)
install(TARGETS rpath_origin DESTINATION lib/rpath_origin)
install(TARGETS rpath_parent_postexcluded DESTINATION lib/rpath_parent_postexcluded)
install(TARGETS rpath rpath_origin rpath_parent DESTINATION lib/rpath_parent)
install(TARGETS rpath_search_postexcluded DESTINATION lib/rpath_search_postexcluded)
install(TARGETS rpath rpath_origin rpath_parent rpath_search DESTINATION lib/rpath_search)
install(TARGETS conflict DESTINATION lib/conflict)
target_link_libraries(test_rpath PRIVATE ${test_rpath_names})
set_property(TARGET test_rpath PROPERTY INSTALL_RPATH
"${CMAKE_BINARY_DIR}/root-all/lib/rpath_postexcluded"
"${CMAKE_BINARY_DIR}/root-all/lib/rpath"
"\$ORIGIN/rpath_origin_postexcluded"
"\${ORIGIN}/rpath_origin"
"${CMAKE_BINARY_DIR}/root-all/lib/conflict"
)
target_link_options(test_rpath PRIVATE -Wl,--disable-new-dtags)
file(REMOVE "${CMAKE_BINARY_DIR}/test_runpath.c")
add_library(test_runpath SHARED "${CMAKE_BINARY_DIR}/test_runpath.c")
foreach(name ${test_runpath_names} rpath conflict)
file(WRITE "${CMAKE_BINARY_DIR}/${name}.c" "void ${name}(void) {}\n")
if(NOT name MATCHES "^(rpath|conflict)$")
add_library(${name} SHARED "${CMAKE_BINARY_DIR}/${name}.c")
endif()
file(APPEND "${CMAKE_BINARY_DIR}/test_runpath.c" "extern void ${name}(void);\n")
endforeach()
file(APPEND "${CMAKE_BINARY_DIR}/test_runpath.c" "void test_runpath(void)\n{\n")
foreach(name ${test_runpath_names} rpath conflict)
file(APPEND "${CMAKE_BINARY_DIR}/test_runpath.c" " ${name}();\n")
endforeach()
file(APPEND "${CMAKE_BINARY_DIR}/test_runpath.c" "}\n")
install(TARGETS runpath_postexcluded DESTINATION lib/runpath_postexcluded)
install(TARGETS runpath DESTINATION lib/runpath)
install(TARGETS runpath_origin_postexcluded DESTINATION lib/runpath_origin_postexcluded)
install(TARGETS runpath_origin DESTINATION lib/runpath_origin)
install(TARGETS runpath_parent_unresolved DESTINATION lib/runpath_parent_unresolved)
install(TARGETS runpath_search_postexcluded DESTINATION lib/runpath_search_postexcluded)
install(TARGETS runpath runpath_origin runpath_search DESTINATION lib/runpath_search)
install(TARGETS conflict DESTINATION lib/conflict2)
target_link_libraries(test_runpath PRIVATE ${test_runpath_names} rpath conflict)
set_property(TARGET test_runpath PROPERTY INSTALL_RPATH
"${CMAKE_BINARY_DIR}/root-all/lib/runpath/../rpath" # Ensure that files that don't conflict are treated correctly
"${CMAKE_BINARY_DIR}/root-all/lib/runpath_postexcluded"
"${CMAKE_BINARY_DIR}/root-all/lib/runpath"
"\${ORIGIN}/runpath_origin_postexcluded"
"\$ORIGIN/runpath_origin"
"${CMAKE_BINARY_DIR}/root-all/lib/conflict2"
)
target_link_options(test_runpath PRIVATE -Wl,--enable-new-dtags)
set_property(TARGET test_rpath ${test_rpath_names} test_runpath ${test_runpath_names} PROPERTY LIBRARY_OUTPUT_DIRECTORY lib)
install(TARGETS test_rpath test_runpath DESTINATION lib)
add_executable(topexe linux/topexe.c)
add_library(toplib SHARED linux/toplib.c)
add_library(topmod MODULE linux/toplib.c)
target_link_libraries(topexe PRIVATE test_rpath test_runpath)
target_link_libraries(toplib PRIVATE test_rpath test_runpath)
target_link_libraries(topmod PRIVATE test_rpath test_runpath)
set_property(TARGET topexe toplib topmod PROPERTY INSTALL_RPATH
"${CMAKE_BINARY_DIR}/root-all/lib"
"${CMAKE_BINARY_DIR}/root-all/lib/rpath_parent_postexcluded"
"${CMAKE_BINARY_DIR}/root-all/lib/rpath_parent"
"${CMAKE_BINARY_DIR}/root-all/lib/runpath_parent_unresolved"
)
target_link_options(topexe PRIVATE -Wl,--disable-new-dtags)
target_link_options(toplib PRIVATE -Wl,--disable-new-dtags)
target_link_options(topmod PRIVATE -Wl,--disable-new-dtags)
install(TARGETS topexe toplib RUNTIME DESTINATION bin LIBRARY DESTINATION lib)
install(TARGETS topmod LIBRARY DESTINATION lib/modules)
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(test_rpath|rpath_postexcluded|rpath|rpath_parent_postexcluded|rpath_parent|rpath_origin_postexcluded|rpath_origin|rpath_search_postexcluded|rpath_search|rpath_unresolved|test_runpath|runpath_postexcluded|runpath|runpath_origin_postexcluded|runpath_origin|runpath_parent_unresolved|runpath_search_postexcluded|runpath_search|runpath_unresolved|conflict)\\.so$"
"^libc\\.so"
PRE_EXCLUDE_REGEXES ".*"
POST_INCLUDE_REGEXES "^.*/(libtest_rpath|rpath/librpath|rpath_parent/librpath_parent|rpath_search/librpath_search|libtest_runpath|runpath/librunpath|runpath_origin_postexcluded|runpath_origin|runpath_search/librunpath_search|conflict2?/libconflict)\\.so$"
POST_EXCLUDE_REGEXES ".*"
DIRECTORIES
"${CMAKE_INSTALL_PREFIX}/lib/rpath_search_postexcluded"
"${CMAKE_INSTALL_PREFIX}/lib/rpath_search"
"${CMAKE_INSTALL_PREFIX}/lib/runpath_search_postexcluded"
"${CMAKE_INSTALL_PREFIX}/lib/runpath_search"
${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}/bin/$<TARGET_FILE_NAME:topexe>"
)
exec_get_runtime_dependencies(
deps2.txt udeps2.txt cdeps2.txt
LIBRARIES
"${CMAKE_INSTALL_PREFIX}/lib/$<TARGET_FILE_NAME:toplib>"
)
exec_get_runtime_dependencies(
deps3.txt udeps3.txt cdeps3.txt
MODULES
"${CMAKE_INSTALL_PREFIX}/lib/modules/$<TARGET_FILE_NAME:topmod>"
)
]])
|