包含安装在非标准位置

时间:2018-04-20 08:56:27

标签: c++11 bazel

我目前正在使用第三方库,该库具有使用尖括号声明的标头,如标准库:

#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的沙盒环境中运行,因为它需要在环境中无法访问的某些路径上进行写入。

1 个答案:

答案 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
           ],
)