【问题标题】:Getting cmake to run before building after pulling from git从 git 拉取后让 cmake 在构建之前运行
【发布时间】:2013-07-23 20:05:49
【问题描述】:

这个项目保存在一个 git 存储库中,我们使用 cmake 和 ninja 构建它。 我们正在使用通配表达式/函数来收集所有要编译的源文件。这意味着每次添加/删除文件时,都必须调用 cmake 来重新解析目录。

我们已经看到,当有人在某人推送了一些新文件后,没有对任何 cmake 文件进行修改时,这会带来一些时间损失。我说最后一件事是因为对任何 cmake 文件的修改都会触发对 cmake 的调用(由 ninja),一切都会好起来的。

如何在拉取后重新开始构建项目之前/之后调用 cmake? (注意:cmake 的运行是否比必要的多一点无关紧要,只要不是总是这样)

我正在构建源代码,此外还使用了几个构建目录,例如我测试不同的编译器。

我正在探索一些解决方案。一个使用 git hooks 脚本,即 post-merge(但我怎么能保证我会检索到 source/CMakeLists.txt 的路径以 touch 它?我可以提交脚本以便它为每个人运行吗?这不是一个公共项目)。不知道有没有关系,我们主要是通过图形界面(TortoiseGit)使用git。

另一种可能的解决方案是在 cmake 中使用依赖于 .git\refs\heads 目录内容的自定义目标,但我想不出真正可行的组合......

一些链接:

  1. http://git-scm.com/book/en/Customizing-Git-Git-Hooks
  2. https://www.kernel.org/pub/software/scm/git/docs/githooks.html

CMake 命令:http://www.cmake.org/cmake/help/v2.8.11/cmake.html

【问题讨论】:

    标签: git cmake ninja


    【解决方案1】:

    post-merge 脚本文件放入.git/hooks 似乎可以解决问题:

    #!/bin/sh
    #
    
    touch source/CMakeLists.txt
    

    执行路径显然是项目的根目录,非常适合这种操作。我通过从项目的一个“随机”子文件夹中调用 TartoiseGit 上下文菜单中的“拉”来测试这一点。 Here are some instructions on how one could test the script.

    缺点:如果有人在他的编辑器中修改 CMakeLists.txt,并且有一些未保存的修改,如果太快回答“磁盘上的文件已更改...”提示,他可能会丢失一些工作


    然后,为了使这个脚本成为存储库的一部分,我发现以下解决方案似乎对我们的(非公开)项目有好处。

    1) 为 git hook 脚本创建一个文件夹(例如 zz_gitHookScripts)并放置每个人都应该使用的文件。将其添加到存储库。
    2)在 CMakeLists.txt 中添加这样的内容,以便在第一次运行 cmake 时将文件放在有效目录中(并且,鉴于上述情况,这将在我们拉动后第一次构建时发生,也是第一次时间,因为 CMakeLists.txt 通过此编辑被修改):

    file(GLOB HOOK_SCRIPTS zz_gitHookScripts/*)
    if (HOOK_SCRIPTS)
        file(COPY ${HOOK_SCRIPTS} DESTINATION ${CMAKE_SOURCE_DIR}/../.git/hooks) 
    endif (HOOK_SCRIPTS)
    

    如果是补丁,可以使用等效的post-applypatch 挂钩。

    缺点:

    • 在 stash 的情况下不会触发它(用户存储添加/删除文件的更改,必须仍然记得手动运行 cmake),或者在补丁的情况下
    • 用户无法个性化挂钩脚本
    • 删除一些我们不想再使用的钩子脚本可能很复杂
    • 通常所有分支都必须共享相同的钩子

    不管怎样,这样对我们的需求有好处。

    【讨论】:

    • 另一个缺点是特定于平台的吗? (怀疑这不适用于所有平台?)
    • @ideasman42 我想没关系。它在甚至没有触摸的 Windows 上进行了测试,可移植性完全掌握在 git 及其对 shell 脚本(以及触摸命令)的支持中。
    • 这会在所有 git 操作上运行吗? (存储、更改分支、应用补丁)
    • @ideasman42 它适用于更改分支。对于应用补丁,您必须添加一个额外的钩子。对于 stash 我必须测试,可能不是。但是 stash 是您在本地执行的操作,您可以学习每次 stash 时运行 cmake,就像每次添加文件时一样。这个钩子的重点是避免其他人添加/删除文件时出现问题。
    • 很好,您可以为自己的项目工作,但这似乎是一种相当不可靠的方法来解决 CMake 并非设计的问题,开发人员必须记住哪些操作导致 CMake 重新运行,有总是有机会在 git 之外应用补丁,或者新开发人员获取源代码并在存储后忘记触摸。或者......谁知道,有人可能想使用 libgit+MSVC......一个不同的环境,至少没有对 shell 脚本挂钩的相同支持。总之,您提出了一个有时有效的不可靠解决方案,作为列出文件的替代方案-每次都有效。
    猜你喜欢
    • 2016-10-18
    • 2011-07-20
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    相关资源
    最近更新 更多