CMake:设置目标源的目录

CMake: set directory for target sources

本文关键字:目标 设置 CMake      更新时间:2023-10-16

我有一个C++项目,其中所有实现源文件(*.cpp)都驻留在项目目录内的src目录中。某些文件位于其他子目录中。假设src/foo/中有 50 个文件。我需要将这些文件列为add_library和/或target_sources功能的一部分。

现在,无论在哪里看,都不鼓励自动添加目录中的所有文件,这对我来说很好。所以我将手动列出所有文件;但是重复通用前缀src/foo/50 次似乎真的很愚蠢,而且很烦人。

在target_sources的文档中,它说

相对源文件路径被解释为相对于当前源目录(即CMAKE_CURRENT_SOURCE_DIR)。

所以我在调用target_source之前添加了set(CMAKE_CURRENT_SOURCE_DIR "src/foo/"),但它不起作用。(我收到"找不到源文件"错误。

那么,如果可能的话,实现我想要的目标的正确方法是什么?

注意:项目的(公共)头文件(*.hpp)位于包含目录中(在src之外)。这使用target_include_directories功能进行了很好的配置(无需列出单个文件)。

但重复通用前缀 src/foo/50 次

只需在源前面加上前缀即可。

set(target_sources
source1.c
source2.c
)
list(TRANSFORM target_sources PREPEND "src/foo/")

您还可以在src/foo中使用add_subdirectory(src/foo)CMakeLists.txt,您只需将

target_sources( <your target> PRIVATE|PUBLIC|INTERFACE
your
list
of
sources
)

我认为这将是相当优雅的。

CMAKE_CURRENT_SOURCE_DIR设置为旧CMAKE_CURRENT_SOURCE_DIR的相对变量是行不通的。如果它设置为一个值,那么假设删除该值并使用自定义值将是错误的是公平的,因为您错过了它之前设置的内容。

您可能希望将其设置为绝对路径,或使用set(CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/foo/"),或者像许多其他人一样并始终复制粘贴前缀。这是标准做法(这也是我仍然使用 GLOB 的原因之一,因为我很懒),跟进显式比隐式更好(这是不使用GLOB的重点)。

我会建议(如果你有bash或一些类似的shell)

function prepend() { while read line; do echo "${1}${line}"; done; }
ls *.cc *hh | sort | prepend  "${CMAKE_CURRENT_SOURCE_DIR}/"

然后复制并粘贴:)