Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bazel build with OpenCV 3.3 dependencies

Tags:

c++

opencv

bazel

I'm trying to use Bazel to compile and distribute an OpenCV based C++ code and I'm facing an issue I can't resolve.

I build and install OpenCV 3.3 from sources, on an Ubuntu 16.04 LTS, with CUDA support (CUDA 8). I install it in the standard directory /usr/local.

Given it, I created my project with this WORKSPACE file :

new_local_repository(
    name = "opencv",
    path = "/usr/local",
    build_file = "opencv.BUILD",
)

The opencv.BUILD contains :

cc_library(
    name = "opencv",
    srcs = glob(["lib/*.so*"]),
    hdrs = glob(["include/**/*.hpp"]),
    includes = ["include"],
    visibility = ["//visibility:public"], 
    linkstatic = 1,
)

And I can use it in my own code using :

cc_binary(
    name = "main",
    srcs = ["main.cc"],
    deps = [
        "@opencv//:opencv"
    ],
)

but some source files in OpenCV, as :

/usr/local/include/opencv2/flann/flann_base.hpp

includes headers file from the same directory, like :

#include "general.h"

And when I build with Bazel, I get this error :

ERROR: /home/damien/main/BUILD:1:1: C++ compilation of rule '//main:main' failed (Exit 1)
In file included from external/opencv/include/opencv2/flann.hpp:48:0,
                 from external/opencv/include/opencv2/opencv.hpp:62,
                 from main/main.cc:1:
external/opencv/include/opencv2/flann/flann_base.hpp:38:21: fatal error: general.h: No such file or directory

(general.h is in the same directory as flann_base.hpp).

If I rewrite the #include directive as :

#include "opencv2/flann/general.h"

It compiles well. But this is not a convenient solution.

So my question is : is there a way to tell Bazel to look for headers in the same directory as the "current" file in this library ? I look upon every C++ directives of Bazel, but I don't see anything to achieve it.

Thank you in advance.

like image 965
Damien Picard Avatar asked Oct 06 '17 19:10

Damien Picard


1 Answers

Ok, shame on me. I have to import *.h :

cc_library(
    name = "opencv",
    srcs = glob(["lib/*.so*"]),
    hdrs = glob(["include/**/*.hpp", "include/**/*.h"]),
    includes = ["include"],
    visibility = ["//visibility:public"], 
    linkstatic = 1,
)
like image 73
Damien Picard Avatar answered Oct 25 '22 07:10

Damien Picard