[Buildroot] [PATCH] package/opencv: fix opencv.pc generation

Yann E. MORIN yann.morin.1998 at free.fr
Sun May 17 15:36:28 UTC 2015


Samuel, All,

On 2015-05-17 15:03 +0200, Samuel Martin spake thusly:
> This change fixes build of packages depending on opencv and using
> pkg-config to get the opencv LDFLAGS, which were wrongly ordered for
> static build and included absolute path pointing to the host system
> libraries instead of the sysroot ones.
> 
> This patch fixes build issues with gst1-plugins-bad and vlc.
> 
> This change introduce and new patch to opencv, which is already merged
> upstream [1].
> 
> Fixes:
>   http://autobuild.buildroot.net/results/c70/c70f793c7c3b380428d6e2e622a90805cffc4dd1/
>   ... and many others
> 
> [1] https://github.com/Itseez/opencv/commit/eceada586bbf18fc267e437522ec4f1f23ddc656
> 
> Cc: "Yann E. MORIN" <yann.morin.1998 at free.fr>
> Cc: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> Signed-off-by: Samuel Martin <s.martin49 at gmail.com>

Tested-by: "Yann E. MORIN" <yann.morin.1998 at free.fr>
[build-tested: generates correct opencv.pc fixes the autobuild failures]

Thanks Samuel! :-)

Regards,
Yann E. MORIN.

> ---
> Note that this fix is for upcoming 2015.05 release, and I am already
> preparing a series bumping of the opencv package for the next release. :)
> ---
>  ...VGenPkgconfig.cmake-rework-opencv.pc-gene.patch | 156 +++++++++++++++++++++
>  1 file changed, 156 insertions(+)
>  create mode 100644 package/opencv/0003-cmake-OpenCVGenPkgconfig.cmake-rework-opencv.pc-gene.patch
> 
> diff --git a/package/opencv/0003-cmake-OpenCVGenPkgconfig.cmake-rework-opencv.pc-gene.patch b/package/opencv/0003-cmake-OpenCVGenPkgconfig.cmake-rework-opencv.pc-gene.patch
> new file mode 100644
> index 0000000..768f08d
> --- /dev/null
> +++ b/package/opencv/0003-cmake-OpenCVGenPkgconfig.cmake-rework-opencv.pc-gene.patch
> @@ -0,0 +1,156 @@
> +From eceada586bbf18fc267e437522ec4f1f23ddc656 Mon Sep 17 00:00:00 2001
> +From: Samuel Martin <s.martin49 at gmail.com>
> +Date: Fri, 3 Oct 2014 00:32:40 +0200
> +Subject: [PATCH] cmake/OpenCVGenPkgconfig.cmake: rework opencv.pc generation
> +
> +Using absolute path to locate the components in the "Libs:" field of the
> +*.pc can badly break cross-compilation, especially when building
> +statically linked objects.
> +
> +Indeed, pkg-config automatically replaces the '-I...' and '-L...' paths
> +when the PKG_CONFIG_SYSROOT_DIR and PKG_CONFIG_LIBDIR environment
> +variables are set [1]. This feature is very helpful and common in
> +cross-compilation framework like Buildroot [2,3].
> +
> +When there are absolute paths in the *.pc files, pkg-config won't be
> +able to do the path substitions for these paths when the afromentioned
> +environment variables are set.
> +In such case, since the prefix is the target one, not the sysroot one,
> +these libraries' abolute paths will point to:
> +- in the best case: a non-existing file (i.e. these files do not exists
> +  on the host system;
> +- at worst: the host system's libraries. This will make the linking
> +  failed because these host system's libraries will most likely not be
> +  build for the target architecture [4].
> +
> +So, this patch replace the components' absolute paths by the form:
> +  -L<libdir> -l<libname>
> +
> +This way, the linker will be able to resolve each dependency path,
> +whatever the kind of objects/build (shared object or static build) it
> +is dealing with.
> +
> +Note that for static link, the library order does matter [5]. The order
> +of the opencv components has been carefully chosen to comply with this
> +requirement.
> +
> +Fixes #3931
> +
> +[1] http://linux.die.net/man/1/pkg-config
> +[2] http://buildroot.org/
> +[3] http://git.buildroot.net/buildroot/tree/package/pkgconf/pkg-config.in
> +[4] http://autobuild.buildroot.net/results/e8a/e8a859276db34aff87ef181b0cce98916b0afc90/build-end.log
> +[5] http://stackoverflow.com/questions/45135/linker-order-gcc
> +
> +Signed-off-by: Samuel Martin <s.martin49 at gmail.com>
> +
> +---
> +Note: this patch properly applies on top of the master branch, though it
> +      has been written on top of the 2.4 branch.
> +---
> + cmake/OpenCVGenPkgconfig.cmake | 64 +++++++++++++++++++++++++++---------------
> + 1 file changed, 42 insertions(+), 22 deletions(-)
> +
> +diff --git a/cmake/OpenCVGenPkgconfig.cmake b/cmake/OpenCVGenPkgconfig.cmake
> +index fa57db9..183c56d 100644
> +--- a/cmake/OpenCVGenPkgconfig.cmake
> ++++ b/cmake/OpenCVGenPkgconfig.cmake
> +@@ -8,10 +8,6 @@
> + #
> + # ${BIN_DIR}/unix-install/opencv.pc -> For use *with* "make install"
> + # -------------------------------------------------------------------------------------------
> +-set(prefix      "${CMAKE_INSTALL_PREFIX}")
> +-set(exec_prefix "\${prefix}")
> +-set(libdir      "") #TODO: need link paths for OpenCV_EXTRA_COMPONENTS
> +-set(includedir  "\${prefix}/${OPENCV_INCLUDE_INSTALL_PATH}")
> + 
> + if(CMAKE_BUILD_TYPE MATCHES "Release")
> +   set(ocv_optkind OPT)
> +@@ -35,42 +31,66 @@ ocv_list_reverse(OpenCV_LIB_COMPONENTS)
> + ocv_list_reverse(OpenCV_EXTRA_COMPONENTS)
> + 
> + #build the list of components
> +-set(OpenCV_LIB_COMPONENTS_ "")
> +-foreach(CVLib ${OpenCV_LIB_COMPONENTS})
> +-  get_target_property(libpath ${CVLib} LOCATION_${CMAKE_BUILD_TYPE})
> +-  get_filename_component(libname "${libpath}" NAME)
> + 
> +-  if(INSTALL_TO_MANGLED_PATHS)
> +-    set(libname "${libname}.${OPENCV_VERSION}")
> +-  endif()
> ++# Note:
> ++#   when linking against static libraries, if libfoo depends on libbar, then
> ++#   libfoo must come first in the linker flags.
> ++
> ++# world is a special target whose library should come first, especially for
> ++# static link.
> ++if(OpenCV_LIB_COMPONENTS MATCHES "opencv_world")
> ++  list(REMOVE_ITEM OpenCV_LIB_COMPONENTS "opencv_world")
> ++  list(INSERT OpenCV_LIB_COMPONENTS 0 "opencv_world")
> ++endif()
> ++
> ++set(OpenCV_LIB_COMPONENTS_)
> ++foreach(CVLib ${OpenCV_LIB_COMPONENTS})
> + 
> +-  #need better solution....
> +-  if(libpath MATCHES "3rdparty")
> +-    set(installDir "share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH}")
> ++  get_target_property(libloc ${CVLib} LOCATION_${CMAKE_BUILD_TYPE})
> ++  if(libloc MATCHES "3rdparty")
> ++    set(libpath "\${exec_prefix}/share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH}")
> +   else()
> +-    set(installDir "${OPENCV_LIB_INSTALL_PATH}")
> ++    set(libpath "\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}")
> +   endif()
> ++  list(APPEND OpenCV_LIB_COMPONENTS_ "-L${libpath}")
> ++
> ++  get_filename_component(libname ${CVLib} NAME_WE)
> ++  string(REGEX REPLACE "^lib" "" libname "${libname}")
> ++  list(APPEND OpenCV_LIB_COMPONENTS_ "-l${libname}")
> + 
> +-  set(OpenCV_LIB_COMPONENTS_ "${OpenCV_LIB_COMPONENTS_} \${exec_prefix}/${installDir}/${libname}")
> + endforeach()
> + 
> + # add extra dependencies required for OpenCV
> +-set(OpenCV_LIB_COMPONENTS ${OpenCV_LIB_COMPONENTS_})
> + if(OpenCV_EXTRA_COMPONENTS)
> +   foreach(extra_component ${OpenCV_EXTRA_COMPONENTS})
> + 
> +-    if(extra_component MATCHES "^-[lL]" OR extra_component MATCHES "[\\/]")
> +-      set(maybe_l_prefix "")
> ++    if(extra_component MATCHES "^-[lL]")
> ++      set(libprefix "")
> ++      set(libname "${extra_component}")
> ++    elseif(extra_component MATCHES "[\\/]")
> ++      get_filename_component(libdir "${extra_component}" PATH)
> ++      list(APPEND OpenCV_LIB_COMPONENTS_ "-L${libdir}")
> ++      get_filename_component(libname "${extra_component}" NAME_WE)
> ++      string(REGEX REPLACE "^lib" "" libname "${libname}")
> ++      set(libprefix "-l")
> +     else()
> +-      set(maybe_l_prefix "-l")
> ++      set(libprefix "-l")
> ++      set(libname "${extra_component}")
> +     endif()
> +-
> +-    set(OpenCV_LIB_COMPONENTS "${OpenCV_LIB_COMPONENTS} ${maybe_l_prefix}${extra_component}")
> ++    list(APPEND OpenCV_LIB_COMPONENTS_ "${libprefix}${libname}")
> + 
> +   endforeach()
> + endif()
> + 
> ++list(REMOVE_DUPLICATES OpenCV_LIB_COMPONENTS_)
> ++string(REPLACE ";" " " OpenCV_LIB_COMPONENTS "${OpenCV_LIB_COMPONENTS_}")
> ++
> + #generate the .pc file
> ++set(prefix      "${CMAKE_INSTALL_PREFIX}")
> ++set(exec_prefix "\${prefix}")
> ++set(libdir      "\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}")
> ++set(includedir  "\${prefix}/${OPENCV_INCLUDE_INSTALL_PATH}")
> ++
> + if(INSTALL_TO_MANGLED_PATHS)
> +   set(OPENCV_PC_FILE_NAME "opencv-${OPENCV_VERSION}.pc")
> + else()
> +-- 
> +2.4.1
> +
> -- 
> 2.4.1
> 

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'



More information about the buildroot mailing list