在CMake中,可以使用以下语法使用add_library
定义目标,例如C或C++库:
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
但是可能的来源是什么呢?它们可以是明显包含代码的.h
或.cxx
文件。但它们也可以是链接器使用的.rc
资源文件,甚至是.obj
对象文件。
那么,根据语言、目标类型、平台的不同,CMake中允许哪些类型的“非代码”作为目标的源呢?SOURCES
上的页面提供的信息很少。它是否位于文档中的其他位置?
此外,这个允许的源类型列表是否可以自定义和扩展,以及如何进行扩展?
编辑
例如,作为目标源提供的对象在tensorflow的CMake文件for example here中随处可见。
发布于 2018-07-14 05:34:52
支持的扩展集主要取决于ENABLED_LANGUAGES
。
因此,如果我为CMAKE__SOURCE_FILE_EXTENSIONS
执行grep,我将得到以下列表:
set(CMAKE_ASM${ASM_DIALECT}_SOURCE_FILE_EXTENSIONS "s;S;asm")
set(CMAKE_C_SOURCE_FILE_EXTENSIONS "c;m")
set(CMAKE_CSharp_SOURCE_FILE_EXTENSIONS "cs")
set(CMAKE_CUDA_SOURCE_FILE_EXTENSIONS "cu")
set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS "C;M;c++;cc;cpp;cxx;mm;CPP")
set(CMAKE_Fortran_SOURCE_FILE_EXTENSIONS "f;F;fpp;FPP;f77;F77;f90;F90;for;For;FOR;f95;F95")
set(CMAKE_Java_SOURCE_FILE_EXTENSIONS "java")
set(CMAKE_RC_SOURCE_FILE_EXTENSIONS "rc;RC")
set(CMAKE_Swift_SOURCE_FILE_EXTENSIONS "swift")
特殊情况下的
generator expressions有一些特殊的情况,比如add_library(... $ ...)
和add_custom_command()
调用的输出。
编辑:使用目标文件作为源文件实际上是在cmSourceFile::CheckExtension()
中实现的a sub-case of the add_custom_command()
special case
//查找目标文件。if (this->Extension == "obj“|| this->Extension == "o”|| this->Extension == "lo") { this->SetProperty("EXTERNAL_OBJECT","1");}
如何扩展支持的源文件扩展名/类型?
示例可以在这里找到
https://stackoverflow.com/questions/51310322
复制相似问题