2017-08-08 24 views
2

LinuxカーネルモジュールをビルドするためにBazelを使いたいと思います。 logic.c 私はこれまで使用されたプロセス:Bazelでカーネルモジュールを構築する

  1. が実行logic.oまたはlogic.aに「logic.c」をコンパイル Iは、モジュールのロジックを含むソースが「modpost」ツール「は論理modpost.o」または論理modpost.a」
  2. リンクに「modpost」ツール「論理modpost.c」の出力をコンパイルロジックmodpost.c
  3. を生成しますすべて一緒に「ld -r」

Skylarkでこの作業を始める前に、知らないレシピがあるかどうか、それを共有できるかどうか疑問に思っていました。

また、のcppフラグメントに「ld」ツールが公開されていないことに気付きましたが、私はなぜそれが不思議でしたか?私は、ほぼ同じことを達成するために、-Xlinkerまたは-Wlで 'gcc'を使うことができることを知っていますが、ldにアクセスするのはうれしいでしょう。

- John

答えて

2

AFAIK、既存のレシピはありません。しかし、あなたは(直接の代わりに、ldg++ですべてをリンクすることができれば、次のようなマクロとしてこれを行うことができます:

def mod(name, srcs, deps): 
    cc_library(
     name = "%s-1" % name, 
     srcs = srcs, 
     deps = deps, 
) 
    genrule(
     name = "%s-modpost" % name, 
     srcs = ["%s-1.so" % name], 
     tools = ["//path/to:modpost"], 
     cmd = "$(location //path/to:modpost) $(location :%s-1.so) [email protected]" % name, 
     outs = ["%s-modpost.c"], 
) 
cc_library(
     name = "%s-2" % name, 
     srcs = [":%s-modpost.c" % name], 
     deps = deps, 
) 
genrule(
     name = "%s" % name, 
     srcs = ["%s-2.a" % name], 
     cmd = "$(CC) $(CCFLAGS) -Wlr $(location :%s-2.a) -o [email protected]" % name, 
     outs = ["%s.so" % name], 
) 

は、必要に応じて/、私はいかなる理由がないと思うすかいらーくを使用する必要が我々 ldを公開することはできませんが、それはまだ起こっていません。 file a bugにするか、@SkylarkCallable注釈をgetLdExecutable()に追加するプルリクエストを行います。

関連する問題