5

新しいプロジェクトを開始していて、ビルド システムを選択する必要があります。すべての C++ ソース ファイルを自分のビルド ルールに手動で追加する必要はありません。これは 2016 年までに自動化する必要があり、リファクタリング (ヘッダー内のクラスの名前変更、ソース ファイル、およびビルド システム ファイル...)。

この投稿に出くわしたとき、再帰的なファイル グロビングで CMake を使い始めていました: GLOB でソース ファイルをグローバルに指定しますか?

これは、CMake がビルドに 2 つのフェーズ (cmake と make) を使用し、通常の使用ではユーザーが 2 番目のフェーズ (make) のみを再実行するため、グロビングが悪であることを示唆しています。

一見すると、Bazel はファイルのグロビングも可能にします。Bazelと一緒に使うのは悪いことですか?コード ベース上で実行findすることは、ビルド システムが実際に回避する必要があるようなスケーリングの問題ですか?

4

2 に答える 2

7

Bazel には、その投稿で言及されている問題はありません。

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

Bazel は、グロブの一致から何かが追加、削除、または変更されたかどうかを常に認識し、それに応じて再構築します。Bazel を使用すると、グロビングによって古い結果が得られることはありません。

ビルド エンサイクロペディアに、グロブに関するいくつかの警告と制限事項がリストされているため、グロブを使用する前にそれを読む必要があります。

また、bazel クエリを使用して何がグロブ化されているかを確認できます。

bazel query '//path/to/your:target' --output=build
# /Users/kchodorow/gitroot/path/to/your/BUILD:7:1
java_library(
    name = "target",
    srcs = ["//path/to/your:A.java", "//path/to/your:B.java"],
)

これにより、「評価された」グロブが出力されるため、遊んで、Bazel が入力を追跡する方法を確認できます。

于 2016-06-29T00:59:54.437 に答える
3

Bazel で glob を使用することを確認する必要があります。大きな glob の分析フェーズが長くなる可能性がありますが、 --watchfs フラグを使用すると、すべてのファイルを記述するのではなく、ファイル システム イベントを監視してファイル システムの変更が追跡されるため、インクリメンタル ビルドが行われます。本当に速いはずです。

于 2016-06-28T08:29:58.447 に答える