使用Bazel构建内核模块

3
我想使用Bazel来构建Linux内核模块。我有包含模块逻辑的源文件:logic.c。到目前为止我使用的步骤如下:
  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”工具,我在想这是为什么?我知道我可以使用“gcc”和“-Xlinker”或“-Wl”来实现几乎相同的效果,但如果能够访问“ld”会更好。-- John
1个回答

3
据我所知,目前还没有现成的方法。不过如果你可以使用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,只是这还没有发生。你可以提交一个bug或者做一个pull request,在getLdExecutable()中添加一个@SkylarkCallable注解。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接