我觉得这个问题几乎是愚蠢的,但我找不到任何关于这个...
假设我有一个包含许多目标的cmake项目:库,可执行文件,外部目标,....... 如何使用cmake命令行界面列出它们.我想要一个有效的列表,以替换为$target以下命令行.
cmake . && cmake --build . --target $target
Run Code Online (Sandbox Code Playgroud)
对于既不使用grep也不使用python,也不使用perl也不使用...的解决方案的奖励积分很多 - 你明白了.
我试图获取链接到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_DIRECTORIES和COMPILE_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) 有没有办法通过target_link_libraries命令打印列表链接到目标库的文件名
甚至更好,将所有目标的依赖项复制到特定文件夹?
在CMake中,是否可以以编程方式检索将用于给定目标的链接器标志的完整列表?我看到的唯一方法是检查link.txt目标CMakeFiles目录中的文件。不理想。
我感兴趣的用例是收集数据,以将其包含在pkg-config文件之类的文件中。我正在编写一个库,它包括几个使用该库的可执行实用程序。构建可执行文件(尤其是在静态构建库时)需要一条非平凡的链接行来链接到我的库及其依赖项。因此,我想写出将这些可执行文件构建到包中包含的数据文件中所需的链接行,以便其他客户端可以知道如何链接。
我刚刚继承了一堆用 CMake 构建的糟糕的项目。我的 CMake 知识为零,我怀疑以前的维护者也有同样多的知识。
我需要强制项目之间的构建顺序。它曾经是:
=== BUILD TARGET foo1 OF PROJECT bar ...
=== BUILD TARGET foo2 OF PROJECT bar ...
=== BUILD TARGET foo3 OF PROJECT bar ...
Run Code Online (Sandbox Code Playgroud)
我必须添加一个项目和依赖项(在不同的目标中,而不是上面的目标)。但代码充满了
# don't change the library order, it will break xyz
target_link_libraries(foo3 other1 foo2 other2 foo1 other3)
Run Code Online (Sandbox Code Playgroud)
正如你可以猜到的,在我的改变之后,我现在得到了
=== BUILD TARGET foo1 OF PROJECT bar ...
=== BUILD TARGET foo3 OF PROJECT bar ...
Run Code Online (Sandbox Code Playgroud)
并且foo3由于foo2未复制/安装/任何标头而无法构建。我很确定如果我可以在问题解决foo2之前强制 CMake 触发。foo3
但是,我尝试过:
target_link_libraries(foo3 foo2)
Run Code Online (Sandbox Code Playgroud)
无济于事。我仍然看到foo3之前的触发器 …
我知道通过CLI生成CMake项目依赖关系图的常用方法:
cmake --graphviz=[file]
Run Code Online (Sandbox Code Playgroud)
但是,有没有一种方法可以通过仅在CMakeList中设置标志或命令来自动生成?这个想法是让CMakeLists.txt本身触发图的生成,而不是通过命令行来触发用户。