我有一个文件
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
添加其他源文件的所需行为,同时保留该文件的语言设置?
来自文档:
默认情况下,源文件属性仅对同一目录 (CMakeLists.txt) 中添加的目标可见。可以使用以下选项之一或两个在其他目录范围中设置可见性:
DIRECTORY <dirs>...
源文件属性将在每个目录的范围内设置。 CMake 必须已经了解每个源目录,可以通过调用 add_subdirectory() 添加它们,也可以将其作为顶级源目录。相对路径被视为相对于当前源目录。
TARGET_DIRECTORY <targets>...
源文件属性将在创建任何指定文件的每个目录范围中设置(因此必须已经存在)。
因此,就您而言,以下内容就足够了:
set_source_files_properties(distribution.cpp TARGET_DIRECTORY foo PROPERTIES LANGUAGE CUDA)