Merge pull request #18458 from sturkmen72:Update_window_w32_cpp
[platform/upstream/opencv.git] / cmake / OpenCVGenPkgconfig.cmake
1 if(MSVC OR IOS)
2   return()
3 endif()
4
5 # --------------------------------------------------------------------------------------------
6 # according to man pkg-config
7 #  The package name specified on the pkg-config command line is defined to
8 #      be the name of the metadata file, minus the .pc extension. If a library
9 #      can install multiple versions simultaneously, it must give each version
10 #      its own name (for example, GTK 1.2 might have the package  name  "gtk+"
11 #      while GTK 2.0 has "gtk+-2.0").
12 #
13 # ${BIN_DIR}/unix-install/opencv.pc -> For use *with* "make install"
14 # -------------------------------------------------------------------------------------------
15
16 macro(fix_prefix lst isown)
17   set(_lst)
18   foreach(item ${${lst}})
19     if(DEFINED TARGET_LOCATION_${item})
20       set(item "${TARGET_LOCATION_${item}}")
21       if(${isown})
22         get_filename_component(item "${item}" NAME)
23         ocv_get_libname(item "${item}")
24       endif()
25     endif()
26     if(item MATCHES "^-l")
27       list(APPEND _lst "${item}")
28     elseif(item MATCHES "^-framework") # MacOS framework (assume single entry "-framework OpenCL")
29       list(APPEND _lst "${item}")
30     elseif(item MATCHES "[\\/]")
31       get_filename_component(libdir "${item}" PATH)
32       get_filename_component(_libname "${item}" NAME)
33       ocv_get_libname(libname "${_libname}")
34       list(APPEND _lst "-L${libdir}" "-l${libname}")
35     else()
36       list(APPEND _lst "-l${item}")
37     endif()
38   endforeach()
39   set(${lst} ${_lst})
40   unset(_lst)
41 endmacro()
42
43 if(NOT DEFINED CMAKE_HELPER_SCRIPT)
44
45 if(INSTALL_TO_MANGLED_PATHS)
46   set(OPENCV_PC_FILE_NAME "opencv-${OPENCV_VERSION}.pc")
47 else()
48   set(OPENCV_PC_FILE_NAME opencv.pc)
49 endif()
50
51 # build the list of opencv libs and dependencies for all modules
52 ocv_get_all_libs(_modules _extra _3rdparty)
53
54 #build the list of components
55
56 # Note:
57 #   when linking against static libraries, if libfoo depends on libbar, then
58 #   libfoo must come first in the linker flags.
59
60 # world is a special target whose library should come first,
61 # especially for static link.
62 if(_modules MATCHES "opencv_world")
63   set(_modules "opencv_world")
64 endif()
65
66 set(HELPER_SCRIPT "")
67 ocv_cmake_script_append_var(HELPER_SCRIPT
68     BUILD_SHARED_LIBS
69     CMAKE_BINARY_DIR
70     CMAKE_INSTALL_PREFIX
71     OpenCV_SOURCE_DIR
72     OPENCV_PC_FILE_NAME
73     OPENCV_VERSION_PLAIN
74     OPENCV_LIB_INSTALL_PATH
75     OPENCV_INCLUDE_INSTALL_PATH
76     OPENCV_3P_LIB_INSTALL_PATH
77
78     _modules
79     _extra
80     _3rdparty
81 )
82
83 foreach(item ${_modules} ${_extra} ${_3rdparty})
84   if(TARGET ${item})
85     set(HELPER_SCRIPT "${HELPER_SCRIPT}
86 set(TARGET_LOCATION_${item} \"$<TARGET_FILE:${item}>\")
87 ")
88   endif()
89 endforeach()
90
91 set(CMAKE_HELPER_SCRIPT "${CMAKE_BINARY_DIR}/OpenCVGenPkgConfig.info.cmake")
92 file(GENERATE OUTPUT "${CMAKE_HELPER_SCRIPT}" CONTENT "${HELPER_SCRIPT}")
93
94 add_custom_target(developer_scripts)
95 add_custom_command(
96   OUTPUT "${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}"
97   COMMAND ${CMAKE_COMMAND} "-DCMAKE_HELPER_SCRIPT=${CMAKE_HELPER_SCRIPT}" -P "${OpenCV_SOURCE_DIR}/cmake/OpenCVGenPkgconfig.cmake"
98   DEPENDS "${CMAKE_BINARY_DIR}/OpenCVGenPkgConfig.info.cmake"
99           "${OpenCV_SOURCE_DIR}/cmake/OpenCVGenPkgconfig.cmake"
100   COMMENT "Generate ${OPENCV_PC_FILE_NAME}"
101 )
102 add_custom_target(gen-pkgconfig ALL SOURCES "${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}")
103 add_dependencies(developer_scripts gen-pkgconfig)
104
105
106 if(UNIX AND NOT ANDROID)
107   install(FILES ${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME} DESTINATION ${OPENCV_LIB_INSTALL_PATH}/pkgconfig COMPONENT dev)
108 endif()
109
110 # =============================================================================
111 else() # DEFINED CMAKE_HELPER_SCRIPT
112
113 cmake_minimum_required(VERSION 2.8.12.2)
114 cmake_policy(SET CMP0012 NEW)
115 include("${CMAKE_HELPER_SCRIPT}")
116 include("${OpenCV_SOURCE_DIR}/cmake/OpenCVUtils.cmake")
117
118 fix_prefix(_modules 1)
119 fix_prefix(_extra 0)
120 fix_prefix(_3rdparty 1)
121
122 ocv_list_unique(_modules)
123 ocv_list_unique(_extra)
124 ocv_list_unique(_3rdparty)
125
126 set(OPENCV_PC_LIBS
127   "-L\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}"
128   "${_modules}"
129 )
130 if(BUILD_SHARED_LIBS)
131   set(OPENCV_PC_LIBS_PRIVATE "${_extra}")
132 else()
133   set(OPENCV_PC_LIBS_PRIVATE
134     "-L\${exec_prefix}/${OPENCV_3P_LIB_INSTALL_PATH}"
135     "${_3rdparty}"
136     "${_extra}"
137   )
138 endif()
139 string(REPLACE ";" " " OPENCV_PC_LIBS "${OPENCV_PC_LIBS}")
140 string(REPLACE ";" " " OPENCV_PC_LIBS_PRIVATE "${OPENCV_PC_LIBS_PRIVATE}")
141
142 #generate the .pc file
143 set(prefix      "${CMAKE_INSTALL_PREFIX}")
144 set(exec_prefix "\${prefix}")
145 set(libdir      "\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}")
146 set(includedir  "\${prefix}/${OPENCV_INCLUDE_INSTALL_PATH}")
147
148 configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/opencv-XXX.pc.in"
149                "${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}"
150                @ONLY)
151
152 endif() # DEFINED CMAKE_HELPER_SCRIPT