2017-08-08 117 views
2

我想用Bazel来构建一个Linux内核模块。 我有包含该模块的逻辑来源:logic.c 我迄今所用的过程:用Bazel构建内核模块

  1. 编译“logic.c”到logic.o或logic.a
  2. 执行'modpost'工具来生成logic-modpost.c
  3. 将'modpost'工具'logic-modpost.c'的输出编译为'logic-modpost.o'或logic-modpost.a'
  4. 链接'ld -r'的所有内容

在我开始与Skylark进行这项工作之前,我在想知道是否有一个众所周知的配方,我不知道它是否可以共享。

我也注意到,CPP片段不公开的“LD”的工具,我想知道这是为什么?我知道我可以用-Xlinker或-Wl来使用'gcc',以达到几乎相同的效果,但能够访问ld会很好。

约翰 -

回答

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或者向getLdExecutable()添加一个@SkylarkCallable注释。