相关疑难解决方法(0)

CMake中LINK_LIBRARIES的递归列表

我试图获取链接到CMake中特定目标的所有库的绝对路径列表,以便在调用时使用add_custom_command.但是,get_target_property(_LINK_LIBRARIES ${TARGET} LINK_LIBRARIES仅包括直接依赖项(即target_link_libraries(${TARGET} ...)调用中使用的任何内容).

因此,如果我链接另一个CMake目标,例如mylibrary,列表将包括mylibrary,但仅作为名称并且没有可传递链接的库.由于此列表还可以包含任意复杂的生成器表达式,因此检查每个项目是否为目标并LINK_LIBRARIES递归检索它是不可行的.此外,目标可以在稍后的时间点指定,CMakeLists.txt并且if(TARGET mylibrary)将被跳过.

对于INCLUDE_DIRECTORIESCOMPILE_DEFINITIONS这是很容易解决的,因为虽然两者的行为类似时get_target_property被使用(不同之处在于所链接的目标显然不能在列表中),则形式的发电机表达$<TARGET_PROPERTY:${TARGET},INCLUDE_DIRECTORIES>产生的递归需要包括和定义所需的列表.但是,$<TARGET_PROPERTY:${TARGET},LINK_LIBRARIES>生成与get_target_property变体相同的列表.

如何检索所需的绝对路径列表?

示范:

cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)

file(WRITE a.cpp "void foo() {};\n")
file(WRITE b.cpp "int main(int, char**) { return 0; }\n")

find_package(Boost REQUIRED COMPONENTS filesystem system)

add_library(A STATIC a.cpp)
target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
target_link_libraries(A PUBLIC ${Boost_LIBRARIES})

# demonstrates (at configure time) that the LINK_LIBRARIES property can contain
# …
Run Code Online (Sandbox Code Playgroud)

cmake

12
推荐指数
2
解决办法
5324
查看次数

在CMake中"make dist"相当于

根据FAQ,CMake不会创建make dist目标,可以使用CPack创建源包.但是CPack只是使用与模式不匹配的所有文件制作源目录的tarball CPACK_SOURCE_IGNORE_FILES.

另一方面,make dist由autotools生成的文件只包含它所知道的文件,主要是编译所需的文件.

任何人都有一种聪明的方法来制作一个只包含在CMakeLists.txt(及其依赖项)中指定的文件的源包?

packaging cmake cpack

10
推荐指数
1
解决办法
1758
查看次数

标签 统计

cmake ×2

cpack ×1

packaging ×1