Bazel的repository_rule
一直使用Bazel内建的repository (git_repository, http_archive, etc),但实际上bazel提供了自定义的repository_rule给我们自定义repository的rule,以提高我们定义库的方式。
一个例子
假如在一个远端git上有一个c++的库A,它是一个预编译过的库。也就是说它包含一个lib目录,里面有.a和.so文件,但是在这个库A的BUILD文件里,它是这么写的:
cc_library(
name = "module_a",
hdrs = glob(["include/*.h"]),
srcs = glob(["lib/*.a"]),
)
很显然,这个库只提供了静态库,并不提供动态库。
突然有一天由于某些特殊原因,我们需要使用这个库里的so,而不是.a,我们会怎么做?
最直接的思路就是在库A里增加一个cc_library的rule “libmodule_a”,这个rule的srcs里只包含.so。然后把我们自己库里的所有依赖都改个遍,把依赖@A//:module_a 都换成@A//:libmodule_a。
但是非常不幸,对于库A我们没有修改权限,并且对于本地编译来说,我们既要提供依赖.a的编译方式,也需要提供.so的编译方式。
怎么办?可能另一个思路是,对于库A我们使用new_git_repository的rule,然后对其指定我们本地的有动态库rule的BUILD文