|
| 1 | +include(ExternalProject) |
| 2 | +include(GNUInstallDirs) |
| 3 | + |
1 | 4 | set(OPENCV_BUILD_DIR "${CMAKE_BINARY_DIR}/3rdparty/opencv_build") |
2 | | -file(MAKE_DIRECTORY "${OPENCV_BUILD_DIR}") |
3 | | - |
4 | | -execute_process( |
5 | | - COMMAND ${CMAKE_COMMAND} |
6 | | - -S "${CMAKE_SOURCE_DIR}/3rdparty/opencv" |
7 | | - -B "${OPENCV_BUILD_DIR}" |
8 | | - -G "${CMAKE_GENERATOR}" |
9 | | - -DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER} |
10 | | - -DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER} |
11 | | - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} |
12 | | - -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} |
13 | | - -DBUILD_PERF_TESTS=OFF |
14 | | - -DBUILD_TESTS=OFF |
15 | | - -DBUILD_opencv_apps=OFF |
16 | | - -DBUILD_JAVA=OFF |
17 | | - WORKING_DIRECTORY "${OPENCV_BUILD_DIR}" |
18 | | -) |
| 5 | +set(OPENCV_INSTALL_DIR "${CMAKE_BINARY_DIR}/3rdparty/opencv_install") |
| 6 | + |
| 7 | +set(OPENCV_C_COMPILER "${CMAKE_C_COMPILER}") |
| 8 | +set(OPENCV_CXX_COMPILER "${CMAKE_CXX_COMPILER}") |
| 9 | + |
| 10 | +get_filename_component(OPENCV_CXX_COMPILER_NAME "${CMAKE_CXX_COMPILER}" NAME) |
| 11 | +string(TOLOWER "${OPENCV_CXX_COMPILER_NAME}" OPENCV_CXX_COMPILER_NAME_LOWER) |
| 12 | + |
| 13 | +if(OPENCV_CXX_COMPILER_NAME_LOWER STREQUAL "acpp" |
| 14 | + OR OPENCV_CXX_COMPILER_NAME_LOWER STREQUAL "syclcc") |
| 15 | + get_filename_component(OPENCV_HOST_COMPILER_DIR "${CMAKE_C_COMPILER}" DIRECTORY) |
| 16 | + unset(OPENCV_CXX_COMPILER) |
| 17 | + find_program(OPENCV_CXX_COMPILER |
| 18 | + NAMES clang++ |
| 19 | + PATHS "${OPENCV_HOST_COMPILER_DIR}" |
| 20 | + NO_DEFAULT_PATH |
| 21 | + ) |
| 22 | + |
| 23 | + if(NOT OPENCV_CXX_COMPILER) |
| 24 | + find_program(OPENCV_CXX_COMPILER NAMES clang++) |
| 25 | + endif() |
| 26 | + |
| 27 | + if(NOT OPENCV_CXX_COMPILER) |
| 28 | + message(FATAL_ERROR |
| 29 | + "Unable to locate a host C++ compiler for the OpenCV external build") |
| 30 | + endif() |
| 31 | +endif() |
19 | 32 |
|
20 | | -execute_process( |
21 | | - COMMAND ${CMAKE_COMMAND} --build "${OPENCV_BUILD_DIR}" --config "${CMAKE_BUILD_TYPE}" |
22 | | - WORKING_DIRECTORY "${OPENCV_BUILD_DIR}" |
| 33 | +set(OPENCV_INITIAL_CACHE "${CMAKE_BINARY_DIR}/3rdparty/opencv_initial_cache.cmake") |
| 34 | +file(WRITE "${OPENCV_INITIAL_CACHE}" "") |
| 35 | +file(APPEND "${OPENCV_INITIAL_CACHE}" |
| 36 | + "set(CMAKE_C_COMPILER \"${OPENCV_C_COMPILER}\" CACHE FILEPATH \"\" FORCE)\n") |
| 37 | +file(APPEND "${OPENCV_INITIAL_CACHE}" |
| 38 | + "set(CMAKE_CXX_COMPILER \"${OPENCV_CXX_COMPILER}\" CACHE FILEPATH \"\" FORCE)\n") |
| 39 | + |
| 40 | +set(OPENCV_CMAKE_ARGS |
| 41 | + -C "${OPENCV_INITIAL_CACHE}" |
| 42 | + -G "${CMAKE_GENERATOR}" |
| 43 | + -DCMAKE_C_COMPILER:FILEPATH=${OPENCV_C_COMPILER} |
| 44 | + -DCMAKE_CXX_COMPILER:FILEPATH=${OPENCV_CXX_COMPILER} |
| 45 | + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} |
| 46 | + -DCMAKE_INSTALL_PREFIX=${OPENCV_INSTALL_DIR} |
| 47 | + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} |
| 48 | + -DBUILD_PERF_TESTS=OFF |
| 49 | + -DBUILD_TESTS=OFF |
| 50 | + -DBUILD_opencv_apps=OFF |
| 51 | + -DBUILD_opencv_java=OFF |
| 52 | + -DBUILD_opencv_js=OFF |
| 53 | + -DBUILD_opencv_objc=OFF |
| 54 | + -DBUILD_opencv_python2=OFF |
| 55 | + -DBUILD_opencv_python3=OFF |
| 56 | + -DBUILD_JAVA=OFF |
| 57 | + -DBUILD_opencv_world=ON |
| 58 | + -DWITH_FFMPEG=OFF |
| 59 | + -DWITH_EIGEN=OFF |
23 | 60 | ) |
24 | 61 |
|
| 62 | +if(APPLE) |
| 63 | + list(APPEND OPENCV_CMAKE_ARGS |
| 64 | + -DWITH_AVIF=OFF |
| 65 | + -DWITH_OPENEXR=OFF |
| 66 | + ) |
| 67 | +endif() |
| 68 | + |
| 69 | +if(CMAKE_C_COMPILER_LAUNCHER) |
| 70 | + list(APPEND OPENCV_CMAKE_ARGS |
| 71 | + -DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}) |
| 72 | +endif() |
| 73 | + |
| 74 | +if(CMAKE_CXX_COMPILER_LAUNCHER) |
| 75 | + list(APPEND OPENCV_CMAKE_ARGS |
| 76 | + -DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}) |
| 77 | +endif() |
| 78 | + |
| 79 | +set(OPENCV_VERSION_FILE |
| 80 | + "${CMAKE_SOURCE_DIR}/3rdparty/opencv/modules/core/include/opencv2/core/version.hpp") |
| 81 | +file(STRINGS "${OPENCV_VERSION_FILE}" OPENCV_VERSION_PARTS |
| 82 | + REGEX "#define CV_VERSION_[A-Z]+[ ]+") |
| 83 | +string(REGEX REPLACE ".+CV_VERSION_MAJOR[ ]+([0-9]+).*" "\\1" |
| 84 | + OPENCV_VERSION_MAJOR "${OPENCV_VERSION_PARTS}") |
| 85 | +string(REGEX REPLACE ".+CV_VERSION_MINOR[ ]+([0-9]+).*" "\\1" |
| 86 | + OPENCV_VERSION_MINOR "${OPENCV_VERSION_PARTS}") |
| 87 | +string(REGEX REPLACE ".+CV_VERSION_REVISION[ ]+([0-9]+).*" "\\1" |
| 88 | + OPENCV_VERSION_PATCH "${OPENCV_VERSION_PARTS}") |
| 89 | + |
| 90 | +set(OPENCV_WORLD_TARGET_NAME "opencv_world") |
| 91 | +set(OPENCV_WORLD_IMPORT_NAME "${OPENCV_WORLD_TARGET_NAME}") |
| 92 | +set(OPENCV_WORLD_RUNTIME_NAME "${OPENCV_WORLD_TARGET_NAME}") |
| 93 | + |
25 | 94 | if(WIN32) |
26 | | - file(GLOB OPENCV_DLLS "${OPENCV_BUILD_DIR}/bin/*.dll") |
27 | | - if(OPENCV_DLLS) |
28 | | - file(COPY ${OPENCV_DLLS} DESTINATION "${CMAKE_BINARY_DIR}/bin") |
| 95 | + set(OPENCV_WORLD_IMPORT_NAME |
| 96 | + "${OPENCV_WORLD_TARGET_NAME}${OPENCV_VERSION_MAJOR}${OPENCV_VERSION_MINOR}${OPENCV_VERSION_PATCH}") |
| 97 | + set(OPENCV_WORLD_RUNTIME_NAME "${OPENCV_WORLD_IMPORT_NAME}") |
| 98 | + if(CMAKE_BUILD_TYPE STREQUAL "Debug") |
| 99 | + string(APPEND OPENCV_WORLD_IMPORT_NAME "d") |
| 100 | + string(APPEND OPENCV_WORLD_RUNTIME_NAME "d") |
29 | 101 | endif() |
30 | 102 | endif() |
| 103 | + |
| 104 | +set(OPENCV_LIBRARY_DIR "${OPENCV_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}") |
| 105 | +set(OPENCV_RUNTIME_DIR "${OPENCV_INSTALL_DIR}/${CMAKE_INSTALL_BINDIR}") |
| 106 | +set(OPENCV_INCLUDE_DIR "${OPENCV_INSTALL_DIR}/include/opencv4") |
| 107 | + |
| 108 | +if(WIN32) |
| 109 | + set(OPENCV_WORLD_IMPLIB |
| 110 | + "${OPENCV_LIBRARY_DIR}/${OPENCV_WORLD_IMPORT_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}") |
| 111 | + set(OPENCV_WORLD_RUNTIME |
| 112 | + "${OPENCV_RUNTIME_DIR}/${OPENCV_WORLD_RUNTIME_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}") |
| 113 | +else() |
| 114 | + set(OPENCV_WORLD_IMPLIB |
| 115 | + "${OPENCV_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${OPENCV_WORLD_IMPORT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}") |
| 116 | + set(OPENCV_WORLD_RUNTIME "${OPENCV_WORLD_IMPLIB}") |
| 117 | +endif() |
| 118 | + |
| 119 | +set(OPENCV_INSTALL_BYPRODUCTS "${OPENCV_WORLD_IMPLIB}") |
| 120 | +if(NOT OPENCV_WORLD_RUNTIME STREQUAL OPENCV_WORLD_IMPLIB) |
| 121 | + list(APPEND OPENCV_INSTALL_BYPRODUCTS "${OPENCV_WORLD_RUNTIME}") |
| 122 | +endif() |
| 123 | + |
| 124 | +ExternalProject_Add( |
| 125 | + opencv_external |
| 126 | + SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/opencv" |
| 127 | + BINARY_DIR "${OPENCV_BUILD_DIR}" |
| 128 | + INSTALL_DIR "${OPENCV_INSTALL_DIR}" |
| 129 | + CMAKE_ARGS ${OPENCV_CMAKE_ARGS} |
| 130 | + INSTALL_BYPRODUCTS ${OPENCV_INSTALL_BYPRODUCTS} |
| 131 | + BUILD_ALWAYS OFF |
| 132 | + LOG_CONFIGURE ON |
| 133 | + LOG_BUILD ON |
| 134 | + LOG_INSTALL ON |
| 135 | +) |
| 136 | + |
| 137 | +add_library(opencv_world_external SHARED IMPORTED GLOBAL) |
| 138 | +add_dependencies(opencv_world_external opencv_external) |
| 139 | +set_target_properties(opencv_world_external PROPERTIES |
| 140 | + IMPORTED_LOCATION "${OPENCV_WORLD_RUNTIME}" |
| 141 | + INTERFACE_INCLUDE_DIRECTORIES "${OPENCV_INCLUDE_DIR}" |
| 142 | +) |
| 143 | + |
| 144 | +if(WIN32) |
| 145 | + set_target_properties(opencv_world_external PROPERTIES |
| 146 | + IMPORTED_IMPLIB "${OPENCV_WORLD_IMPLIB}" |
| 147 | + ) |
| 148 | +endif() |
| 149 | + |
| 150 | +add_library(OpenCV_unified INTERFACE) |
| 151 | +add_dependencies(OpenCV_unified opencv_external) |
| 152 | +target_include_directories(OpenCV_unified INTERFACE "${OPENCV_INCLUDE_DIR}") |
| 153 | +target_link_libraries(OpenCV_unified INTERFACE opencv_world_external) |
| 154 | + |
| 155 | +if(CMAKE_BUILD_RPATH) |
| 156 | + set(CMAKE_BUILD_RPATH "${OPENCV_LIBRARY_DIR};${CMAKE_BUILD_RPATH}") |
| 157 | +else() |
| 158 | + set(CMAKE_BUILD_RPATH "${OPENCV_LIBRARY_DIR}") |
| 159 | +endif() |
| 160 | + |
| 161 | +if(WIN32) |
| 162 | + add_custom_target(copy_opencv_runtime ALL |
| 163 | + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/bin" |
| 164 | + COMMAND ${CMAKE_COMMAND} -E copy_if_different |
| 165 | + "${OPENCV_WORLD_RUNTIME}" |
| 166 | + "${CMAKE_BINARY_DIR}/bin/" |
| 167 | + DEPENDS opencv_external |
| 168 | + COMMENT "Copying OpenCV runtime library" |
| 169 | + ) |
| 170 | + add_dependencies(OpenCV_unified copy_opencv_runtime) |
| 171 | +endif() |
0 commit comments