cmake中组件和命名空间的命名约定

时间:2018-01-30 14:52:07

标签: cmake naming-conventions

简而言之:

cmake库目标是否有任何首选命名约定 - 特别是在使用命名空间时?

注意:

除非确实存在客观原因,否则我不会询问个人偏好,而是询问是否存在官员" (例如,由kitware推荐)或建立(可能偏离)惯例。

详细信息:

假设我有一个库/框架foo,其中包含各个组件barbaz。到目前为止,我的命名约定如下:

add_library(foo-bar src1.cpp, scr2.cpp)
add_library(foo-baz src3.cpp, src4.cpp)

现在我想使用命名空间(::)约定添加别名目标。 E.g。

add_library(Foo::Bar ALIAS foo-bar)
add_library(Foo::Baz ALIAS foo-baz)

(当然问题还延伸到出口套装,但我并不想让问题复杂化)
然而,我无法真正发现的是,这些目标是否存在首选甚至官方命名约定。

我见过的事情:

  • 命名空间部分:
    • 有些项目似乎将第一个字母大写,有些则没有(前者似乎更常见)
  • 组件:
    • 在某些项目中,组件名称与二进制名称
    • 相同
    • 有或没有" lib"前缀(libfoo-bar vs foo-bar)
    • 有或没有命名空间(foo-bar vs bar)
    • 某些项目将首字母大写
    • 有些项目使用CamelCase一些snake_case,即使二进制文件或项目名称不遵循这些约定。

我想主要的问题是一般来说库没有命名约定,因此很难在CMake中提出命名约定,但至少对命名空间和组件的第一个字母进行了限制非常普遍,所以我想知道是否有一些我应该遵循的指导方针。

1 个答案:

答案 0 :(得分:2)

cmake-developer documentation对命名空间提供以下建议:

  

提供导入的目标时,这些目标应该是命名空间(因此Foo::前缀); CMake将认识到,传递给target_link_libraries()的名称中包含::的值应该是导入的目标(而不仅仅是库名),并且如果该目标不存在,将生成相应的诊断消息(请参阅政策CMP0028)。

CMP0028 policy documentation在使用命名空间的“常见模式”中说:

  

双冒号的使用是用于命名IMPORTED目标和ALIAS目标的常见模式。在计算目标的链接依赖关系时,每个依赖关系的名称可以是目标,也可以是磁盘上的文件。以前,如果找不到具有匹配名称的目标,则该名称被视为引用磁盘上的文件。如果应该是目标名称的拼写错误,这可能会导致混淆错误消息。

不,没有针对库目标命名的CMake特定约定。但由于该名称默认为目标的输出名称:

  • 我更喜欢为目标使用与源代码目录相同的名称
  • 并且不添加lib前缀,因为这是由CMake自动添加的,具体取决于您使用
  • 编译项​​目的平台

来自CMake教程

你可以获得的最官方来源可能是来自Kitware的Ken Martin和Bill Hoffman撰写的"Mastering CMake" book摘录。

tutorials from the book都使用CamelCase,没有名称空间用于组件/目标名称。

参考文献