繁体   English   中英

CMake:为目标源设置目录

[英]CMake: set directory for target sources

我有一个 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/")

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

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

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

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

我认为那会相当优雅。

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

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

然后复制粘贴:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM