使用 target_sources 时不保留 CMake 文件属性

问题描述 投票:0回答:1

我有一个文件

distribution.cpp
如果设置了标志,我想有条件地使用 CUDA 进行编译。将文件添加到指定给
add_library
的源列表中时,以下操作有效:

add_library(foo STATIC bar.cpp distribution.cpp)
if(${CUDA_FOUND})
    set_source_files_properties(distribution.cpp PROPERTIES LANGUAGE CUDA) 
endif() 

我的项目已经发展壮大,我正在创建一个顶级库并使用

target_sources
添加每个目录中的源代码。但是,设置为 CUDA 的文件上的属性不再有效,项目将尝试使用 C++ 编译器构建它:

add_library(foo STATIC bar.cpp)
# ... In a child directory
target_sources(foo PRIVATE distribution.cpp)
if(${CUDA_FOUND})
    set_source_files_properties(distribution.cpp PROPERTIES LANGUAGE CUDA) 
endif() 

如何获得使用

target_sources
添加其他源文件的所需行为,同时保留该文件的语言设置?

c++ cmake
1个回答
0
投票

来自文档

默认情况下,源文件属性仅对同一目录 (CMakeLists.txt) 中添加的目标可见。可以使用以下选项之一或两个在其他目录范围中设置可见性:

DIRECTORY <dirs>...

源文件属性将在每个目录的范围内设置。 CMake 必须已经了解每个源目录,可以通过调用 add_subdirectory() 添加它们,也可以将其作为顶级源目录。相对路径被视为相对于当前源目录。

TARGET_DIRECTORY <targets>...

源文件属性将在创建任何指定文件的每个目录范围中设置(因此必须已经存在)。

因此,就您而言,以下内容就足够了:

set_source_files_properties(distribution.cpp TARGET_DIRECTORY foo PROPERTIES LANGUAGE CUDA) 
© www.soinside.com 2019 - 2024. All rights reserved.