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_<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");
如何扩展支持的源文件扩展名/类型?
可以在这里找到示例
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”指定源