为什么cmake文件GLOB邪恶?

Joa*_*m W 26 glob cmake

CMake文档说明命令文件GLOB:

我们不建议使用GLOB从源树中收集源文件列表.如果在添加或删除源时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时请求CMake重新生成.

网络中的几个讨论线程第二个是通配源文件是邪恶的.

但是,为了使构建系统知道已添加或删除了一个源,这就足够了

touch CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

对?

然后,这比编辑CMakeLists.txt插入或删除源文件名更省力.也难以记住.所以我认为没有任何充分理由提出反对意见file GLOB.

这个论点有什么问题?

Jea*_*ier 25

问题是当你不是一个人在一个项目上工作时.

假设项目有开发人员A和B.

A添加新的源文件x.c.CMakeLists.txt在他完成实施后,他没有改变和承诺x.c.

现在B执行a git pull,并且由于没有对其进行任何修改,因此CMakeLists.txtCMake不会再次运行,并且B在编译时会导致链接器错误,因为x.c尚未将其添加到其源文件列表中.

  • @ Jean-MichaëlCelerier解决方法#1:在git pull(严重)之后运行cmake,解决方法#2:在`CMakeLists`中,将globbing的结果写入文件(有条件地,如果它不存在)并将其置于源控制.使`CMakeLists`包含该文件.在添加新文件时,删除globresult文件. (3认同)
  • 我不同意这些变通方法:第一种方法是对添加文件的人以外的人进行工作(根据经验,这不适用于 3 人以上)。第二个给开发人员增加了更多的精神开销(在我的 CMakeLists 中添加文件和记住创建/删除文件...)。 (3认同)
  • @ Jean-MichaëlCelerier:嗯,这是免费的午餐.我认为sw devs是聪明人,可以信赖记住#1或做精神飞跃#2.但当然,选择应取决于项目,观众和品味.每个替代方案(包括`CMakeList`的手动编辑)都有其缺点. (2认同)
  • @Uri:不,因为通配符本身的概念不能移植到 CMake 支持的所有构建类型 - 例如,它在 Visual Studio 解决方案或 XCode 项目中如何工作? (2认同)

ein*_*ica 7

本质上并不是邪恶的 - 它有优点和缺点,在 StackOverflow 上的这个答案中相对较好地涵盖了。但是,如果您不小心使用它,最终可能会忽略依赖项更改并需要对大部分代码库进行干净的重建。

我个人赞成使用它 - 在较小的项目中,或在较大的项目中的某些子目录中 - 以避免必须手动将每个文件输入到构建文件中。编辑:我的偏好已经改变,我目前倾向于避免它。


Alb*_*iro 5

除了这里其他人发布的原因之外,恕我直言,glob 最糟糕的问题是它可以在不同平台上产生不同的文件列表。在我看来,这是一个错误。在 OSX glob 中忽略区分大小写,而在 ubuntu 框中则不区分大小写。

  • 这听起来令人担忧 - 您能否在 CMake 开发人员邮件列表中提出它? (2认同)
  • 我听从了你的建议并尝试打开问题,但是,我发现三年前就有人这样做了:-) https://gitlab.kitware.com/cmake/cmake/issues/15941 (2认同)