我目前正在使用第三方库,该库具有使用尖括号声明的标头,如标准库:
#include <header.h>
但是,这些标头安装在非标准位置,例如/opt/company/software/version/part_software/include
使用像MAKE这样更传统的构建器,我可以使用CXXFLAGS来指示g ++在这个文件夹中查找库,最后归结为将-I/opt/company/software/version/part_software/include
选项传递给g ++。
当试图在bazel中做同样的事情时,使用copts = [ "-I/opt/company/software/version/part_software/include" ]
,我会得到一个&#34; path outside of the execution root
&#34;错误。
我的理解是,bazel不喜欢安装lib的地方,因为构建需要可重现,并且包括位于执行根之外的库违反了这个约束。
我带来的一个丑陋的黑客是在/usr/local/include
中创建标题的符号链接,并在bazel构建中使用copts = [ "-I/usr/local/include" ]
。但是,我发现这种方法非常糟糕,而且我想找到一个更加轻松的方法解决问题。
注意:我无法在bazel构建期间安装程序,因为它使用的是我无法控制的已关闭的安装程序。此安装程序无法在bazel的沙盒环境中运行,因为它需要在环境中无法访问的某些路径上进行写入。
答案 0 :(得分:2)
因此,事实证明,包含第三方库的 bazelesque 方式只是创建封装库的包。
感谢这个有用的discussion,我设法用我的第三方库创建了一个包。
首先我们需要一个BUILD文件,这里名为package_name.BUILD
package(
default_visibility = ["//visibility:public"]
)
cc_library(
name = "third_party_lib_name", #name to reference the third party library in other BUILD files
srcs = [
"external/soft/lib/some_lib.so", #.so files to include in the lib
"software/lib/os/arch/lib_some_plugin.so",
],
hdrs = glob([ # the glob takes all the headers needed
"software/include/**/*.h",
"software/include/**/*.hpp",
]),
includes = ["software/include/"], # Specify which files are included when we use the library
)
现在我们需要在libSP文件中引用一个子模块:
new_local_repository(
name = "package_name",
path = "opt/company/software/version",
# build_file: path to the BUILD file, here in the same directory that the main WORKSPACE one
build_file = __workspace_dir__ + "/package_name.BUILD",
)
现在,我不是使用copt
来引用所需的标题,而是在需要时向cc_rule
的deps添加一行,例如:
cc_library(
name="some_internal_lib",
srcs = ["some_internal_lib.cc"],
deps = [
"@package_name//:third_party_lib_name", #referencing the third party lib
],
)