如何从Git中排除CMake生成的项目文件

bvn4nwqk  于 2023-06-20  发布在  Git
关注(0)|答案(2)|浏览(282)

我有一个CMake项目,我想从版本控制中排除生成的项目文件。
据我所知,没有办法强制CMake使用某个构建目录。用户可以指定他们想要的任何目录,因此我不能在我的. gitignore中排除它。通常用户会将它放在源目录中名为build的目录中,我会将其放在. gitignore中。但是我有一个疯狂的想法,把它叫做meta_build,这导致了我的这个问题。此外,没有经验的用户可能会进行源代码内构建。有人不小心签入生成的项目文件只是时间问题。
任何想法或变通办法,这件事是非常赞赏。

tjjdgumg

tjjdgumg1#

有几个选项可以处理此问题:
教育你的用户。清楚地记录不应提交生成的构建文件,并且建议使用源代码外的构建。这不是一个技术解决方案,但可能是有效的。
使用pre-commit钩子来检查生成的文件。您可以编写一个脚本在预提交时运行,以检查常见的构建文件名并警告用户。他们仍然需要手动删除文件,但它会提醒他们这个问题。
使用CMake的EXCLUDE_FROM_ALL目标属性。您可以将生成构建文件的目标标记为EXCLUDE_FROM_ALL,这意味着默认情况下不会构建该目标。用户必须显式地构建该目标以生成构建文件。这使得它们不太可能被意外地提交。
在子目录中生成构建文件。让顶级CMakeLists.txt在build_files子目录中生成构建文件。然后可以将build_files/添加到. gitignore。用户必须从build_files中运行CMake来进行源代码内构建,这清楚地表明应该忽略该目录。
考虑根本不生成项目文件。如果您构建并发布了一个二进制库,您可以只提供一个CMakeLists.txt供人们链接到该库。不会生成可能意外提交的项目文件。当然,如果您需要项目文件来实际构建项目,那么这就不起作用了!

pqwbnv8z

pqwbnv8z2#

我假设这对您来说是一个问题,因为其他用户正在项目上进行协作,并且可能会推送到共享远程。在这种情况下,您可以选择:

  • 设置一个约定,只生成到具有公共名称的子目录。例如,PitchFork布局的build/。我个人将我所有的构建放在一个out/build/<build_name>目录中。然后你可以只gitignore一个目录。
  • 允许你的合作用户将构建放在他们本地克隆的任何地方,为了避免gitignore的任意爆炸,告诉他们使用他们的$XDG_CONFIG_HOME/git/ignore,或者本地克隆的$GIT_DIR/info/exclude(docs)。
  • 您可以使用预设提示用户使用特定的构建目录名称:https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html(有关配置预设,请参阅binaryDir属性)。
  • 从技术上讲,你可以在文件名的基础上编写gitignore,而不依赖于构建目录的位置(例如:单独列出*.exe等),但这听起来像是一个真实的的痛苦-特别是考虑到不同的buildsystem生成器将具有不同的构建工件和特定的buildsystem配置文件,并且不同的平台具有不同的目标输出文件名的前缀和后缀(例如,请参见CMAKE_EXECUTABLE_SUFFIX)。

相关问题