Bazellocalrepository)
前面的例子都是在同一个repository里面折腾,现在是时候出去透透气了。外面已经有了那么多优秀的开源项目,千万不要重复造轮子,再说咱也造不过来呀。
将外部项目作为依赖引入是必需的。这些项目有些是Bazel项目,里面有WORKSPACE,有BUILD,定义了若干targets。但也有些并不是Bazel项目。对于前者,按照这些项目的存放地点不同,分为localrepository,gitrepository,httparchive。对于后者,指定它们只需要加一个new的前缀,即newlocalrepository,newgitrepository,newhttparchive。
我们先介绍第一个,localrepository,即本地文件系统中的Bazel项目。
这回我们需要创建两个repository,helloworldlib实现功能函数,helloworldmain调用函数。
helloworldlib目录结构如下
为了不让目录太过琐碎,我直接在repository的根目录放置了一个BUILD,使其成为一个package。BUILD内容如下load(rulescccc:defs。bzl,cclibrary)cclibrary(namehelloworldlib,srcs〔srchelloworld。cc〕,hdrs〔includehelloworld。h〕,visibility〔visibility:public〕,)
includehelloworld。hpragmaonceincludestringstd::stringhelloworld();
srchelloworld。ccincludeincludehelloworld。hstd::stringhelloworld(){returnHello,world!;}
下面开始做第二个repository,helloworldmain,这次有点新东西,那个一直为空的WORKSPACE这回要派上用场了。它的主要用途就是将项目中用到的外部依赖引入进来,提供给相应的targets使用。
WORKSPACE内容如下localrepository(namehelloworldlib,path。。helloworldlib,)
localrepository告诉Bazel我要引入一个外部Bazel项目,我给它起个名字叫helloworldlib,它位于本机文件系统,在上层目录的helloworldlib目录中(也可以使用pathtoreponame这样的绝对路径)。
srcBUILDload(rulescccc:defs。bzl,ccbinary)ccbinary(namehelloworldmain,srcs〔helloworldmain。cc〕,deps〔helloworldlib:helloworldlib,〕,)
这回deps中的label使用了完整的形式,之前是repository名,后面是target路径。由于我们之前把package直接定义在了根目录,所以这里没有package目录名。
srchelloworldmain。ccincludeincludehelloworld。hincludeiostreamintmain(){std::couthelloworld()std::endl;return0;}
注意include的路径,是从repository的根目录开始的。
编译运行,成功!
源码获取:gitgithub。com:zhouxindongbazellearning。git