opencv/cmake/OpenCVGenPkgconfig.cmake

153 lines
4.7 KiB
CMake
Raw Normal View History

2017-08-17 06:49:17 +08:00
if(MSVC OR IOS)
return()
endif()
# --------------------------------------------------------------------------------------------
# according to man pkg-config
# The package name specified on the pkg-config command line is defined to
# be the name of the metadata file, minus the .pc extension. If a library
# can install multiple versions simultaneously, it must give each version
# its own name (for example, GTK 1.2 might have the package name "gtk+"
# while GTK 2.0 has "gtk+-2.0").
#
# ${BIN_DIR}/unix-install/opencv.pc -> For use *with* "make install"
# -------------------------------------------------------------------------------------------
macro(fix_prefix lst isown)
set(_lst)
foreach(item ${${lst}})
2017-08-17 06:49:17 +08:00
if(DEFINED TARGET_LOCATION_${item})
set(item "${TARGET_LOCATION_${item}}")
if(${isown})
get_filename_component(item "${item}" NAME)
ocv_get_libname(item "${item}")
endif()
endif()
if(item MATCHES "^-l")
list(APPEND _lst "${item}")
elseif(item MATCHES "^-framework") # MacOS framework (assume single entry "-framework OpenCL")
list(APPEND _lst "${item}")
elseif(item MATCHES "[\\/]")
get_filename_component(libdir "${item}" PATH)
2017-08-17 06:49:17 +08:00
get_filename_component(_libname "${item}" NAME)
ocv_get_libname(libname "${_libname}")
list(APPEND _lst "-L${libdir}" "-l${libname}")
else()
list(APPEND _lst "-l${item}")
endif()
endforeach()
set(${lst} ${_lst})
unset(_lst)
endmacro()
2017-08-17 06:49:17 +08:00
if(NOT DEFINED CMAKE_HELPER_SCRIPT)
if(INSTALL_TO_MANGLED_PATHS)
2018-09-04 06:40:16 +08:00
ocv_update(OPENCV_PC_FILE_NAME "opencv-${OPENCV_VERSION}.pc")
2017-08-17 06:49:17 +08:00
else()
2020-10-10 00:55:00 +08:00
ocv_update(OPENCV_PC_FILE_NAME opencv5.pc)
2017-08-17 06:49:17 +08:00
endif()
# build the list of opencv libs and dependencies for all modules
ocv_get_all_libs(_modules _extra _3rdparty)
#build the list of components
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 substitutions for these paths when the aforementioned environment variables are set. In such case, since the prefix is the target one, not the sysroot one, these libraries' absolute 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 This patch is a port of [6] on the master branch. [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 [6] https://github.com/Itseez/opencv/commit/eceada586bbf18fc267e437522ec4f1f23ddc656 Signed-off-by: Samuel Martin <s.martin49@gmail.com>
2014-10-03 06:32:40 +08:00
# 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,
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 substitutions for these paths when the aforementioned environment variables are set. In such case, since the prefix is the target one, not the sysroot one, these libraries' absolute 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 This patch is a port of [6] on the master branch. [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 [6] https://github.com/Itseez/opencv/commit/eceada586bbf18fc267e437522ec4f1f23ddc656 Signed-off-by: Samuel Martin <s.martin49@gmail.com>
2014-10-03 06:32:40 +08:00
# especially for static link.
if(_modules MATCHES "opencv_world")
set(_modules "opencv_world")
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 substitutions for these paths when the aforementioned environment variables are set. In such case, since the prefix is the target one, not the sysroot one, these libraries' absolute 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 This patch is a port of [6] on the master branch. [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 [6] https://github.com/Itseez/opencv/commit/eceada586bbf18fc267e437522ec4f1f23ddc656 Signed-off-by: Samuel Martin <s.martin49@gmail.com>
2014-10-03 06:32:40 +08:00
endif()
2017-08-17 06:49:17 +08:00
set(HELPER_SCRIPT "")
ocv_cmake_script_append_var(HELPER_SCRIPT
BUILD_SHARED_LIBS
CMAKE_BINARY_DIR
CMAKE_INSTALL_PREFIX
OpenCV_SOURCE_DIR
OPENCV_PC_FILE_NAME
OPENCV_VERSION_PLAIN
OPENCV_LIB_INSTALL_PATH
OPENCV_INCLUDE_INSTALL_PATH
OPENCV_3P_LIB_INSTALL_PATH
_modules
_extra
_3rdparty
)
foreach(item ${_modules} ${_extra} ${_3rdparty})
if(TARGET ${item})
set(HELPER_SCRIPT "${HELPER_SCRIPT}
set(TARGET_LOCATION_${item} \"$<TARGET_FILE:${item}>\")
")
endif()
endforeach()
set(CMAKE_HELPER_SCRIPT "${CMAKE_BINARY_DIR}/OpenCVGenPkgConfig.info.cmake")
file(GENERATE OUTPUT "${CMAKE_HELPER_SCRIPT}" CONTENT "${HELPER_SCRIPT}")
add_custom_target(developer_scripts)
add_custom_command(
OUTPUT "${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}"
COMMAND ${CMAKE_COMMAND} "-DCMAKE_HELPER_SCRIPT=${CMAKE_HELPER_SCRIPT}" -P "${OpenCV_SOURCE_DIR}/cmake/OpenCVGenPkgconfig.cmake"
DEPENDS "${CMAKE_BINARY_DIR}/OpenCVGenPkgConfig.info.cmake"
"${OpenCV_SOURCE_DIR}/cmake/OpenCVGenPkgconfig.cmake"
COMMENT "Generate ${OPENCV_PC_FILE_NAME}"
)
add_custom_target(gen-pkgconfig ALL SOURCES "${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}")
add_dependencies(developer_scripts gen-pkgconfig)
if(UNIX AND NOT ANDROID)
install(FILES ${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME} DESTINATION ${OPENCV_LIB_INSTALL_PATH}/pkgconfig COMPONENT dev)
endif()
# =============================================================================
else() # DEFINED CMAKE_HELPER_SCRIPT
cmake_minimum_required(VERSION 2.8.12.2)
cmake_policy(SET CMP0012 NEW)
include("${CMAKE_HELPER_SCRIPT}")
include("${OpenCV_SOURCE_DIR}/cmake/OpenCVUtils.cmake")
fix_prefix(_modules 1)
fix_prefix(_extra 0)
fix_prefix(_3rdparty 1)
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 substitutions for these paths when the aforementioned environment variables are set. In such case, since the prefix is the target one, not the sysroot one, these libraries' absolute 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 This patch is a port of [6] on the master branch. [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 [6] https://github.com/Itseez/opencv/commit/eceada586bbf18fc267e437522ec4f1f23ddc656 Signed-off-by: Samuel Martin <s.martin49@gmail.com>
2014-10-03 06:32:40 +08:00
ocv_list_unique(_modules)
ocv_list_unique(_extra)
ocv_list_unique(_3rdparty)
set(OPENCV_PC_LIBS
"-L\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}"
"${_modules}"
)
2017-08-17 06:49:17 +08:00
if(BUILD_SHARED_LIBS)
set(OPENCV_PC_LIBS_PRIVATE "${_extra}")
else()
set(OPENCV_PC_LIBS_PRIVATE
"-L\${exec_prefix}/${OPENCV_3P_LIB_INSTALL_PATH}"
"${_3rdparty}"
"${_extra}"
)
endif()
string(REPLACE ";" " " OPENCV_PC_LIBS "${OPENCV_PC_LIBS}")
string(REPLACE ";" " " OPENCV_PC_LIBS_PRIVATE "${OPENCV_PC_LIBS_PRIVATE}")
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 substitutions for these paths when the aforementioned environment variables are set. In such case, since the prefix is the target one, not the sysroot one, these libraries' absolute 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 This patch is a port of [6] on the master branch. [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 [6] https://github.com/Itseez/opencv/commit/eceada586bbf18fc267e437522ec4f1f23ddc656 Signed-off-by: Samuel Martin <s.martin49@gmail.com>
2014-10-03 06:32:40 +08:00
#generate the .pc file
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 substitutions for these paths when the aforementioned environment variables are set. In such case, since the prefix is the target one, not the sysroot one, these libraries' absolute 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 This patch is a port of [6] on the master branch. [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 [6] https://github.com/Itseez/opencv/commit/eceada586bbf18fc267e437522ec4f1f23ddc656 Signed-off-by: Samuel Martin <s.martin49@gmail.com>
2014-10-03 06:32:40 +08:00
set(prefix "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "\${prefix}")
set(libdir "\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}")
set(includedir "\${prefix}/${OPENCV_INCLUDE_INSTALL_PATH}")
configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/opencv-XXX.pc.in"
"${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}"
@ONLY)
2017-08-17 06:49:17 +08:00
endif() # DEFINED CMAKE_HELPER_SCRIPT