使用Bazel构建内核模块

时间:2017-08-08 05:57:02

标签: c linux linux-kernel bazel

我想用Bazel构建一个Linux内核模块。 我有包含模块逻辑的源:logic.c 到目前为止我使用的过程:

  1. 编译' logic.c'到logic.o或logic.a
  2. 执行' modpost'生成logic-modpost.c的工具。
  3. 编译' modpost'的输出。工具' logic-modpost.c' to' logic-modpost.o'或logic-modpost.a'
  4. 将所有内容与' ld -r'
  5. 联系起来

    在我开始与Skylark合作之前,我想知道是否有一个众所周知的食谱我不知道以及是否可以分享。

    我还注意到 cpp片段没有公开' ld'工具,我想知道为什么会这样?我知道我可以使用' gcc'使用-Xlinker或-Wl来实现几乎相同,但访问ld会很不错。

    - 约翰

1 个答案:

答案 0 :(得分:2)

AFAIK,没有现有食谱。但是,如果您可以使用g++(而不是ld直接)链接所有内容,则可以将其作为宏执行:

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) $@" % 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 $@" % name,
      outs = ["%s.so" % name],
 )

如果你想/需要使用Skylark,我认为没有任何理由我们无法公开ld,它还没有发生。您可以file a bug或发送拉取请求,向getLdExecutable()添加@SkylarkCallable注释。