OpenCVGenPkgconfig.cmake 4.73 KB
Newer Older
Alexander Alekhin's avatar
Alexander Alekhin committed
1 2 3 4
if(MSVC OR IOS)
  return()
endif()

5 6 7 8 9 10 11 12 13 14 15
# --------------------------------------------------------------------------------------------
# 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"
# -------------------------------------------------------------------------------------------

16 17 18
macro(fix_prefix lst isown)
  set(_lst)
  foreach(item ${${lst}})
Alexander Alekhin's avatar
Alexander Alekhin committed
19 20 21 22 23
    if(DEFINED TARGET_LOCATION_${item})
      set(item "${TARGET_LOCATION_${item}}")
      if(${isown})
        get_filename_component(item "${item}" NAME)
        ocv_get_libname(item "${item}")
24 25 26 27
      endif()
    endif()
    if(item MATCHES "^-l")
      list(APPEND _lst "${item}")
28 29
    elseif(item MATCHES "^-framework") # MacOS framework (assume single entry "-framework OpenCL")
      list(APPEND _lst "${item}")
30 31
    elseif(item MATCHES "[\\/]")
      get_filename_component(libdir "${item}" PATH)
Alexander Alekhin's avatar
Alexander Alekhin committed
32 33
      get_filename_component(_libname "${item}" NAME)
      ocv_get_libname(libname "${_libname}")
34 35 36 37 38 39 40 41
      list(APPEND _lst "-L${libdir}" "-l${libname}")
    else()
      list(APPEND _lst "-l${item}")
    endif()
  endforeach()
  set(${lst} ${_lst})
  unset(_lst)
endmacro()
42

Alexander Alekhin's avatar
Alexander Alekhin committed
43 44 45 46 47 48 49 50
if(NOT DEFINED CMAKE_HELPER_SCRIPT)

if(INSTALL_TO_MANGLED_PATHS)
  set(OPENCV_PC_FILE_NAME "opencv-${OPENCV_VERSION}.pc")
else()
  set(OPENCV_PC_FILE_NAME opencv.pc)
endif()

51 52
# build the list of opencv libs and dependencies for all modules
ocv_get_all_libs(_modules _extra _3rdparty)
53 54 55

#build the list of components

56 57 58
# Note:
#   when linking against static libraries, if libfoo depends on libbar, then
#   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 63
if(_modules MATCHES "opencv_world")
  set(_modules "opencv_world")
64 65
endif()

Alexander Alekhin's avatar
Alexander Alekhin committed
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
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)
121

122 123 124
ocv_list_unique(_modules)
ocv_list_unique(_extra)
ocv_list_unique(_3rdparty)
125

126 127 128 129
set(OPENCV_PC_LIBS
  "-L\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}"
  "${_modules}"
)
Alexander Alekhin's avatar
Alexander Alekhin committed
130
if(BUILD_SHARED_LIBS)
131 132 133 134 135 136 137
  set(OPENCV_PC_LIBS_PRIVATE "${_extra}")
else()
  set(OPENCV_PC_LIBS_PRIVATE
    "-L\${exec_prefix}/${OPENCV_3P_LIB_INSTALL_PATH}"
    "${_3rdparty}"
    "${_extra}"
  )
138
endif()
139 140
string(REPLACE ";" " " OPENCV_PC_LIBS "${OPENCV_PC_LIBS}")
string(REPLACE ";" " " OPENCV_PC_LIBS_PRIVATE "${OPENCV_PC_LIBS_PRIVATE}")
141

142
#generate the .pc file
143 144 145 146 147
set(prefix      "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "\${prefix}")
set(libdir      "\${exec_prefix}/${OPENCV_LIB_INSTALL_PATH}")
set(includedir  "\${prefix}/${OPENCV_INCLUDE_INSTALL_PATH}")

148 149
configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/opencv-XXX.pc.in"
               "${CMAKE_BINARY_DIR}/unix-install/${OPENCV_PC_FILE_NAME}"
150
               @ONLY)
151

Alexander Alekhin's avatar
Alexander Alekhin committed
152
endif() # DEFINED CMAKE_HELPER_SCRIPT