From 0384eb7d8c1a31831704e31b8bdbfbc6ff854281 Mon Sep 17 00:00:00 2001 From: Vadim Levin Date: Tue, 25 Aug 2020 13:11:08 +0300 Subject: [PATCH] 3rdparty: integrate OpenJPEG build to the OpenCV CMake - adopted build scripts - OpenJPEG build warnings are suppressed --- 3rdparty/openjpeg/CMakeLists.txt | 341 ++++-------------- 3rdparty/openjpeg/openjp2/CMakeLists.txt | 195 ++-------- CMakeLists.txt | 6 +- cmake/OpenCVFindLibsGrfmt.cmake | 23 +- .../imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp | 2 +- 5 files changed, 127 insertions(+), 440 deletions(-) diff --git a/3rdparty/openjpeg/CMakeLists.txt b/3rdparty/openjpeg/CMakeLists.txt index 3ea2424a402b..ec15bba85003 100644 --- a/3rdparty/openjpeg/CMakeLists.txt +++ b/3rdparty/openjpeg/CMakeLists.txt @@ -1,33 +1,15 @@ +# Build scripts are adopted to OpenCV project # Main CMakeLists.txt to build the OpenJPEG project using CMake (www.cmake.org) # Written by Mathieu Malaterre -# This CMake project will by default create a library called openjpeg -# But if you want to use this project within your own (CMake) project -# you will eventually like to prefix the library to avoid linking confusion -# For this purpose you can define a CMake var: OPENJPEG_NAMESPACE to whatever you like -# e.g.: -# set(OPENJPEG_NAMESPACE "GDCMOPENJPEG") -cmake_minimum_required(VERSION 2.8.2) - -if(COMMAND CMAKE_POLICY) - cmake_policy(SET CMP0003 NEW) - if (NOT (${CMAKE_VERSION} VERSION_LESS 3.0)) - cmake_policy(SET CMP0042 NEW) - endif() -endif() - -if(NOT OPENJPEG_NAMESPACE) - set(OPENJPEG_NAMESPACE "OPENJPEG") - set(OPENJPEG_STANDALONE 1) +cmake_policy(SET CMP0003 NEW) +if(POLICY CMP0042) + cmake_policy(SET CMP0042 NEW) endif() -# In all cases: -#string(TOLOWER ${OPENJPEG_NAMESPACE} OPENJPEG_LIBRARY_NAME) -set(OPENJPEG_LIBRARY_NAME openjp2) -project(${OPENJPEG_NAMESPACE}) +set(OPENJPEG_LIBRARY_NAME libopenjp2) -# Do full dependency headers. -include_regular_expression("^.*$") +project(openjpeg C) #----------------------------------------------------------------------------- # OPENJPEG version number, useful for packaging and doxygen doc: @@ -62,17 +44,19 @@ set(PACKAGE_VERSION # cmake -DOPENJPEG_SOVERSION:STRING=42 /path/to/openjpeg if(NOT OPENJPEG_SOVERSION) set(OPENJPEG_SOVERSION 7) -endif(NOT OPENJPEG_SOVERSION) +endif() + set(OPENJPEG_LIBRARY_PROPERTIES VERSION "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}" SOVERSION "${OPENJPEG_SOVERSION}" ) -# -------------------------------------------------------------------------- -# Path to additional CMake modules -set(CMAKE_MODULE_PATH - ${${OPENJPEG_NAMESPACE}_SOURCE_DIR}/cmake - ${CMAKE_MODULE_PATH}) +set(OPENJPEG_BUILD "opencv-${OPENCV_VERSION}-openjp2-${OPENJPEG_VERSION}") +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(OPENJPEG_BUILD "${OPENJPEG_BUILD}-debug") +endif() + +message(STATUS "OpenJPEG: VERSION = ${OPENJPEG_VERSION}, BUILD = ${OPENJPEG_BUILD}") # -------------------------------------------------------------------------- # On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security @@ -100,112 +84,30 @@ if(WIN32) endif() endif() - -# -------------------------------------------------------------------------- -# Install directories -# Build DOCUMENTATION (not in ALL target and only if Doxygen is found) -option(BUILD_DOC "Build the HTML documentation (with doxygen if available)." OFF) - -string(TOLOWER ${PROJECT_NAME} projectname) -set(OPENJPEG_INSTALL_SUBDIR "${projectname}-${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}") - -if(NOT OPENJPEG_INSTALL_BIN_DIR) - set(OPENJPEG_INSTALL_BIN_DIR "bin") -endif() - -if(NOT OPENJPEG_INSTALL_LIB_DIR) - set(OPENJPEG_INSTALL_LIB_DIR "lib") -endif() - -if(NOT OPENJPEG_INSTALL_SHARE_DIR) - set(OPENJPEG_INSTALL_SHARE_DIR "share") -endif() - -if(NOT OPENJPEG_INSTALL_DATA_DIR) - set(OPENJPEG_INSTALL_DATA_DIR "${OPENJPEG_INSTALL_SHARE_DIR}/${OPENJPEG_INSTALL_SUBDIR}") -endif() - -if(NOT OPENJPEG_INSTALL_INCLUDE_DIR) - set(OPENJPEG_INSTALL_INCLUDE_DIR "include/${OPENJPEG_INSTALL_SUBDIR}") -endif() - -if(BUILD_DOC) -if(NOT OPENJPEG_INSTALL_MAN_DIR) - set(OPENJPEG_INSTALL_MAN_DIR "share/man/") -endif() - -if(NOT OPENJPEG_INSTALL_DOC_DIR) - set(OPENJPEG_INSTALL_DOC_DIR "share/doc/${OPENJPEG_INSTALL_SUBDIR}") -endif() -endif() - -if(NOT OPENJPEG_INSTALL_JNI_DIR) - if(WIN32) - set(OPENJPEG_INSTALL_JNI_DIR ${OPENJPEG_INSTALL_BIN_DIR}) - else() - set(OPENJPEG_INSTALL_JNI_DIR ${OPENJPEG_INSTALL_LIB_DIR}) - endif() -endif() - -if(NOT OPENJPEG_INSTALL_PACKAGE_DIR) - # We could install *.cmake files in share/ however those files contains - # hardcoded path to libraries on a multi-arch system (fedora/debian) those - # path will be different (lib/i386-linux-gnu vs lib/x86_64-linux-gnu) - set(OPENJPEG_INSTALL_PACKAGE_DIR "${OPENJPEG_INSTALL_LIB_DIR}/${OPENJPEG_INSTALL_SUBDIR}") -endif() - -if (APPLE) - list(APPEND OPENJPEG_LIBRARY_PROPERTIES INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${OPENJPEG_INSTALL_LIB_DIR}") - option(OPJ_USE_DSYMUTIL "Call dsymutil on binaries after build." OFF) -endif() - #----------------------------------------------------------------------------- # Big endian test: -include (${CMAKE_ROOT}/Modules/TestBigEndian.cmake) -TEST_BIG_ENDIAN(OPJ_BIG_ENDIAN) - -#----------------------------------------------------------------------------- -# Setup file for setting custom ctest vars -configure_file( - ${${OPENJPEG_NAMESPACE}_SOURCE_DIR}/cmake/CTestCustom.cmake.in - ${${OPENJPEG_NAMESPACE}_BINARY_DIR}/CTestCustom.cmake - @ONLY - ) - -#----------------------------------------------------------------------------- -# OpenJPEG build configuration options. -option(BUILD_SHARED_LIBS "Build OpenJPEG shared library and link executables against it." ON) -option(BUILD_STATIC_LIBS "Build OpenJPEG static library." ON) -set (EXECUTABLE_OUTPUT_PATH ${OPENJPEG_BINARY_DIR}/bin CACHE PATH "Single output directory for building all executables.") -set (LIBRARY_OUTPUT_PATH ${OPENJPEG_BINARY_DIR}/bin CACHE PATH "Single output directory for building all libraries.") -mark_as_advanced(LIBRARY_OUTPUT_PATH EXECUTABLE_OUTPUT_PATH) - -#----------------------------------------------------------------------------- -# configure name mangling to allow multiple libraries to coexist -# peacefully -if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in) -set(MANGLE_PREFIX ${OPENJPEG_LIBRARY_NAME}) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in - ${CMAKE_CURRENT_BINARY_DIR}/openjpeg_mangle.h - @ONLY) -endif() - -#----------------------------------------------------------------------------- -# Compiler specific flags: -if(CMAKE_COMPILER_IS_GNUCC) - # For all builds, make sure openjpeg is std99 compliant: - # set(CMAKE_C_FLAGS "-Wall -std=c99 ${CMAKE_C_FLAGS}") # FIXME: this setting prevented us from setting a coverage build. - # Do not use ffast-math for all build, it would produce incorrect results, only set for release: - set(OPENJPEG_LIBRARY_COMPILE_OPTIONS ${OPENJPEG_LIBRARY_COMPILE_OPTIONS} "$<$:-ffast-math>") - set(OPENJP2_COMPILE_OPTIONS ${OPENJP2_COMPILE_OPTIONS} "$<$:-ffast-math>" -Wall -Wextra -Wconversion -Wunused-parameter -Wdeclaration-after-statement -Werror=declaration-after-statement) -endif() +include(TestBigEndian) +test_big_endian(OPJ_BIG_ENDIAN) #----------------------------------------------------------------------------- # opj_config.h generation (1/2) # Check if some include files are provided by the system -include(EnsureFileInclude) -# These files are mandatory +# These files are mandatory, so if they are not provided OpenJPEG library can't be built +include(CheckIncludeFile) +macro(ensure_file_include INCLUDE_FILENAME VARIABLE_NAME MANDATORY_STATUS) + check_include_file(${INCLUDE_FILENAME} ${VARIABLE_NAME}) + if(NOT ${VARIABLE_NAME}) + if(${MANDATORY_STATUS}) + message(STATUS "The file '${INCLUDE_FILENAME}' is mandatory for OpenJPEG build, but not found on your system") + return() + else() + message(STATUS "The file '${INCLUDE_FILENAME}' is optional for OpenJPEG build and not found on your system." + " Internal implementation will be used.") + endif() + endif() +endmacro() + ensure_file_include("string.h" HAVE_STRING_H YES) ensure_file_include("memory.h" HAVE_MEMORY_H YES) ensure_file_include("stdlib.h" HAVE_STDLIB_H YES) @@ -222,16 +124,11 @@ ensure_file_include("stdint.h" OPJ_HAVE_STDINT_H NO) ensure_file_include("inttypes.h" OPJ_HAVE_INTTYPES_H NO) # why check this one ? for openjpip ? -include (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake) CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H) CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H) CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H) CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H) -# Enable Large file support -include(TestLargeFiles) -OPJ_TEST_LARGE_FILES(OPJ_HAVE_LARGEFILES) - # Allocating Aligned Memory Blocks include(CheckIncludeFiles) check_include_files(malloc.h OPJ_HAVE_MALLOC_H) @@ -239,158 +136,58 @@ include(CheckSymbolExists) # _aligned_alloc https://msdn.microsoft.com/en-us/library/8z34s9c6.aspx check_symbol_exists(_aligned_malloc malloc.h OPJ_HAVE__ALIGNED_MALLOC) # posix_memalign (needs _POSIX_C_SOURCE >= 200112L on Linux) +set(_prev_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}) set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200112L) check_symbol_exists(posix_memalign stdlib.h OPJ_HAVE_POSIX_MEMALIGN) -unset(CMAKE_REQUIRED_DEFINITIONS) +set(CMAKE_REQUIRED_DEFINITIONS ${_prev_CMAKE_REQUIRED_DEFINITIONS}) +unset(_prev_CMAKE_REQUIRED_DEFINITIONS) # memalign (obsolete) check_symbol_exists(memalign malloc.h OPJ_HAVE_MEMALIGN) -#----------------------------------------------------------------------------- -# Build Library -if(BUILD_JPIP_SERVER) - find_package(CURL REQUIRED) - find_package(FCGI REQUIRED) - find_package(Threads REQUIRED) - if(NOT CMAKE_USE_PTHREADS_INIT) - message(FATAL_ERROR "Only pthread are supported") - endif() -endif() -add_subdirectory(src/lib) -option(BUILD_LUTS_GENERATOR "Build utility to generate t1_luts.h" OFF) -option(BUILD_UNIT_TESTS "Build unit tests (bench_dwt, test_sparse_array, etc..)" OFF) - -#----------------------------------------------------------------------------- -# Build Applications -option(BUILD_CODEC "Build the CODEC executables" ON) -option(BUILD_MJ2 "Build the MJ2 executables." OFF) -option(BUILD_JPWL "Build the JPWL library and executables" OFF) -option(BUILD_JPIP "Build the JPIP library and executables." OFF) -if(BUILD_JPIP) - option(BUILD_JPIP_SERVER "Build the JPIP server." OFF) -endif() -option(BUILD_VIEWER "Build the OPJViewer executable (C++)" OFF) -option(BUILD_JAVA "Build the openjpeg jar (Java)" OFF) -option(BUILD_JP3D "Build the JP3D comp" OFF) -mark_as_advanced(BUILD_VIEWER) -mark_as_advanced(BUILD_JAVA) -mark_as_advanced(BUILD_JP3D) - -if(BUILD_CODEC OR BUILD_MJ2) - # OFF: It will only build 3rd party libs if they are not found on the system - # ON: 3rd party libs will ALWAYS be build, and used - option(BUILD_THIRDPARTY "Build the thirdparty executables if it is needed" OFF) - add_subdirectory(thirdparty) - add_subdirectory(src/bin) -endif () -add_subdirectory(wrapping) - #----------------------------------------------------------------------------- # opj_config.h generation (2/2) configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjp2/opj_config.h.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/src/lib/openjp2/opj_config.h - @ONLY - ) - - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjp2/opj_config_private.h.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/src/lib/openjp2/opj_config_private.h - @ONLY - ) - -#----------------------------------------------------------------------------- -# build documentation in doc subdir: -if(BUILD_DOC) - add_subdirectory(doc) -endif() - -#----------------------------------------------------------------------------- -# Buld Testing -option(BUILD_TESTING "Build the tests." OFF) -if(BUILD_TESTING) - if(BUILD_CODEC) - enable_testing() - include(CTest) - - # Search openjpeg data needed for the tests - # They could be found via git on the OpenJPEG GitHub code project - # git clone https://github.com/uclouvain/openjpeg-data.git - find_path(OPJ_DATA_ROOT README-OPJ-Data - PATHS $ENV{OPJ_DATA_ROOT} ${CMAKE_SOURCE_DIR}/../data - NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH - ) - - # Add repository where to find tests - add_subdirectory(tests) - - else() - message(FATAL_ERROR "You need build codec to run the tests") - endif() -endif() + ${CMAKE_CURRENT_LIST_DIR}/openjp2/opj_config.h.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/openjp2/opj_config.h + @ONLY +) -#----------------------------------------------------------------------------- -# install all targets referenced as OPENJPEGTargets -install(EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR}) -configure_file( ${${OPENJPEG_NAMESPACE}_SOURCE_DIR}/cmake/OpenJPEGConfig.cmake.in - ${${OPENJPEG_NAMESPACE}_BINARY_DIR}/OpenJPEGConfig.cmake +configure_file( + ${CMAKE_CURRENT_LIST_DIR}/openjp2/opj_config_private.h.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/openjp2/opj_config_private.h @ONLY ) -install( FILES ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake - DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR} + +add_subdirectory(openjp2) + +set_target_properties(${OPENJPEG_LIBRARY_NAME} + PROPERTIES + OUTPUT_NAME ${OPENJPEG_LIBRARY_NAME} + DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" + COMPILE_PDB_NAME ${OPENJPEG_LIBRARY_NAME} + COMPILE_PDB_NAME_DEBUG "${OPENJPEG_LIBRARY_NAME}${OPENCV_DEBUG_POSTFIX}" + ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} ) -#----------------------------------------------------------------------------- -# install CHANGES and LICENSE -if(BUILD_DOC) -if(EXISTS ${OPENJPEG_SOURCE_DIR}/CHANGES) - install(FILES CHANGES DESTINATION ${OPENJPEG_INSTALL_DOC_DIR}) +if(ENABLE_SOLUTION_FOLDERS) + set_target_properties(${OPENJPEG_LIBRARY_NAME} + PROPERTIES + FOLDER "3rdparty" + ) endif() -install(FILES LICENSE DESTINATION ${OPENJPEG_INSTALL_DOC_DIR}) -endif() +ocv_install_3rdparty_licenses(${OPENJPEG_LIBRARY_NAME} README.md LICENSE) -include (cmake/OpenJPEGCPack.cmake) +# Setting all necessary variables +set(OPENJPEG_LIBRARIES ${OPENJPEG_LIBRARY_NAME} PARENT_SCOPE) +set(OPENJPEG_VERSION ${OPENJPEG_VERSION} PARENT_SCOPE) +set(OPENJPEG_MAJOR_VERSION ${OPENJPEG_VERSION_MAJOR} PARENT_SCOPE) +set(OPENJPEG_MINOR_VERSION ${OPENJPEG_VERSION_MINOR} PARENT_SCOPE) +set(OPENJPEG_BUILD_VERSION ${OPENJPEG_VERSION_BUILD} PARENT_SCOPE) +get_target_property(_openjpeg_include_dirs ${OPENJPEG_LIBRARY_NAME} INCLUDE_DIRECTORIES) +set(OPENJPEG_INCLUDE_DIRS ${_openjpeg_include_dirs} PARENT_SCOPE) -#----------------------------------------------------------------------------- -# pkgconfig support -# enabled by default on Unix or if using GCC, disabled by default on other platforms -if(UNIX OR CMAKE_COMPILER_IS_GNUCC) - option(BUILD_PKGCONFIG_FILES "Build and install pkg-config files" ON) -else() - option(BUILD_PKGCONFIG_FILES "Build and install pkg-config files" OFF) +# OpenJPEG can't be built only if configuration script doesn't encounter any problem +if(NOT DEFINED OCV_CAN_BUILD_OPENJPEG) + # all prerequisites are fulfilled + set(OCV_CAN_BUILD_OPENJPEG TRUE PARENT_SCOPE) endif() -if(BUILD_PKGCONFIG_FILES) - # install in lib and not share (see multi-arch note above) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjp2/libopenjp2.pc.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/libopenjp2.pc @ONLY) - install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjp2.pc DESTINATION - ${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig ) -# - if(BUILD_JPWL) - # install in lib and not share (see multi-arch note above) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjpwl/libopenjpwl.pc.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/libopenjpwl.pc @ONLY) - install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjpwl.pc DESTINATION - ${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig ) - endif() -# - if(BUILD_JPIP) - # install in lib and not share (see multi-arch note above) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjpip/libopenjpip.pc.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/libopenjpip.pc @ONLY) - install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjpip.pc DESTINATION - ${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig ) - endif() -# - if(BUILD_JP3D) - # install in lib and not share (see multi-arch note above) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjp3d/libopenjp3d.pc.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/libopenjp3d.pc @ONLY) - install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjp3d.pc DESTINATION - ${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig ) - endif() -endif() - -#----------------------------------------------------------------------------- - -# build our version of astyle -SET (WITH_ASTYLE FALSE CACHE BOOL "If you plan to contribute you should reindent with scripts/prepare-commit.sh (using 'our' astyle)") diff --git a/3rdparty/openjpeg/openjp2/CMakeLists.txt b/3rdparty/openjpeg/openjp2/CMakeLists.txt index b2714858211c..7decabe21081 100644 --- a/3rdparty/openjpeg/openjp2/CMakeLists.txt +++ b/3rdparty/openjpeg/openjp2/CMakeLists.txt @@ -1,75 +1,27 @@ -include_regular_expression("^.*$") - -# -install( FILES ${CMAKE_CURRENT_BINARY_DIR}/opj_config.h - DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers) - -include_directories( - ${${OPENJPEG_NAMESPACE}_BINARY_DIR}/src/lib/openjp2 # opj_config.h and opj_config_private.h -) # Defines the source code for the library set(OPENJPEG_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/thread.c - ${CMAKE_CURRENT_SOURCE_DIR}/thread.h ${CMAKE_CURRENT_SOURCE_DIR}/bio.c - ${CMAKE_CURRENT_SOURCE_DIR}/bio.h ${CMAKE_CURRENT_SOURCE_DIR}/cio.c - ${CMAKE_CURRENT_SOURCE_DIR}/cio.h ${CMAKE_CURRENT_SOURCE_DIR}/dwt.c - ${CMAKE_CURRENT_SOURCE_DIR}/dwt.h ${CMAKE_CURRENT_SOURCE_DIR}/event.c - ${CMAKE_CURRENT_SOURCE_DIR}/event.h ${CMAKE_CURRENT_SOURCE_DIR}/image.c - ${CMAKE_CURRENT_SOURCE_DIR}/image.h ${CMAKE_CURRENT_SOURCE_DIR}/invert.c - ${CMAKE_CURRENT_SOURCE_DIR}/invert.h ${CMAKE_CURRENT_SOURCE_DIR}/j2k.c - ${CMAKE_CURRENT_SOURCE_DIR}/j2k.h ${CMAKE_CURRENT_SOURCE_DIR}/jp2.c - ${CMAKE_CURRENT_SOURCE_DIR}/jp2.h ${CMAKE_CURRENT_SOURCE_DIR}/mct.c - ${CMAKE_CURRENT_SOURCE_DIR}/mct.h ${CMAKE_CURRENT_SOURCE_DIR}/mqc.c - ${CMAKE_CURRENT_SOURCE_DIR}/mqc.h - ${CMAKE_CURRENT_SOURCE_DIR}/mqc_inl.h ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg.c - ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg.h ${CMAKE_CURRENT_SOURCE_DIR}/opj_clock.c - ${CMAKE_CURRENT_SOURCE_DIR}/opj_clock.h ${CMAKE_CURRENT_SOURCE_DIR}/pi.c - ${CMAKE_CURRENT_SOURCE_DIR}/pi.h ${CMAKE_CURRENT_SOURCE_DIR}/t1.c - ${CMAKE_CURRENT_SOURCE_DIR}/t1.h ${CMAKE_CURRENT_SOURCE_DIR}/t2.c - ${CMAKE_CURRENT_SOURCE_DIR}/t2.h ${CMAKE_CURRENT_SOURCE_DIR}/tcd.c - ${CMAKE_CURRENT_SOURCE_DIR}/tcd.h ${CMAKE_CURRENT_SOURCE_DIR}/tgt.c - ${CMAKE_CURRENT_SOURCE_DIR}/tgt.h ${CMAKE_CURRENT_SOURCE_DIR}/function_list.c - ${CMAKE_CURRENT_SOURCE_DIR}/function_list.h - ${CMAKE_CURRENT_SOURCE_DIR}/opj_codec.h - ${CMAKE_CURRENT_SOURCE_DIR}/opj_includes.h - ${CMAKE_CURRENT_SOURCE_DIR}/opj_intmath.h ${CMAKE_CURRENT_SOURCE_DIR}/opj_malloc.c - ${CMAKE_CURRENT_SOURCE_DIR}/opj_malloc.h - ${CMAKE_CURRENT_SOURCE_DIR}/opj_stdint.h ${CMAKE_CURRENT_SOURCE_DIR}/sparse_array.c - ${CMAKE_CURRENT_SOURCE_DIR}/sparse_array.h ) -if(BUILD_JPIP) - add_definitions(-DUSE_JPIP) - set(OPENJPEG_SRCS - ${OPENJPEG_SRCS} - ${CMAKE_CURRENT_SOURCE_DIR}/cidx_manager.c - ${CMAKE_CURRENT_SOURCE_DIR}/cidx_manager.h - ${CMAKE_CURRENT_SOURCE_DIR}/phix_manager.c - ${CMAKE_CURRENT_SOURCE_DIR}/ppix_manager.c - ${CMAKE_CURRENT_SOURCE_DIR}/thix_manager.c - ${CMAKE_CURRENT_SOURCE_DIR}/tpix_manager.c - ${CMAKE_CURRENT_SOURCE_DIR}/indexbox_manager.h - ) -endif() option(OPJ_DISABLE_TPSOT_FIX "Disable TPsot==TNsot fix. See https://github.com/uclouvain/openjpeg/issues/254." OFF) if(OPJ_DISABLE_TPSOT_FIX) @@ -77,142 +29,63 @@ if(OPJ_DISABLE_TPSOT_FIX) endif() # Special case for old i586-mingw32msvc-gcc cross compiler -if(NOT WIN32 AND CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER MATCHES ".*mingw32msvc.*" ) - set(WIN32 YES) -endif() - -# Build the library -if(WIN32) - if(BUILD_SHARED_LIBS) - add_definitions(-DOPJ_EXPORTS) - else() - add_definitions(-DOPJ_STATIC) - endif() - add_library(${OPENJPEG_LIBRARY_NAME} ${OPENJPEG_SRCS}) - set(INSTALL_LIBS ${OPENJPEG_LIBRARY_NAME}) -else() - if(BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS) - # Builds both static and dynamic libs - add_library(${OPENJPEG_LIBRARY_NAME} SHARED ${OPENJPEG_SRCS}) - add_library(openjp2_static STATIC ${OPENJPEG_SRCS}) - set_target_properties(openjp2_static PROPERTIES OUTPUT_NAME ${OPENJPEG_LIBRARY_NAME}) - set(INSTALL_LIBS ${OPENJPEG_LIBRARY_NAME} openjp2_static) - else() - add_library(${OPENJPEG_LIBRARY_NAME} ${OPENJPEG_SRCS}) - set(INSTALL_LIBS ${OPENJPEG_LIBRARY_NAME}) - endif() -endif() +# if(NOT WIN32 AND CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER MATCHES ".*mingw32msvc.*" ) +# set(WIN32 YES) +# endif() -if(UNIX) - target_link_libraries(${OPENJPEG_LIBRARY_NAME} m) -endif() -set_target_properties(${OPENJPEG_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) -if(NOT ${CMAKE_VERSION} VERSION_LESS "2.8.12") - target_compile_options(${OPENJPEG_LIBRARY_NAME} PRIVATE ${OPENJP2_COMPILE_OPTIONS}) -endif() +ocv_warnings_disable(CMAKE_C_FLAGS -Wundef -Wstrict-prototypes -Wcast-function-type) -# Install library -install(TARGETS ${INSTALL_LIBS} - EXPORT OpenJPEGTargets - RUNTIME DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications - LIBRARY DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries - ARCHIVE DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries -) +add_library(${OPENJPEG_LIBRARY_NAME} STATIC ${OPENJPEG_SRCS}) -# Install includes files -install(FILES openjpeg.h opj_stdint.h - DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers -) +target_compile_definitions(${OPENJPEG_LIBRARY_NAME} PUBLIC OPJ_STATIC) -if(BUILD_DOC) -# install man page of the library -install( - FILES ${OPENJPEG_SOURCE_DIR}/doc/man/man3/libopenjp2.3 - DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man3) -endif() +ocv_include_directories("${CMAKE_CURRENT_LIST_DIR}" "${CMAKE_CURRENT_BINARY_DIR}") -if(BUILD_LUTS_GENERATOR) -# internal utility to generate t1_luts.h (part of the jp2 lib) -# no need to install: - add_executable(t1_generate_luts t1_generate_luts.c) - if(UNIX) - target_link_libraries(t1_generate_luts m) - endif() -endif() - -# Experimental option; let's how cppcheck performs -# Implementation details: -# I could not figure out how to easily upload a file to CDash. Instead simply -# pretend cppcheck is part of the Build step. Technically cppcheck can even -# output gcc formatted error/warning report -# Another implementation detail: I could not redirect error to the error -# catching mechanism something is busted in cmake 2.8.5, I had to use the -# warning regex to catch them. -if(OPENJPEG_CPPCHECK) - find_package(CPPCHECK REQUIRED) - foreach(f ${OPENJPEG_SRCS}) - # cppcheck complains about too many configuration, pretend to be WIN32: - add_custom_command(TARGET ${OPENJPEG_LIBRARY_NAME} - COMMAND ${CPPCHECK_EXECUTABLE} -DWIN32 ${f}) - endforeach() +if(UNIX) + target_link_libraries(${OPENJPEG_LIBRARY_NAME} PRIVATE m) endif() -if(OPJ_USE_DSYMUTIL) - if(BUILD_SHARED_LIBS) - add_custom_command(TARGET ${OPENJPEG_LIBRARY_NAME} POST_BUILD - COMMAND "dsymutil" "$" - COMMENT "dsymutil $" - DEPENDS ${OPENJPEG_LIBRARY_NAME}) - endif() -endif() +set_target_properties(${OPENJPEG_LIBRARY_NAME} + PROPERTIES + ${OPENJPEG_LIBRARY_PROPERTIES} +) ################################################################################# # threading configuration ################################################################################# -set(CMAKE_THREAD_PREFER_PTHREAD TRUE) option(OPJ_USE_THREAD "Build with thread/mutex support " ON) if(NOT OPJ_USE_THREAD) - add_definitions( -DMUTEX_stub) -endif(NOT OPJ_USE_THREAD) + add_definitions(-DMUTEX_stub) +endif() find_package(Threads QUIET) if(OPJ_USE_THREAD AND WIN32 AND NOT Threads_FOUND ) - add_definitions( -DMUTEX_win32) - set(Threads_FOUND YES) + add_definitions(-DMUTEX_win32) + set(Threads_FOUND YES) endif() -if(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_WIN32_THREADS_INIT ) - add_definitions( -DMUTEX_win32) -endif(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_WIN32_THREADS_INIT ) +if(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_WIN32_THREADS_INIT) + add_definitions(-DMUTEX_win32) +endif() if(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT ) - add_definitions( -DMUTEX_pthread) -endif(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT ) + add_definitions(-DMUTEX_pthread) +endif() if(OPJ_USE_THREAD AND NOT Threads_FOUND) - message(FATAL_ERROR "No thread library found and thread/mutex support is required by OPJ_USE_THREAD option") -endif(OPJ_USE_THREAD AND NOT Threads_FOUND) + message(STATUS "No thread library found and thread/mutex support is required by OPJ_USE_THREAD option") + set(OCV_CAN_BUILD_OPENJPEG FALSE PARENT_SCOPE) +endif() if(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT) - TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME} ${CMAKE_THREAD_LIBS_INIT}) -endif(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT) - -if(BUILD_UNIT_TESTS) - add_executable(bench_dwt bench_dwt.c) - if(UNIX) - target_link_libraries(bench_dwt m ${OPENJPEG_LIBRARY_NAME}) - endif() - if(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT) - target_link_libraries(bench_dwt ${CMAKE_THREAD_LIBS_INIT}) - endif(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT) - - add_executable(test_sparse_array test_sparse_array.c) - if(UNIX) - target_link_libraries(test_sparse_array m ${OPENJPEG_LIBRARY_NAME}) - endif() - if(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT) - target_link_libraries(test_sparse_array ${CMAKE_THREAD_LIBS_INIT}) - endif(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT) -endif(BUILD_UNIT_TESTS) + target_link_libraries(${OPENJPEG_LIBRARY_NAME} PRIVATE ${CMAKE_THREAD_LIBS_INIT}) +endif() + +if(NOT BUILD_SHARED_LIBS) + ocv_install_target(${OPENJPEG_LIBRARY_NAME} + EXPORT OpenCVModules + ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev + ) +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 3273eda4dabb..ff8b160b4cad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,6 +209,7 @@ OCV_OPTION(OPENCV_ENABLE_NONFREE "Enable non-free algorithms" OFF) OCV_OPTION(OPENCV_FORCE_3RDPARTY_BUILD "Force using 3rdparty code from source" OFF) OCV_OPTION(BUILD_ZLIB "Build zlib from source" (WIN32 OR APPLE OR OPENCV_FORCE_3RDPARTY_BUILD) ) OCV_OPTION(BUILD_TIFF "Build libtiff from source" (WIN32 OR ANDROID OR APPLE OR OPENCV_FORCE_3RDPARTY_BUILD) ) +OCV_OPTION(BUILD_OPENJPEG "Build OpenJPEG from source" (WIN32 OR ANDRIOD OR APPLE OR OPENCV_FORCE_3RDPARTY_BUILD) ) OCV_OPTION(BUILD_JASPER "Build libjasper from source" (WIN32 OR ANDROID OR APPLE OR OPENCV_FORCE_3RDPARTY_BUILD) ) OCV_OPTION(BUILD_JPEG "Build libjpeg from source" (WIN32 OR ANDROID OR APPLE OR OPENCV_FORCE_3RDPARTY_BUILD) ) OCV_OPTION(BUILD_PNG "Build libpng from source" (WIN32 OR ANDROID OR APPLE OR OPENCV_FORCE_3RDPARTY_BUILD) ) @@ -1254,7 +1255,10 @@ if(WITH_TIFF OR HAVE_TIFF) endif() if(HAVE_OPENJPEG) - status(" JPEG 2000:" "OpenJPEG (ver ${OPENJPEG_MAJOR_VERSION}.${OPENJPEG_MINOR_VERSION}.${OPENJPEG_BUILD_VERSION})") + status(" JPEG 2000:" OpenJPEG_FOUND + THEN "OpenJPEG (ver ${OPENJPEG_MAJOR_VERSION}.${OPENJPEG_MINOR_VERSION}.${OPENJPEG_BUILD_VERSION})" + ELSE "build (ver ${OPENJPEG_VERSION})" + ) elseif(HAVE_JASPER) status(" JPEG 2000:" JASPER_FOUND THEN "${JASPER_LIBRARY} (ver ${JASPER_VERSION_STRING})" ELSE "build Jasper (ver ${JASPER_VERSION_STRING})") elseif(WITH_OPENJPEG OR WITH_JASPER) diff --git a/cmake/OpenCVFindLibsGrfmt.cmake b/cmake/OpenCVFindLibsGrfmt.cmake index 0beaf193170b..22e20b6b7988 100644 --- a/cmake/OpenCVFindLibsGrfmt.cmake +++ b/cmake/OpenCVFindLibsGrfmt.cmake @@ -155,16 +155,29 @@ endif() # --- libopenjp2 (optional, check before libjasper) --- if(WITH_OPENJPEG) - find_package(OpenJPEG QUIET) + if(BUILD_OPENJPEG) + ocv_clear_vars(OpenJPEG_FOUND) + else() + find_package(OpenJPEG QUIET) + endif() if(NOT OpenJPEG_FOUND OR OPENJPEG_MAJOR_VERSION LESS 2) - set(HAVE_OPENJPEG NO) ocv_clear_vars(OPENJPEG_MAJOR_VERSION OPENJPEG_MINOR_VERSION OPENJPEG_BUILD_VERSION OPENJPEG_LIBRARIES OPENJPEG_INCLUDE_DIRS) - message(STATUS "Could NOT find OpenJPEG (minimal suitable version: 2.0, recommended version >= 2.3.1)") + message(STATUS "Could NOT find OpenJPEG (minimal suitable version: 2.0, " + "recommended version >= 2.3.1). OpenJPEG will be built from sources") + add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/openjpeg") + if(OCV_CAN_BUILD_OPENJPEG) + set(HAVE_OPENJPEG YES) + message(STATUS "OpenJPEG libraries will be built from sources: ${OPENJPEG_LIBRARIES} " + "(version \"${OPENJPEG_VERSION}\")") + else() + set(HAVE_OPENJPEG NO) + message(STATUS "OpenJPEG libraries can't be built from sources. System requirements are not fulfilled.") + endif() else() set(HAVE_OPENJPEG YES) - message(STATUS "Found OpenJPEG: ${OPENJPEG_LIBRARIES} " - "(found version \"${OPENJPEG_MAJOR_VERSION}.${OPENJPEG_MINOR_VERSION}.${OPENJPEG_BUILD_VERSION}\")") + message(STATUS "Found system OpenJPEG: ${OPENJPEG_LIBRARIES} " + "(found version \"${OPENJPEG_VERSION}\")") endif() endif() diff --git a/modules/imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp b/modules/imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp index 477155943981..b32a6aa0f9fe 100644 --- a/modules/imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp +++ b/modules/imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp @@ -558,7 +558,7 @@ bool Jpeg2KOpjDecoder::readHeader() CV_Error(Error::StsNotImplemented, cv::format("OpenJPEG2000: Component %d/%d is duplicate alpha channel", i, numcomps)); } - hasAlpha |= (bool)comp.alpha; + hasAlpha |= comp.alpha != 0; if (comp.prec > 64) {