Skip to content

Commit 1dbdb1c

Browse files
committed
Merge pull request opencv#10727 from alalek:cmake_hook_system
2 parents 30b33a4 + 36f11a5 commit 1dbdb1c

File tree

5 files changed

+106
-6
lines changed

5 files changed

+106
-6
lines changed

CMakeLists.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,16 @@ if(POLICY CMP0067)
105105
endif()
106106

107107
include(cmake/OpenCVUtils.cmake)
108+
ocv_cmake_reset_hooks()
109+
ocv_check_environment_variables(OPENCV_CMAKE_HOOKS_DIR)
110+
if(DEFINED OPENCV_CMAKE_HOOKS_DIR)
111+
foreach(__dir ${OPENCV_CMAKE_HOOKS_DIR})
112+
get_filename_component(__dir "${__dir}" ABSOLUTE)
113+
ocv_cmake_hook_register_dir(${__dir})
114+
endforeach()
115+
endif()
116+
117+
ocv_cmake_hook(CMAKE_INIT)
108118

109119
# must go before the project command
110120
ocv_update(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE)
@@ -141,6 +151,7 @@ endif()
141151
# ----------------------------------------------------------------------------
142152
OCV_OPTION(ENABLE_CXX11 "Enable C++11 compilation mode" "${OPENCV_CXX11}")
143153
include(cmake/OpenCVDetectCXXCompiler.cmake)
154+
ocv_cmake_hook(POST_DETECT_COMPILER)
144155

145156
# Add these standard paths to the search paths for FIND_LIBRARY
146157
# to find libraries from these locations first
@@ -336,6 +347,7 @@ endif()
336347
# ----------------------------------------------------------------------------
337348
include(cmake/OpenCVVersion.cmake)
338349

350+
ocv_cmake_hook(POST_OPTIONS)
339351

340352
# ----------------------------------------------------------------------------
341353
# Build & install layouts
@@ -531,13 +543,17 @@ if(CMAKE_GENERATOR MATCHES "Makefiles|Ninja" AND "${CMAKE_BUILD_TYPE}" STREQUAL
531543
set(CMAKE_BUILD_TYPE Release)
532544
endif()
533545

546+
ocv_cmake_hook(POST_CMAKE_BUILD_OPTIONS)
547+
534548
# --- Python Support ---
535549
if(NOT IOS)
536550
include(cmake/OpenCVDetectPython.cmake)
537551
endif()
538552

539553
include(cmake/OpenCVCompilerOptions.cmake)
540554

555+
ocv_cmake_hook(POST_COMPILER_OPTIONS)
556+
541557
# ----------------------------------------------------------------------------
542558
# CHECK FOR SYSTEM LIBRARIES, OPTIONS, ETC..
543559
# ----------------------------------------------------------------------------
@@ -767,6 +783,7 @@ if(CV_TRACE)
767783
include(cmake/OpenCVDetectTrace.cmake)
768784
endif()
769785

786+
ocv_cmake_hook(POST_DETECT_DEPENDECIES)
770787

771788
# ----------------------------------------------------------------------------
772789
# Solution folders:
@@ -816,6 +833,8 @@ endif()
816833
# Finalization: generate configuration-based files
817834
# ----------------------------------------------------------------------------
818835

836+
ocv_cmake_hook(PRE_FINALIZE)
837+
819838
# Generate platform-dependent and configuration-dependent headers
820839
include(cmake/OpenCVGenHeaders.cmake)
821840

@@ -1459,6 +1478,8 @@ status("")
14591478

14601479
ocv_finalize_status()
14611480

1481+
ocv_cmake_hook(POST_FINALIZE)
1482+
14621483
# ----------------------------------------------------------------------------
14631484
# CPack stuff
14641485
# ----------------------------------------------------------------------------

cmake/OpenCVGenConfig.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ else()
5959
set(USE_IPPIW FALSE)
6060
endif()
6161

62+
ocv_cmake_hook(PRE_CMAKE_CONFIG_BUILD)
6263
configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/OpenCVConfig.cmake.in" "${CMAKE_BINARY_DIR}/OpenCVConfig.cmake" @ONLY)
6364
#support for version checking when finding opencv. find_package(OpenCV 2.3.1 EXACT) should now work.
6465
configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/OpenCVConfig-version.cmake.in" "${CMAKE_BINARY_DIR}/OpenCVConfig-version.cmake" @ONLY)
@@ -84,6 +85,7 @@ function(ocv_gen_config TMP_DIR NESTED_PATH ROOT_NAME)
8485

8586
file(RELATIVE_PATH OpenCV_INSTALL_PATH_RELATIVE_CONFIGCMAKE "${CMAKE_INSTALL_PREFIX}/${__install_nested}" "${CMAKE_INSTALL_PREFIX}/")
8687

88+
ocv_cmake_hook(PRE_CMAKE_CONFIG_INSTALL)
8789
configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/OpenCVConfig-version.cmake.in" "${TMP_DIR}/OpenCVConfig-version.cmake" @ONLY)
8890

8991
configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/OpenCVConfig.cmake.in" "${__tmp_nested}/OpenCVConfig.cmake" @ONLY)

cmake/OpenCVModule.cmake

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,16 +163,20 @@ macro(ocv_add_module _name)
163163

164164
set(OPENCV_MODULE_${the_module}_LINK_DEPS "" CACHE INTERNAL "")
165165

166+
set(ADD_MODULE_ARGN ${ARGN})
167+
ocv_cmake_hook(PRE_ADD_MODULE)
168+
ocv_cmake_hook(PRE_ADD_MODULE_${the_module})
169+
166170
# parse list of dependencies
167171
if(" ${ARGV1}" STREQUAL " INTERNAL" OR " ${ARGV1}" STREQUAL " BINDINGS")
168172
set(OPENCV_MODULE_${the_module}_CLASS "${ARGV1}" CACHE INTERNAL "The category of the module")
169-
set(__ocv_argn__ ${ARGN})
173+
set(__ocv_argn__ ${ADD_MODULE_ARGN})
170174
list(REMOVE_AT __ocv_argn__ 0)
171175
ocv_add_dependencies(${the_module} ${__ocv_argn__})
172176
unset(__ocv_argn__)
173177
else()
174178
set(OPENCV_MODULE_${the_module}_CLASS "PUBLIC" CACHE INTERNAL "The category of the module")
175-
ocv_add_dependencies(${the_module} ${ARGN})
179+
ocv_add_dependencies(${the_module} ${ADD_MODULE_ARGN})
176180
if(BUILD_${the_module})
177181
set(OPENCV_MODULES_PUBLIC ${OPENCV_MODULES_PUBLIC} "${the_module}" CACHE INTERNAL "List of OpenCV modules marked for export")
178182
endif()
@@ -212,6 +216,8 @@ macro(ocv_add_module _name)
212216
endforeach()
213217

214218
# stop processing of current file
219+
ocv_cmake_hook(POST_ADD_MODULE)
220+
ocv_cmake_hook(POST_ADD_MODULE_${the_module})
215221
return()
216222
else()
217223
set(OPENCV_MODULE_${the_module}_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE INTERNAL "")
@@ -256,7 +262,8 @@ endmacro()
256262
# otherwise all first-level subfolders containing CMakeLists.txt are accepted.
257263
# Usage: _glob_locations(<output paths list> <output names list> <folder> [<folder> ...])
258264
function(_glob_locations out_paths out_names)
259-
foreach(path ${ARGN})
265+
set(PATHS ${ARGN})
266+
foreach(path ${PATHS})
260267
#message(STATUS "Inspect: ${path}")
261268
list(LENGTH paths before)
262269
get_filename_component(path "${path}" ABSOLUTE)
@@ -313,6 +320,7 @@ endfunction()
313320
function(_add_modules_2)
314321
foreach(m ${ARGN})
315322
set(the_module "${m}")
323+
ocv_cmake_hook(PRE_MODULES_CREATE_${the_module})
316324
if(BUILD_opencv_world AND m STREQUAL "opencv_world"
317325
OR NOT BUILD_opencv_world
318326
OR NOT OPENCV_MODULE_${m}_IS_PART_OF_WORLD)
@@ -323,6 +331,7 @@ function(_add_modules_2)
323331
#message(STATUS "Second pass: ${name} => ${OPENCV_MODULE_${m}_LOCATION}")
324332
add_subdirectory("${OPENCV_MODULE_${m}_LOCATION}" "${CMAKE_CURRENT_BINARY_DIR}/${name}")
325333
endif()
334+
ocv_cmake_hook(POST_MODULES_CREATE_${the_module})
326335
endforeach()
327336
endfunction()
328337

@@ -348,6 +357,7 @@ endfunction()
348357
# NB: must be called only once!
349358
# Usage: ocv_glob_modules(<main location> [<extra location> ...])
350359
macro(ocv_glob_modules main_root)
360+
ocv_cmake_hook(INIT_MODULES_GLOB)
351361
if(DEFINED OPENCV_INITIAL_PASS)
352362
message(FATAL_ERROR "OpenCV has already loaded its modules. Calling ocv_glob_modules second time is not allowed.")
353363
endif()
@@ -359,18 +369,23 @@ macro(ocv_glob_modules main_root)
359369
_assert_uniqueness("Duplicated modules LOCATIONS has been found" ${__main_paths} ${__extra_paths})
360370
_assert_uniqueness("Duplicated modules NAMES has been found" ${__main_names} ${__extra_names})
361371
set(OPENCV_PROCESSING_EXTRA_MODULES 0)
372+
ocv_cmake_hook(PRE_MODULES_SCAN)
362373
_add_modules_1(__main_paths __main_names)
363374
set(OPENCV_PROCESSING_EXTRA_MODULES 1)
375+
ocv_cmake_hook(PRE_MODULES_SCAN_EXTRA)
364376
_add_modules_1(__extra_paths __extra_names)
365377
ocv_clear_vars(__main_names __extra_names __main_paths __extra_paths)
378+
ocv_cmake_hook(POST_MODULES_SCAN)
366379

367380
# resolve dependencies
368381
__ocv_resolve_dependencies()
369382

370383
# create modules
371384
set(OPENCV_INITIAL_PASS OFF PARENT_SCOPE)
372385
set(OPENCV_INITIAL_PASS OFF)
386+
ocv_cmake_hook(PRE_MODULES_CREATE)
373387
_add_modules_2(${OPENCV_MODULES_BUILD})
388+
ocv_cmake_hook(POST_MODULES_CREATE)
374389
endmacro()
375390

376391

@@ -719,6 +734,10 @@ macro(ocv_set_module_sources)
719734
list(APPEND OPENCV_MODULE_${the_module}_SOURCES ${OPENCV_MODULE_${the_module}_SOURCES_DISPATCHED})
720735
endif()
721736

737+
# TODO Update hooks above
738+
ocv_cmake_hook(INIT_MODULE_SOURCES)
739+
ocv_cmake_hook(INIT_MODULE_SOURCES_${the_module})
740+
722741
# use full paths for module to be independent from the module location
723742
ocv_convert_to_full_paths(OPENCV_MODULE_${the_module}_HEADERS)
724743

@@ -885,6 +904,8 @@ macro(_ocv_create_module)
885904

886905
source_group("Include" FILES "${OPENCV_CONFIG_FILE_INCLUDE_DIR}/cvconfig.h" "${OPENCV_CONFIG_FILE_INCLUDE_DIR}/opencv2/opencv_modules.hpp")
887906
source_group("Src" FILES "${${the_module}_pch}")
907+
ocv_cmake_hook(PRE_CREATE_MODULE_LIBRARY)
908+
ocv_cmake_hook(PRE_CREATE_MODULE_LIBRARY_${the_module})
888909
ocv_add_library(${the_module} ${OPENCV_MODULE_TYPE} ${OPENCV_MODULE_${the_module}_HEADERS} ${OPENCV_MODULE_${the_module}_SOURCES}
889910
"${OPENCV_CONFIG_FILE_INCLUDE_DIR}/cvconfig.h" "${OPENCV_CONFIG_FILE_INCLUDE_DIR}/opencv2/opencv_modules.hpp"
890911
${${the_module}_pch}
@@ -967,6 +988,8 @@ macro(_ocv_create_module)
967988
endif()
968989

969990
# only "public" headers need to be installed
991+
ocv_cmake_hook(PRE_INSTALL_MODULE_HEADERS)
992+
ocv_cmake_hook(PRE_INSTALL_MODULE_HEADERS_${the_module})
970993
if(OPENCV_MODULE_${the_module}_HEADERS AND ";${OPENCV_MODULES_PUBLIC};" MATCHES ";${the_module};")
971994
foreach(hdr ${OPENCV_MODULE_${the_module}_HEADERS})
972995
string(REGEX REPLACE "^.*opencv2/" "opencv2/" hdr2 "${hdr}")
@@ -977,6 +1000,9 @@ macro(_ocv_create_module)
9771000
endif()
9781001

9791002
_ocv_add_precompiled_headers(${the_module})
1003+
1004+
ocv_cmake_hook(POST_CREATE_MODULE_LIBRARY)
1005+
ocv_cmake_hook(POST_CREATE_MODULE_LIBRARY_${the_module})
9801006
endmacro()
9811007

9821008
# opencv precompiled headers macro (can add pch to modules and tests)

cmake/OpenCVPackaging.cmake

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
1+
ocv_cmake_hook(INIT_CPACK)
2+
if(NOT EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
3+
message(STATUS "CPack is not found. SKIP")
4+
return()
5+
endif()
6+
27
set(CPACK_set_DESTDIR "on")
38

49
if(NOT OPENCV_CUSTOM_PACKAGE_INFO)
@@ -165,6 +170,6 @@ if(NOT OPENCV_CUSTOM_PACKAGE_INFO)
165170
set(CPACK_DEBIAN_COMPONENT_TESTS_NAME "lib${CMAKE_PROJECT_NAME}-tests")
166171
endif(NOT OPENCV_CUSTOM_PACKAGE_INFO)
167172

173+
ocv_cmake_hook(PRE_CPACK)
168174
include(CPack)
169-
170-
ENDif(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
175+
ocv_cmake_hook(POST_CPACK)

cmake/OpenCVUtils.cmake

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,52 @@ function(ocv_cmake_dump_vars)
2121
endif()
2222
endfunction()
2323

24+
25+
#
26+
# CMake script hooks support
27+
#
28+
option(OPENCV_DUMP_HOOKS_FLOW "Dump called OpenCV hooks" OFF)
29+
macro(ocv_cmake_hook_append hook_name)
30+
set(__var_name "__OPENCV_CMAKE_HOOKS_${hook_name}")
31+
set(__value "${${__var_name}}")
32+
message(STATUS "Registering hook '${hook_name}': ${ARGN}")
33+
list(APPEND __value ${ARGN})
34+
set(${__var_name} "${__value}" CACHE INTERNAL "")
35+
endmacro()
36+
macro(ocv_cmake_hook hook_name)
37+
set(__var_name "__OPENCV_CMAKE_HOOKS_${hook_name}")
38+
if(OPENCV_DUMP_HOOKS_FLOW)
39+
message(STATUS "Hook ${hook_name} ...")
40+
endif()
41+
foreach(__hook ${${__var_name}})
42+
#message(STATUS "Hook ${hook_name}: calling '${__hook}' ...")
43+
if(COMMAND "${__hook}")
44+
message(FATAL_ERROR "Indirect calling of CMake commands is not supported yet")
45+
else()
46+
include("${__hook}")
47+
endif()
48+
endforeach()
49+
endmacro()
50+
macro(ocv_cmake_reset_hooks)
51+
get_cmake_property(__variableNames VARIABLES)
52+
foreach(__variableName ${__variableNames})
53+
if(__variableName MATCHES "^__OPENCV_CMAKE_HOOKS_")
54+
unset(${__variableName})
55+
unset(${__variableName} CACHE)
56+
endif()
57+
endforeach()
58+
endmacro()
59+
macro(ocv_cmake_hook_register_dir dir)
60+
file(GLOB hook_files RELATIVE "${dir}" "${dir}/*.cmake")
61+
foreach(f ${hook_files})
62+
if(f MATCHES "^(.+)\\.cmake$")
63+
set(hook_name "${CMAKE_MATCH_1}")
64+
ocv_cmake_hook_append(${hook_name} "${dir}/${f}")
65+
endif()
66+
endforeach()
67+
endmacro()
68+
69+
2470
function(ocv_cmake_eval var_name)
2571
if(DEFINED ${var_name})
2672
file(WRITE "${CMAKE_BINARY_DIR}/CMakeCommand-${var_name}.cmake" ${${var_name}})

0 commit comments

Comments
 (0)