在CMake中获取目标所依赖的所有源文件

前端之家收集整理的这篇文章主要介绍了在CMake中获取目标所依赖的所有源文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用CMake,我如何获得进入可执行目标的所有源文件的列表,包括此可执行文件所依赖的所有目标中的所有源?

我们在代码库中有一个模式,其中初始化调用者是由构建系统根据源树中的文件名和路径生成的.因此,我需要可执行目标所依赖的所有源文件的完整路径(或相对于源根目录).

这是我的一段代码,用于获取一个目标的链接依赖项:
  1. function(target_link_libraries _target)
  2. set(_mode "PUBLIC")
  3. foreach(_arg IN LISTS ARGN)
  4. if (_arg MATCHES "INTERFACE|PUBLIC|PRIVATE|LINK_PRIVATE|LINK_PUBLIC|LINK_INTERFACE_LIBRARIES")
  5. set(_mode "${_arg}")
  6. else()
  7. if (NOT _arg MATCHES "debug|optimized|general")
  8. set_property(GLOBAL APPEND PROPERTY GlobalTargetDepends${_target} ${_arg})
  9. endif()
  10. endif()
  11. endforeach()
  12. _target_link_libraries(${_target} ${ARGN})
  13. endfunction()
  14.  
  15. function(get_link_dependencies _target _listvar)
  16. set(_worklist ${${_listvar}})
  17. if (TARGET ${_target})
  18. list(APPEND _worklist ${_target})
  19. get_property(_dependencies GLOBAL PROPERTY GlobalTargetDepends${_target})
  20. foreach(_dependency IN LISTS _dependencies)
  21. if (NOT _dependency IN_LIST _worklist)
  22. get_link_dependencies(${_dependency} _worklist)
  23. endif()
  24. endforeach()
  25. set(${_listvar} "${_worklist}" PARENT_SCOPE)
  26. endif()
  27. endfunction()

对于较旧的CMake版本(3.4之前的版本),您需要使用列表(FIND …)调用替换IN_LIST检查:

  1. [...]
  2. list(FIND _worklist ${_dependency} _idx)
  3. if (${_idx} EQUAL -1)
  4. get_link_dependencies(${_dependency} _worklist)
  5. endif()
  6. [...]

这是我用过的测试代码

  1. cmake_minimum_required(VERSION 3.4)
  2.  
  3. project(GetSources)
  4.  
  5. cmake_policy(SET CMP0057 NEW)
  6.  
  7. [... include functions posted above ...]
  8.  
  9. file(WRITE a.cc "")
  10. add_library(A STATIC a.cc)
  11.  
  12. file(WRITE b.cc "")
  13. add_library(B STATIC b.cc)
  14.  
  15. file(WRITE main.cc "int main() { return 0; }")
  16. add_executable(${PROJECT_NAME} main.cc)
  17.  
  18. target_link_libraries(B A)
  19. target_link_libraries(${PROJECT_NAME} B)
  20.  
  21. get_link_dependencies(${PROJECT_NAME} _deps)
  22. foreach(_dep IN LISTS _deps)
  23. get_target_property(_srcs ${_dep} SOURCES)
  24. get_target_property(_src_dir ${_dep} SOURCE_DIR)
  25. foreach(_src IN LISTS _srcs)
  26. message("${_src_dir}/${_src}")
  27. endforeach()
  28. endforeach()

参考

> Recursive list of LINK_LIBRARIES in CMake

猜你在找的设计模式相关文章