2

このプロジェクトは、cmake と ninja で構築した git リポジトリに保持されています。グロビング式/関数を使用して、コンパイルするすべてのソース ファイルを収集しています。つまり、ファイルが追加/削除されるたびに、ディレクトリを再解析するために cmake を呼び出す必要があります。

cmake ファイルを変更せずに、誰かが新しいファイルをプッシュした後に誰かがプルすると、時間のロスが発生することがわかっています。cmake ファイルのいずれかを変更すると、(ninja による) cmake の呼び出しがトリガーされ、すべてが正常になるため、これを最後に言います。

プル後にプロジェクトのビルドを再開する前/実行時に cmake が呼び出されるようにするにはどうすればよいですか? (注: cmake が必要以上に実行されても、常にそうでない限り問題ありません)

ソースからビルドしています。さらに、たとえばさまざまなコンパイラをテストするいくつかのビルド ディレクトリを使用しています。

私はいくつかの解決策を模索しています。git hooks スクリプト、つまり post-merge を使用するもの (ただし、source/CMakeLists.txt へのパスを取得してそれに触れることをどのように保証できますか?スクリプトをコミットして、すべての人に実行されるようにすることはできますか?これは公開プロジェクトではありません) . 関連性があるかどうかはわかりませんが、主にグラフィック インターフェイス (TortoiseGit) を介して git を使用しています。

他の可能な解決策は、.git\refs\heads ディレクトリの内容に依存するカスタム ターゲットを cmake で使用することですが、実際に機能する組み合わせは考えられません...

いくつかのリンク:

  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

4

1 に答える 1

1

スクリプトpost-mergeファイルを.git/hooks入れるとうまくいくようです:

#!/bin/sh
#

touch source/CMakeLists.txt

実行パスは明らかにプロジェクトのルート ディレクトリであり、この種の操作に最適です。プロジェクトの 1 つの「ランダム」サブフォルダーから TartoiseGit コンテキスト メニューで「pull」を呼び出して、これをテストしました。以下は、スクリプトをテストする方法についての説明です。

欠点: 誰かがエディターで CMakeLists.txt を変更していて、いくつかの変更が保存されていない場合、「ディスク上のファイルが変更されました...」というプロンプトへの応答が速すぎると、作業が失われる可能性があります。


次に、このスクリプトをリポジトリの一部にするために、(非公開の) プロジェクトに適していると思われる次のソリューションを見つけました。

1) git フック スクリプト用のフォルダー (例: 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 の場合(ファイルを追加/削除する変更を stash しているユーザーは、手動で cmake を実行することを覚えておく必要があります)、またはパッチの場合にはトリガーされません。
  • ユーザーはフック スクリプトをパーソナライズできません
  • もう使用したくないフックスクリプトを削除するのは複雑かもしれません
  • 一般に、すべてのブランチは同じフックを共有する必要があります

とにかく、このように私たちのニーズには合っています。

于 2013-07-24T15:49:01.013 に答える