diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d8718f6ae..939ee12674 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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:") @@ -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() diff --git a/cmake/OpenCVGenPkgconfig.cmake b/cmake/OpenCVGenPkgconfig.cmake index a8686e89cd..28a6da686e 100644 --- a/cmake/OpenCVGenPkgconfig.cmake +++ b/cmake/OpenCVGenPkgconfig.cmake @@ -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() +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() -#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() - -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() +# Note: +# when linking against static libraries, if libfoo depends on libbar, then +# libfoo must come first in the linker flags. - #need better solution.... - if(libpath MATCHES "3rdparty") - set(installDir "share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH}") - else() - set(installDir "${OPENCV_LIB_INSTALL_PATH}") - endif() - - set(OpenCV_LIB_COMPONENTS_ "${OpenCV_LIB_COMPONENTS_} \${exec_prefix}/${installDir}/${libname}") - endif() -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 "") - else() - set(maybe_l_prefix "-l") - endif() - - set(OpenCV_LIB_COMPONENTS "${OpenCV_LIB_COMPONENTS} ${maybe_l_prefix}${extra_component}") - - 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() +if(_modules MATCHES "opencv_contrib_world") + list(REMOVE_ITEM _modules "opencv_contrib_world") + list(INSERT _modules 0 "opencv_contrib_world") +endif() + +fix_prefix(_modules TRUE) +fix_prefix(_extra FALSE) +fix_prefix(_3rdparty TRUE) + +ocv_list_unique(_modules) +ocv_list_unique(_extra) +ocv_list_unique(_3rdparty) + +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() diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index e7d60beb9b..3e2ea8a7a4 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -796,11 +796,19 @@ 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() @@ -808,6 +816,13 @@ macro(ocv_get_all_libs _modules _extra _3rdparty) 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}}) diff --git a/cmake/templates/opencv-XXX.pc.in b/cmake/templates/opencv-XXX.pc.in index 5b94e4d6c3..04d675af16 100644 --- a/cmake/templates/opencv-XXX.pc.in +++ b/cmake/templates/opencv-XXX.pc.in @@ -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} diff --git a/modules/highgui/CMakeLists.txt b/modules/highgui/CMakeLists.txt index 2a6f0b1d8c..0b7f8fe526 100644 --- a/modules/highgui/CMakeLists.txt +++ b/modules/highgui/CMakeLists.txt @@ -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 diff --git a/modules/ts/CMakeLists.txt b/modules/ts/CMakeLists.txt index 9d1e40c9c3..c0158ba416 100644 --- a/modules/ts/CMakeLists.txt +++ b/modules/ts/CMakeLists.txt @@ -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() diff --git a/samples/cpp/example_cmake/Makefile b/samples/cpp/example_cmake/Makefile new file mode 100644 index 0000000000..f72911571f --- /dev/null +++ b/samples/cpp/example_cmake/Makefile @@ -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