Đây là mảnh của tôi về mã để nhận được liên kết phụ thuộc một mục tiêu:
function(target_link_libraries _target)
set(_mode "PUBLIC")
foreach(_arg IN LISTS ARGN)
if (_arg MATCHES "INTERFACE|PUBLIC|PRIVATE|LINK_PRIVATE|LINK_PUBLIC|LINK_INTERFACE_LIBRARIES")
set(_mode "${_arg}")
else()
if (NOT _arg MATCHES "debug|optimized|general")
set_property(GLOBAL APPEND PROPERTY GlobalTargetDepends${_target} ${_arg})
endif()
endif()
endforeach()
_target_link_libraries(${_target} ${ARGN})
endfunction()
function(get_link_dependencies _target _listvar)
set(_worklist ${${_listvar}})
if (TARGET ${_target})
list(APPEND _worklist ${_target})
get_property(_dependencies GLOBAL PROPERTY GlobalTargetDepends${_target})
foreach(_dependency IN LISTS _dependencies)
if (NOT _dependency IN_LIST _worklist)
get_link_dependencies(${_dependency} _worklist)
endif()
endforeach()
set(${_listvar} "${_worklist}" PARENT_SCOPE)
endif()
endfunction()
Đối với các phiên bản cũ CMake (trước 3.4), bạn sẽ cần phải thay thế việc kiểm tra IN_LIST
với một cuộc gọi list(FIND ...)
:
[...]
list(FIND _worklist ${_dependency} _idx)
if (${_idx} EQUAL -1)
get_link_dependencies(${_dependency} _worklist)
endif()
[...]
Và đây là các mã kiểm tra tôi đã sử dụng:
cmake_minimum_required(VERSION 3.4)
project(GetSources)
cmake_policy(SET CMP0057 NEW)
[... include functions posted above ...]
file(WRITE a.cc "")
add_library(A STATIC a.cc)
file(WRITE b.cc "")
add_library(B STATIC b.cc)
file(WRITE main.cc "int main() { return 0; }")
add_executable(${PROJECT_NAME} main.cc)
target_link_libraries(B A)
target_link_libraries(${PROJECT_NAME} B)
get_link_dependencies(${PROJECT_NAME} _deps)
foreach(_dep IN LISTS _deps)
get_target_property(_srcs ${_dep} SOURCES)
get_target_property(_src_dir ${_dep} SOURCE_DIR)
foreach(_src IN LISTS _srcs)
message("${_src_dir}/${_src}")
endforeach()
endforeach()
Tài liệu tham khảo
Bạn có thể sử dụng [ 'SOURCES'] (https://cmake.org/cmake/help/latest/prop_tgt/SOURCES.html) nhắm mục tiêu bất động sản và bạn có thể tìm thấy các mẫu mã [ở đây] (http://stackoverflow.com/questions/32756195/recursive-list-of-link-libraries-in-cmake) lặp lại các mục tiêu phụ thuộc. Bạn có thể mô tả những gì bạn đã thử cho đến nay không? – Florian
Tôi không nhận ra rằng tôi có thể lặp lại các mục tiêu phụ thuộc như thế. Tôi nghĩ tôi có thể làm cho nó hoạt động với thuộc tính SOURCES. –
Tôi đã viết một cái gì đó tương tự bằng cách ghi đè các chức năng CMake và có thể cung cấp một ví dụ mã nếu bạn quan tâm (như là một điểm khởi đầu). Đây có phải là một số mã CMake của thư viện bên ngoài mà chúng ta đang nói đến ở đây hoặc bạn có muốn sử dụng nó trên mã của riêng mình không? – Florian