在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中,到处都使用了作为目标源提供的对象。
答案 0 :(得分:1)
受支持的扩展名集主要取决于ENABLED_LANGUAGES
。
因此,如果我为CMAKE_<LANG>_SOURCE_FILE_EXTENSIONS
做准备,我将得到以下列表:
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(... $<TARGET_OBJECTS:objlib> ...)
和add_custom_command()
调用的输出。
编辑:实际上,在a sub-case of the add_custom_command()
special case中cmSourceFile::CheckExtension()
实现了将目标文件用作源文件:
// Look for object files. if (this->Extension == "obj" || this->Extension == "o" || this->Extension == "lo") { this->SetProperty("EXTERNAL_OBJECT", "1"); }
如何扩展受支持的源文件扩展名/类型?
可以在此处找到示例