1. ホーム
  2. cmake

[解決済み] CMakeでソースファイルを指定する場合、GLOBで指定するのと、1ファイルずつ指定するのと、どちらが良いですか?

2022-04-20 13:38:09

質問

CMakeでは、ターゲットのソースファイルを指定する方法がいくつか用意されています。 ひとつはグロビング( ドキュメント ) のようなものである。

FILE(GLOB MY_SRCS dir/*)

もう一つの方法は、各ファイルを個別に指定する方法です。

どのような方法が望ましいのでしょうか?Globbingは簡単そうですが、デメリットもあると聞いています。

どのように解決するのですか?

しかし、大規模で複数の開発者が参加するプロジェクトでは、ファイルを明示的にリストアップした方がミスが少ないことを、長年にわたって認識してきました。

オリジナルの回答です。


グロビングの利点は

  • 新しいファイルを追加するのが簡単です。 は一箇所にしか表示されません。 ディスクを使用します。グロブしないことで が重複している。

  • CMakeLists.txt ファイルは、以下のようになります。 より短くなります。これは、次のような場合に大きな利点となります。 があります。グロブしない CMakeのロジックを見失う のような巨大なファイルのリストが存在します。

ハードコードされたファイルリストを使用する利点は、次のとおりです。

  • CMake はディスク上の新しいファイルの依存関係を正しく追跡します。 グロブすると、CMake を実行したときに最初にグロブされなかったファイルは、グロブされなくなります。 拾い上げる

  • 必要なファイルだけが追加されるようにします。グロビングを行うと、不要なファイルを拾ってしまうことがあります。 を削除します。

最初の問題を回避するために、touch コマンドを使用するか、または何も変更せずにファイルを書き込むことによって、glob を実行する CMakeLists.txt に "touch" することができます。これにより、CMake は再実行し、新しいファイルをピックアップするようになります。

2番目の問題を解決するには、コードをディレクトリに注意深く整理すればよいのです。最悪の場合は list(REMOVE_ITEM) コマンドを使って、グロブドファイルのリストをクリーンアップしてください。

file(GLOB to_remove file_to_remove.cpp)
list(REMOVE_ITEM list ${to_remove})

これが問題になるのは、次のようなものを使っている場合だけです。 git-bisect を使用して、同じビルドディレクトリにある古いバージョンのコードを試してみてください。その場合、正しいファイルをリストに入れるために、必要以上にクリーンアップやコンパイルをしなければならないかもしれません。しかし、このようなケースは非常に稀であり、また、すでにあなたの足元にも及んでいるため、実際には問題とはなりません。