【问题标题】: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

【问题讨论】:

标签: c++ c cmake


【解决方案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 casecmSourceFile::CheckExtension()中实现的:

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

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

可以在这里找到示例

【讨论】:

  • 是的,您确实可以指定一个对象作为源。我在我的问题中添加了一个示例。
  • @user209974 好的,我在 CMake 中找到了执行此操作的代码部分并更新了我的答案。但这似乎非常无证,或者至少我在官方文档中找不到这方面的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2016-03-07
  • 2017-10-31
  • 2022-12-03
相关资源
最近更新 更多