Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

set PKG_CONFIG_PATH in cmake

I have built opencv locally and installed it to a local directory (not the system default ). opencv.pc is present under a folder pkgconfig in this local folder. How can I find this opencv.pc from cmake, because I want to link and include opencv files from my program.

pkg_search_module(<PREFIX> [REQUIRED] [QUIET] <MODULE> [<MODULE>]*)

does not have any parameter in which I can force the command to use a specific path (similar to HINTS with find_package()) and not the system default.

So basically .cmake works:

find_package(OpenCV REQUIRED HINTS "my/path/to/share/OpenCVConfig.cmake") 

but I would like to use a opencv.pc located under my/path/to/pkgconfig/opencv.pc.

like image 980
infoclogged Avatar asked Jun 11 '17 18:06

infoclogged


People also ask

Does CMake use pkg-config?

CMake can generate pkg-config . pc files for packages. The . pc file can be used by many build systems.

What is Pkg_config_path?

PKG_CONFIG_PATH is a environment variable that specifies additional paths in which pkg-config will search for its . pc files. This variable is used to augment pkg-config's default search path. On a typical Unix system, it will search in the directories /usr/lib/pkgconfig and /usr/share/pkgconfig .

What is Pkg_check_modules?

pkg_check_modules. Checks for all the given modules, setting a variety of result variables in the calling scope.

What is Pkgconfig in Linux?

pkg-config is a helper tool used when compiling applications and libraries. It helps you insert the correct compiler options on the command line so an application can use gcc -o test test. c `pkg-config --libs --cflags glib-2.0` for instance, rather than hard-coding values on where to find glib (or other libraries).


2 Answers

After doing some research and a hint from the @OlivierM, I found the answer.

Here are the steps:

Method I :

CMAKE_PREFIX_PATH can be set to find the .pc files

set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/libs/opencv-install")

Method II A second method is to use the PKG_CONFIG_PATH, which is a system environment variable to look for .pc files.

set(ENV{PKG_CONFIG_PATH} "${CMAKE_SOURCE_DIR}/libs/opencv-install/lib/pkgconfig")

Irrespective of which method you use,

For old (traditional) CMake:

find_package(PkgConfig REQUIRED)
pkg_search_module(PKG_OPENCV REQUIRED opencv)  # this looks for opencv.pc file

Please note that the PKG_OPENCV variable can be named anything. Whatever it is is named, its used as a prefix. For example if you name ABCD, then include directories will be ABCD_INCLUDE_DIRS

The variable PKG_OPENCV_INCLUDE_DIRS and PKG_OPENCV_LIBRARIES contains the header files (compile stage) and libraries (link stage) respectively.

One very important thing I noticed was that the variable PKG_OPENCV_LIBRARIES just provides the libraries and not the library path during the link stage. In order to use the library path as well in one command, one has to use

PKG_OPENCV_LDFLAGS 

This variable contains the library path as well as all the libraries listed in the package config file.

for examaple:

include_directories(${PKG_OPENCV_INCLUDE_DIRS})
target_link_libraries (FINAL_BINARY ${PKG_OPENCV_LDFLAGS})

For modern CMake:

In modern CMake we don't want variables, we want targets.

find_package(PkgConfig REQUIRED)
# this looks for opencv.pc file and creates a new target
# IMPORTED_TARGET requires CMake >= 3.6.3
pkg_search_module(PKG_OPENCV REQUIRED IMPORTED_TARGET opencv)

All variables will still be created for backwards compatibility, but IMPORTED_TARGET will create a target you can use in your project which will automatically propagate all of its build and usage requirements:

target_link_libraries(my_proj PRIVATE PkgConfig::PKG_OPENCV) 
like image 121
infoclogged Avatar answered Oct 11 '22 18:10

infoclogged


You could set PKG_CONFIG_PATH with the CMake line:

set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/my/path/to/pkgconfig")

I did this workaround in this file

Interestingly, it seems CMake 3.1 extends PKG_CONFIG_PATH with some CMake variable see: https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=3df51470

like image 10
OlivierM Avatar answered Oct 11 '22 16:10

OlivierM