这个项目保存在git存储库中,我们使用cmake和ninja构建。 我们使用globbing表达式/函数来收集要编译的所有源文件。这意味着每次添加/删除文件时,都必须调用cmake来重新解析目录。
我们已经看到,当有人推出一些新文件而没有修改任何cmake文件时,有人会拉扯一些时间。我说最后一件事是因为对任何cmake文件的修改都会触发对cmake的调用(通过ninja),一切都会好的。
我怎样才能获得在拉动之后/当我再次开始构建项目时调用cmake? (注意:如果cmake的运行时间超过必要的数量并不重要,只要它并非总是如此)
我正在构建源代码,此外还使用了几个构建目录,例如我测试了不同的编译器。
我正在探索一些解决方案。一个使用git hooks脚本,即合并后(但我怎么能保证我将检索source / CMakeLists.txt的路径到 touch 呢?我可以提交脚本以便为每个人运行吗?它不是一个公共项目)。我不知道它是否相关,我们主要使用git通过图形界面(TortoiseGit)。
另一种可能的解决方案是在cmake中使用依赖于.git \ refs \ heads目录内容的自定义目标,但我想不出一个真正可行的组合......
一些链接:
答案 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
挂钩。
<强>缺点:强>
无论如何,这样对我们的需求有好处。