CMake:可能的目标源类型是什么,可以扩展吗?

时间:2018-07-12 16:14:59

标签: c++ c cmake

在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中,到处都使用了作为目标源提供的对象。

1 个答案:

答案 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 casecmSourceFile::CheckExtension()实现了将目标文件用作源文件:

 // Look for object files.
 if (this->Extension == "obj" || this->Extension == "o" ||
     this->Extension == "lo") {
   this->SetProperty("EXTERNAL_OBJECT", "1");
 }

如何扩展受支持的源文件扩展名/类型?

可以在此处找到示例