Bazelにはライブラリ間の循環依存関係を処理するgcc - (archives - )や--start-group archives --end-group linkのような機能がありますか?BazelでC++ライブラリの循環依存を処理するには?
また、Bazelには、このgcc機能をBazelで使用できる機能がありますか?たとえば、CCFLAGSのようなものを使用していますか?
Bazelにはライブラリ間の循環依存関係を処理するgcc - (archives - )や--start-group archives --end-group linkのような機能がありますか?BazelでC++ライブラリの循環依存を処理するには?
また、Bazelには、このgcc機能をBazelで使用できる機能がありますか?たとえば、CCFLAGSのようなものを使用していますか?
まず、循環依存性を避ける方が良いと考えられます。
cc_library(
name="a",
srcs=["a.cc"],
hdrs=["a.h"],
deps=[":b"], # a.cC#includes b.h
)
cc_library(
name="b",
srcs=["b.cc"],
hdrs=["b.h"],
deps=[":a"], # b.cC#includes a.h
)
bazel
循環依存文句を言うだろう:
あなたはa.cc
の#include b.h
とb.cc
の#include a.h
は、2つのファイルを、持っていると仮定します。
問題のコードをすべて所有している場合、これらの循環依存関係を避けるためのより簡単な方法は、ソースコードとbazelパッケージを再シャッフルして最初の依存関係を避けることです。ここ
1つの戦略は、a
もb
どちらに依存して第三の「コア」ライブラリc
に共通のものをリファクタリングすることです:
cc_library(
name="a",
srcs=["a.cc"],
hdrs=["a.h"],
deps=[":c"], # a.cC#includes c.h
)
cc_library(
name="b",
srcs=["b.cc"],
hdrs=["b.h"],
deps=[":c"], # b.cC#includes c.h
)
cc_library(
name="c",
srcs=["c.cc"],
hdrs=["c.h"],
)
別の戦略をコピーするビルドステップのいくつかの種類を持っていることですa.h
とb.h
(それ自体は他のものに依存しない)いくつかの "public headers"フォルダに移動します。これにより、ファイルレベルの循環依存関係は削除されますが、意味的には、ソースコードの循環依存度は依然としてa
とb
の間にあります。
ライブラリを所有していない場合は、cc_import-kind-of-ruleが実装されるまで待つ必要があります。 issue #818も参照してください。私はその間の回避策を知らない。