Skip to content
This repository has been archived by the owner on Jul 19, 2024. It is now read-only.

Commit

Permalink
Merge pull request opencv#4032 from mshabunin:fix-pkg-config
Browse files Browse the repository at this point in the history
  • Loading branch information
vpisarev committed May 26, 2015
2 parents dc58799 + 3863dc5 commit 8fb3760
Show file tree
Hide file tree
Showing 7 changed files with 101 additions and 57 deletions.
7 changes: 6 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,11 @@ else()
endif()
status(" Precompiled headers:" PCHSupport_FOUND AND ENABLE_PRECOMPILED_HEADERS THEN YES ELSE NO)

# ========================== Dependencies ============================
ocv_get_all_libs(deps_modules deps_extra deps_3rdparty)
status(" Extra dependencies:" ${deps_extra})
status(" 3rdparty dependencies:" ${deps_3rdparty})

# ========================== OpenCV modules ==========================
status("")
status(" OpenCV modules:")
Expand Down Expand Up @@ -909,7 +914,7 @@ else()
endif()

if( WITH_GDAL )
status(" GDAL:" GDAL_FOUND THEN "${GDAL_LIBRARY}")
status(" GDAL:" GDAL_FOUND THEN "${GDAL_LIBRARY}" ELSE "NO")
else()
status(" GDAL:" "NO")
endif()
Expand Down
115 changes: 63 additions & 52 deletions cmake/OpenCVGenPkgconfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -8,71 +8,82 @@
#
# ${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)
else()
set(ocv_optkind DBG)
endif()

#build the list of opencv libs and dependencies for all modules
set(OpenCV_LIB_COMPONENTS "")
set(OpenCV_EXTRA_COMPONENTS "")
foreach(m ${OPENCV_MODULES_PUBLIC})
list(INSERT OpenCV_LIB_COMPONENTS 0 ${${m}_MODULE_DEPS_${ocv_optkind}} ${m})
if(${m}_EXTRA_DEPS_${ocv_optkind})
list(INSERT OpenCV_EXTRA_COMPONENTS 0 ${${m}_EXTRA_DEPS_${ocv_optkind}})
endif()
endforeach()
macro(fix_prefix lst isown)
set(_lst)
foreach(item ${${lst}})
if(TARGET ${item})
get_target_property(item "${item}" LOCATION_${CMAKE_BUILD_TYPE})
if("${isown}")
get_filename_component(item "${item}" NAME_WE)
string(REGEX REPLACE "^lib(.*)" "\\1" item "${item}")
endif()
endif()
if(item MATCHES "^-l")
list(APPEND _lst "${item}")
elseif(item MATCHES "[\\/]")
get_filename_component(libdir "${item}" PATH)
get_filename_component(libname "${item}" NAME_WE)
string(REGEX REPLACE "^lib(.*)" "\\1" libname "${libname}")
list(APPEND _lst "-L${libdir}" "-l${libname}")
else()
list(APPEND _lst "-l${item}")
endif()
endforeach()
set(${lst} ${_lst})
unset(_lst)
endmacro()

ocv_list_unique(OpenCV_LIB_COMPONENTS)
ocv_list_unique(OpenCV_EXTRA_COMPONENTS)
ocv_list_reverse(OpenCV_LIB_COMPONENTS)
ocv_list_reverse(OpenCV_EXTRA_COMPONENTS)
# build the list of opencv libs and dependencies for all modules
ocv_get_all_libs(_modules _extra _3rdparty)

#build the list of components
set(OpenCV_LIB_COMPONENTS_ "")
foreach(CVLib ${OpenCV_LIB_COMPONENTS})
if (TARGET ${CVLib})
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()

#need better solution....
if(libpath MATCHES "3rdparty")
set(installDir "share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH}")
else()
set(installDir "${OPENCV_LIB_INSTALL_PATH}")
endif()
# Note:
# when linking against static libraries, if libfoo depends on libbar, then
# libfoo must come first in the linker flags.

set(OpenCV_LIB_COMPONENTS_ "${OpenCV_LIB_COMPONENTS_} \${exec_prefix}/${installDir}/${libname}")
endif()
endforeach()
# world and contrib_world are special targets whose library should come first,
# especially for static link.
if(_modules MATCHES "opencv_world")
set(_modules "opencv_world")
endif()

# add extra dependencies required for OpenCV
set(OpenCV_LIB_COMPONENTS ${OpenCV_LIB_COMPONENTS_})
if(OpenCV_EXTRA_COMPONENTS)
foreach(extra_component ${OpenCV_EXTRA_COMPONENTS})
if(_modules MATCHES "opencv_contrib_world")
list(REMOVE_ITEM _modules "opencv_contrib_world")
list(INSERT _modules 0 "opencv_contrib_world")
endif()

if(extra_component MATCHES "^-[lL]" OR extra_component MATCHES "[\\/]")
set(maybe_l_prefix "")
else()
set(maybe_l_prefix "-l")
endif()
fix_prefix(_modules TRUE)
fix_prefix(_extra FALSE)
fix_prefix(_3rdparty TRUE)

set(OpenCV_LIB_COMPONENTS "${OpenCV_LIB_COMPONENTS} ${maybe_l_prefix}${extra_component}")
ocv_list_unique(_modules)
ocv_list_unique(_extra)
ocv_list_unique(_3rdparty)

endforeach()
set(OPENCV_PC_LIBS
"-L\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}"
"${_modules}"
)
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}")

#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()
Expand Down
17 changes: 16 additions & 1 deletion cmake/OpenCVUtils.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -796,18 +796,33 @@ macro(ocv_get_all_libs _modules _extra _3rdparty)
set(${_3rdparty} "")
foreach(m ${OPENCV_MODULES_PUBLIC})
get_target_property(deps ${m} INTERFACE_LINK_LIBRARIES)
if(NOT deps)
set(deps "")
endif()
list(INSERT ${_modules} 0 ${deps} ${m})
foreach (dep ${deps} ${OPENCV_LINKER_LIBS})
if (NOT DEFINED OPENCV_MODULE_${dep}_LOCATION)
if (TARGET ${dep})
list(INSERT ${_3rdparty} 0 ${dep})
get_target_property(_output ${dep} ARCHIVE_OUTPUT_DIRECTORY)
if ("${_output}" STREQUAL "${3P_LIBRARY_OUTPUT_PATH}")
list(INSERT ${_3rdparty} 0 ${dep})
else()
list(INSERT ${_extra} 0 ${dep})
endif()
else()
list(INSERT ${_extra} 0 ${dep})
endif()
endif()
endforeach()
endforeach()

# ippicv specific handling
list(FIND ${_extra} "ippicv" ippicv_idx)
if (${ippicv_idx} GREATER -1)
list(REMOVE_ITEM ${_extra} "ippicv")
list(INSERT ${_3rdparty} 0 "ippicv")
endif()

# split 3rdparty libs and modules
list(REMOVE_ITEM ${_modules} ${${_3rdparty}} ${${_extra}})

Expand Down
3 changes: 2 additions & 1 deletion cmake/templates/opencv-XXX.pc.in
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ includedir_new=@includedir@
Name: OpenCV
Description: Open Source Computer Vision Library
Version: @OPENCV_VERSION_PLAIN@
Libs: @OpenCV_LIB_COMPONENTS@
Libs: @OPENCV_PC_LIBS@
Libs.private: @OPENCV_PC_LIBS_PRIVATE@
Cflags: -I${includedir_old} -I${includedir_new}
2 changes: 1 addition & 1 deletion modules/highgui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ if (WINRT)
endif()

set(the_description "High-level GUI and Media I/O")
ocv_add_module(highgui opencv_imgproc opencv_imgcodecs opencv_videoio OPTIONAL opencv_androidcamera WRAP python)
ocv_add_module(highgui opencv_imgproc opencv_imgcodecs opencv_videoio WRAP python)

# ----------------------------------------------------------------------------
# CMake file for highgui. See root CMakeLists.txt
Expand Down
2 changes: 1 addition & 1 deletion modules/ts/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ set(OPENCV_MODULE_IS_PART_OF_WORLD FALSE)

ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef)

ocv_add_module(ts opencv_core opencv_imgproc opencv_imgcodecs opencv_videoio opencv_highgui)
ocv_add_module(ts INTERNAL opencv_core opencv_imgproc opencv_imgcodecs opencv_videoio opencv_highgui)

ocv_glob_module_sources()
ocv_module_include_directories()
Expand Down
12 changes: 12 additions & 0 deletions samples/cpp/example_cmake/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
CXX ?= g++

CXXFLAGS += -c -Wall $(shell pkg-config --cflags opencv)
LDFLAGS += $(shell pkg-config --libs --static opencv)

all: opencv_example

opencv_example: example.o; $(CXX) $< -o $@ $(LDFLAGS)

%.o: %.cpp; $(CXX) $< -o $@ $(CXXFLAGS)

clean: ; rm -f example.o opencv_example

0 comments on commit 8fb3760

Please sign in to comment.