CMake:啥是可能的目标源类型,它们可以扩展吗?

Posted

技术标签:

【中文标题】CMake:啥是可能的目标源类型,它们可以扩展吗?【英文标题】:CMake: what are possible target source types and can they be extended?CMake:什么是可能的目标源类型,它们可以扩展吗? 【发布时间】:2018-07-12 16:14:58 【问题描述】:

在 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。

【问题讨论】:

我认为它是硬编码的:github.com/Kitware/CMake/blob/master/Source/… 至于我可以在文档中找到的内容:请参阅源文件上的 LANGUAGE 属性 相关:***.com/q/24534384/1896169 @贾斯汀谢谢!但是为什么.obj 不在正则表达式中?不过肯定会处理的。这可能并不能涵盖整个故事。 【参考方案1】:

支持的扩展集主要取决于ENABLED_LANGUAGES

所以如果我用 grep 搜索 CMAKE_&lt;LANG&gt;_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(... $&lt;TARGET_OBJECTS:objlib&gt; ...)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");
 

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

可以在这里找到示例

How to add in a CMake project a global file extension (*.pde) to GCC which is treated like C++ code Generic rule from makefile to cmake

【讨论】:

是的,您确实可以指定一个对象作为源。我在我的问题中添加了一个示例。 @user209974 好的,我在 CMake 中找到了执行此操作的代码部分并更新了我的答案。但这似乎非常无证,或者至少我在官方文档中找不到这方面的提示。

以上是关于CMake:啥是可能的目标源类型,它们可以扩展吗?的主要内容,如果未能解决你的问题,请参考以下文章

简述啥是源语言,目标语言,中间语言

FindJUCE.cmake:无法为导入的目标“juce_core”指定源

有可能不在cmake中生成ALL_BUILD项目吗?

Kinesis Firehose - 啥是 S3 扩展目标配置?

CMake 对测试源的处理方式不同吗?

使用 Cmake,如何防止库源包含在我的 IDE 中?