2015-09-05 8 views
11

CMakeのドキュメントは、コマンドfile GLOBについてこう述べています。なぜcmakeファイルGLOB悪ですか?

私たちはあなたのソースツリーからソースファイルのリストを収集するためにGLOBを使用することはお勧めしません。ソースが追加または削除されたときにCMakeLists.txtファイルが変更されない場合、生成されたビルドシステムはいつCMakeに再生成を要求するかを知ることができません。

ウェブ内のいくつかのディスカッションスレッドは、ソースファイルのグロビングが悪いことを第2に示しています。ビルドシステムを作るためしかし

は、ソースが追加または削除されたことを知って、それが

touch CMakeLists.txt 

右を言うために十分なのか?

それでは、CMakeLists.txtを編集してソースファイル名を挿入または削除するのはそれほど労力がかかりません。また、覚えにくいこともありません。だから私はfile GLOBに対して助言する正当な理由は見当たらない。

この議論で何が問題になっていますか?

+1

[こちら](http://stackoverflow.com/questions/30949452/cmake-ninja-attempting-to-compile-deleted-cpp-file/31183245)の説明も参照してください。私の答えに記述されているように、私は 'CMakeLists.txt'ファイル内の全てのソースファイルを一覧表示します(別のビルド構成用のソースファイルを時々手作りするため)。 VSプロジェクトでそれらを持っている)。たとえば、次のような回避策を提案しました。 'configure_file($ {CMAKE_SOURCE_DIR}/.git/index $ {PROJECT_BINARY_DIR} /git_index.tmp)'のようなもので 'git'を実行します。 – Florian

答えて

11

問題は、あなたが単独でプロジェクトに取り組んでいないときです。

のプロジェクトは、開発者AとB

Aは、新しいソースファイルx.cを追加しました。言ってみましょう彼はCMakeLists.txtを変更せず、x.cの実装が完了した後にコミットします。

今、Bはgit pullを行い、そしてCMakeLists.txtへの変更がなかったことから、CMakeのは再実行されていないと、コンパイル時にx.cは、そのソースファイルのリストに追加されていないため、Bは、リンカのエラーを持っています。

+0

良い点、ありがとう。私がこの答えを受け入れる前に(そして恐らく回避策について考え始める)、もう少し問題が生じているかどうか待ってください。 –

+0

確かに、これは非常に未解決の問題であり、複数の人がグロブに関連して分かち合う経験を持っていると思います。私は悲しいかなか回避策がわからないので、私は幾分大きなプロジェクト(> 500個のソースファイル)を持っていました。他の開発者は、 CIサーバーを破壊する。 –

+1

@ Jean-MichaëlCelerierの回避策#1:gake pull(真剣に)の後でcmakeを実行する、回避策#2: 'CMakeLists'で、globbingの結果をファイルに書き込みます(条件付きで存在しない場合)ソース管理下で'CMakeLists'にそのファイルをインクルードします。新しいファイルを追加するときは、globresultファイルを削除してください。 –

4

本質的に悪ではありません - それは有利なや短所があり、比較的よくカバーされていますthis answerここStackOverflowで。しかし、それを不用意に使用すると、依存関係の変更を無視し、コードベースの大部分のクリーンな再構築が必要になる可能性があります。

ビルドファイルにすべてのファイルを手動で入力する必要がないように、小さなプロジェクトや大きなサブディレクトリで個人的に使用しています。 編集:私の好みは変更されており、現在はそれを避ける傾向があります。

+1

場合によっては唯一のレスキューとしてクリーンビルドを行わなければならない微妙なケースがたくさんあります。私は大規模なプロジェクトには適していないと思っています – Fei

+0

@フェイ:これはあなたがビルドしているものによって異なります。大規模なプロジェクトでは、それが理にかなっているが、プロジェクト全体ではない小さな部分のためのグロブがあるかもしれません。 – einpoklum

関連する問題