6a9d32d99a3baff0231656d1468960dbb99c1023
[platform/upstream/opencv.git] / modules / python / common.cmake
1 # This file is included from a subdirectory
2 set(PYTHON_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}")
3
4 ocv_add_module(${MODULE_NAME} BINDINGS PRIVATE_REQUIRED opencv_python_bindings_generator)
5
6 include_directories(SYSTEM
7     "${${PYTHON}_INCLUDE_PATH}"
8     ${${PYTHON}_NUMPY_INCLUDE_DIRS}
9 )
10 ocv_module_include_directories(
11     "${PYTHON_SOURCE_DIR}/src2"
12     "${OPENCV_PYTHON_BINDINGS_DIR}"
13 )
14
15 # try to use dynamic symbols linking with libpython.so
16 set(OPENCV_FORCE_PYTHON_LIBS OFF CACHE BOOL "")
17 string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
18 if(NOT WIN32 AND NOT APPLE AND NOT OPENCV_PYTHON_SKIP_LINKER_EXCLUDE_LIBS)
19   set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--exclude-libs=ALL")
20 endif()
21
22 ocv_add_library(${the_module} MODULE ${PYTHON_SOURCE_DIR}/src2/cv2.cpp ${cv2_generated_hdrs} ${opencv_userdef_hdrs} ${cv2_custom_hdr})
23 if(TARGET gen_opencv_python_source)
24   add_dependencies(${the_module} gen_opencv_python_source)
25 endif()
26
27 ocv_assert(${PYTHON}_VERSION_MAJOR)
28 ocv_assert(${PYTHON}_VERSION_MINOR)
29
30 if(${PYTHON}_LIMITED_API)
31   # support only python3.3+
32   ocv_assert(${PYTHON}_VERSION_MAJOR EQUAL 3 AND ${PYTHON}_VERSION_MINOR GREATER 2)
33   target_compile_definitions(${the_module} PRIVATE CVPY_DYNAMIC_INIT)
34   if(WIN32)
35     string(REPLACE
36       "python${${PYTHON}_VERSION_MAJOR}${${PYTHON}_VERSION_MINOR}.lib"
37       "python${${PYTHON}_VERSION_MAJOR}.lib"
38       ${PYTHON}_LIBRARIES
39       "${${PYTHON}_LIBRARIES}")
40   endif()
41 endif()
42
43 if(APPLE)
44   set_target_properties(${the_module} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
45 elseif(WIN32 OR OPENCV_FORCE_PYTHON_LIBS)
46   if(${PYTHON}_DEBUG_LIBRARIES AND NOT ${PYTHON}_LIBRARIES MATCHES "optimized.*debug")
47     ocv_target_link_libraries(${the_module} LINK_PRIVATE debug ${${PYTHON}_DEBUG_LIBRARIES} optimized ${${PYTHON}_LIBRARIES})
48   else()
49     ocv_target_link_libraries(${the_module} LINK_PRIVATE ${${PYTHON}_LIBRARIES})
50   endif()
51 endif()
52
53 if(TARGET gen_opencv_python_source)
54   set(deps ${OPENCV_MODULE_${the_module}_DEPS})
55   list(REMOVE_ITEM deps opencv_python_bindings_generator) # don't add dummy module to target_link_libraries list
56 endif()
57 ocv_target_link_libraries(${the_module} LINK_PRIVATE ${deps})
58
59 if(DEFINED ${PYTHON}_CVPY_SUFFIX)
60   set(CVPY_SUFFIX "${${PYTHON}_CVPY_SUFFIX}")
61 else()
62   set(__python_ext_suffix_var "EXT_SUFFIX")
63   if("${${PYTHON}_VERSION_MAJOR}" STREQUAL "2")
64     set(__python_ext_suffix_var "SO")
65   endif()
66   execute_process(COMMAND ${${PYTHON}_EXECUTABLE} -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('${__python_ext_suffix_var}'))"
67                   RESULT_VARIABLE PYTHON_CVPY_PROCESS
68                   OUTPUT_VARIABLE CVPY_SUFFIX
69                   OUTPUT_STRIP_TRAILING_WHITESPACE)
70   if(NOT PYTHON_CVPY_PROCESS EQUAL 0)
71     set(CVPY_SUFFIX ".so")
72   endif()
73   if(${PYTHON}_LIMITED_API)
74     if(WIN32)
75       string(REGEX REPLACE "\\.[^\\.]*\\." "." CVPY_SUFFIX "${CVPY_SUFFIX}")
76     else()
77       string(REGEX REPLACE "\\.[^\\.]*\\." ".abi${${PYTHON}_VERSION_MAJOR}." CVPY_SUFFIX "${CVPY_SUFFIX}")
78     endif()
79   endif()
80 endif()
81
82 ocv_update(OPENCV_PYTHON_EXTENSION_BUILD_PATH "${LIBRARY_OUTPUT_PATH}/${MODULE_INSTALL_SUBDIR}")
83
84 set_target_properties(${the_module} PROPERTIES
85                       LIBRARY_OUTPUT_DIRECTORY  "${OPENCV_PYTHON_EXTENSION_BUILD_PATH}"
86                       ARCHIVE_OUTPUT_NAME ${the_module}  # prevent name conflict for python2/3 outputs
87                       PREFIX ""
88                       OUTPUT_NAME cv2
89                       SUFFIX ${CVPY_SUFFIX})
90
91 if(ENABLE_SOLUTION_FOLDERS)
92   set_target_properties(${the_module} PROPERTIES FOLDER "bindings")
93 endif()
94
95 if(MSVC)
96   add_definitions(-DCVAPI_EXPORTS)
97 endif()
98
99 if((CV_GCC OR CV_CLANG) AND NOT ENABLE_NOISY_WARNINGS)
100   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-function")
101 endif()
102
103 if(MSVC AND NOT ENABLE_NOISY_WARNINGS)
104   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4100") #unreferenced formal parameter
105   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4127") #conditional expression is constant
106   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4505") #unreferenced local function has been removed
107   string(REPLACE "/W4" "/W3" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
108 endif()
109
110
111 if(MSVC)
112   ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4996)
113 else()
114   ocv_warnings_disable(CMAKE_CXX_FLAGS
115       -Wdeprecated-declarations
116       -Woverloaded-virtual -Wunused-private-field
117       -Wundef # accurate guard via #pragma doesn't work (C++ preprocessor doesn't handle #pragma)
118   )
119 endif()
120
121 if(MSVC AND NOT BUILD_SHARED_LIBS)
122   set_target_properties(${the_module} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /DEBUG")
123 endif()
124
125 if(MSVC AND NOT ${PYTHON}_DEBUG_LIBRARIES)
126   set(PYTHON_INSTALL_CONFIGURATIONS CONFIGURATIONS Release)
127 else()
128   set(PYTHON_INSTALL_CONFIGURATIONS "")
129 endif()
130
131 if(WIN32)
132   set(PYTHON_INSTALL_ARCHIVE "")
133 else()
134   set(PYTHON_INSTALL_ARCHIVE ARCHIVE DESTINATION ${${PYTHON}_PACKAGES_PATH} COMPONENT python)
135 endif()
136
137 set(__python_loader_subdir "")
138 if(NOT OPENCV_SKIP_PYTHON_LOADER)
139   set(__python_loader_subdir "cv2/")
140 endif()
141
142 if(NOT " ${PYTHON}" STREQUAL " PYTHON"
143     AND NOT DEFINED OPENCV_PYTHON_INSTALL_PATH
144 )
145   if(DEFINED OPENCV_${PYTHON}_INSTALL_PATH)
146     set(OPENCV_PYTHON_INSTALL_PATH "${OPENCV_${PYTHON}_INSTALL_PATH}")
147   elseif(NOT OPENCV_SKIP_PYTHON_LOADER)
148     set(OPENCV_PYTHON_INSTALL_PATH "${${PYTHON}_PACKAGES_PATH}")
149   endif()
150 endif()
151
152 if(NOT OPENCV_SKIP_PYTHON_LOADER AND DEFINED OPENCV_PYTHON_INSTALL_PATH)
153   include("${CMAKE_CURRENT_LIST_DIR}/python_loader.cmake")
154   set(OPENCV_PYTHON_INSTALL_PATH_SETUPVARS "${OPENCV_PYTHON_INSTALL_PATH}" CACHE INTERNAL "")
155 endif()
156
157 if(OPENCV_SKIP_PYTHON_LOADER)
158   if(DEFINED OPENCV_${PYTHON}_INSTALL_PATH)
159     set(__python_binary_install_path "${OPENCV_${PYTHON}_INSTALL_PATH}")
160   elseif(DEFINED ${PYTHON}_PACKAGES_PATH)
161     set(__python_binary_install_path "${${PYTHON}_PACKAGES_PATH}")
162   else()
163     message(FATAL_ERROR "Specify 'OPENCV_${PYTHON}_INSTALL_PATH' variable")
164   endif()
165 else()
166   ocv_assert(DEFINED OPENCV_PYTHON_INSTALL_PATH)
167   set(__python_binary_install_path "${OPENCV_PYTHON_INSTALL_PATH}/${__python_loader_subdir}python-${${PYTHON}_VERSION_MAJOR}.${${PYTHON}_VERSION_MINOR}")
168 endif()
169
170 install(TARGETS ${the_module}
171         ${PYTHON_INSTALL_CONFIGURATIONS}
172         RUNTIME DESTINATION "${__python_binary_install_path}" COMPONENT python
173         LIBRARY DESTINATION "${__python_binary_install_path}" COMPONENT python
174         ${PYTHON_INSTALL_ARCHIVE}
175         )
176
177 set(__INSTALL_PATH_${PYTHON} "${__python_binary_install_path}" CACHE INTERNAL "")  # CMake status
178
179 if(NOT OPENCV_SKIP_PYTHON_LOADER)
180   ocv_assert(DEFINED OPENCV_PYTHON_INSTALL_PATH)
181   if(OpenCV_FOUND)
182     set(__loader_path "${OpenCV_BINARY_DIR}/python_loader")
183   else()
184     set(__loader_path "${CMAKE_BINARY_DIR}/python_loader")
185   endif()
186
187   set(__python_loader_install_tmp_path "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/install/python_loader/")
188   set(OpenCV_PYTHON_LOADER_FULL_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}/${OPENCV_PYTHON_INSTALL_PATH}/cv2")
189   if(IS_ABSOLUTE "${OPENCV_PYTHON_INSTALL_PATH}")
190     set(CMAKE_PYTHON_EXTENSION_INSTALL_PATH_BASE "'${OPENCV_PYTHON_INSTALL_PATH}/cv2'")
191   else()
192     set(CMAKE_PYTHON_EXTENSION_INSTALL_PATH_BASE "LOADER_DIR")
193   endif()
194
195   if(DEFINED ${PYTHON}_VERSION_MINOR)
196     set(__target_config "config-${${PYTHON}_VERSION_MAJOR}.${${PYTHON}_VERSION_MINOR}.py")
197   else()
198     set(__target_config "config-${${PYTHON}_VERSION_MAJOR}.py")
199   endif()
200
201   if(CMAKE_GENERATOR MATCHES "Visual Studio")
202     set(CMAKE_PYTHON_EXTENSION_PATH "'${OPENCV_PYTHON_EXTENSION_BUILD_PATH}/Release'")  # TODO: CMAKE_BUILD_TYPE is not defined
203   else()
204     set(CMAKE_PYTHON_EXTENSION_PATH "'${OPENCV_PYTHON_EXTENSION_BUILD_PATH}'")
205   endif()
206   configure_file("${PYTHON_SOURCE_DIR}/package/template/config-x.y.py.in" "${__loader_path}/cv2/${__target_config}" @ONLY)
207
208   if(IS_ABSOLUTE __python_binary_install_path)
209     set(CMAKE_PYTHON_EXTENSION_PATH "'${__python_binary_install_path}'")
210   else()
211     file(RELATIVE_PATH OpenCV_PYTHON_BINARY_RELATIVE_INSTALL_PATH "${OpenCV_PYTHON_LOADER_FULL_INSTALL_PATH}" "${CMAKE_INSTALL_PREFIX}/${__python_binary_install_path}")
212     set(CMAKE_PYTHON_EXTENSION_PATH "os.path.join(${CMAKE_PYTHON_EXTENSION_INSTALL_PATH_BASE}, '${OpenCV_PYTHON_BINARY_RELATIVE_INSTALL_PATH}')")
213   endif()
214   configure_file("${PYTHON_SOURCE_DIR}/package/template/config-x.y.py.in" "${__python_loader_install_tmp_path}/cv2/${__target_config}" @ONLY)
215   install(FILES "${__python_loader_install_tmp_path}/cv2/${__target_config}" DESTINATION "${OPENCV_PYTHON_INSTALL_PATH}/cv2/" COMPONENT python)
216 endif()  # NOT OPENCV_SKIP_PYTHON_LOADER
217
218 unset(PYTHON_SRC_DIR)
219 unset(PYTHON_CVPY_PROCESS)
220 unset(CVPY_SUFFIX)
221 unset(PYTHON_INSTALL_CONFIGURATIONS)
222 unset(PYTHON_INSTALL_ARCHIVE)