从git中提取后,让cmake在构建之前运行

时间:2013-07-24 11:19:10

标签: git cmake ninja

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

我们已经看到,当有人推出一些新文件而没有修改任何cmake文件时,有人会拉扯一些时间。我说最后一件事是因为对任何cmake文件的修改都会触发对cmake的调用(通过ninja),一切都会好的。

我怎样才能获得在拉动之后/当我再次开始构建项目时调用cmake? (注意:如果cmake的运行时间超过必要的数量并不重要,只要它并非总是如此)

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

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

另一种可能的解决方案是在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
  3. CMake命令:http://www.cmake.org/cmake/help/v2.8.11/cmake.html

1 个答案:

答案 0 :(得分:0)

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

#!/bin/sh
#

touch source/CMakeLists.txt

执行路径显然是项目的根目录,非常适合这种操作。我通过从项目的一个“随机”子文件夹中调用TartoiseGit上下文菜单中的“pull”来测试它。 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挂钩。

<强>缺点:

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

无论如何,这样对我们的需求有好处。