2017-07-27 8 views
1

Bazelにはライブラリ間の循環依存関係を処理するgcc - (archives - )や--start-group archives --end-group linkのような機能がありますか?BazelでC++ライブラリの循環依存を処理するには?

また、Bazelには、このgcc機能をBazelで使用できる機能がありますか?たとえば、CCFLAGSのようなものを使用していますか?

答えて

1

まず、循環依存性を避ける方が良いと考えられます。

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.hb.ccの#include a.hは、2つのファイルを、持っていると仮定します。

問題のコードをすべて所有している場合、これらの循環依存関係を避けるためのより簡単な方法は、ソースコードとbazelパッケージを再シャッフルして最初の依存関係を避けることです。ここ

1つの戦略は、abどちらに依存して第三の「コア」ライブラリ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.hb.h(それ自体は他のものに依存しない)いくつかの "public headers"フォルダに移動します。これにより、ファイルレベルの循環依存関係は削除されますが、意味的には、ソースコードの循環依存度は依然としてabの間にあります。

0

ライブラリを所有していない場合は、cc_import-kind-of-ruleが実装されるまで待つ必要があります。 issue #818も参照してください。私はその間の回避策を知らない。