3rdparty: integrate OpenJPEG build to the OpenCV CMake
authorVadim Levin <vadim.levin@xperience.ai>
Tue, 25 Aug 2020 10:11:08 +0000 (13:11 +0300)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Wed, 2 Sep 2020 20:45:35 +0000 (20:45 +0000)
- adopted build scripts
- OpenJPEG build warnings are suppressed

3rdparty/openjpeg/CMakeLists.txt
3rdparty/openjpeg/openjp2/CMakeLists.txt
CMakeLists.txt
cmake/OpenCVFindLibsGrfmt.cmake
modules/imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp

index 3ea2424..ec15bba 100644 (file)
@@ -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} "$<$<CONFIG:Release>:-ffast-math>")
-  set(OPENJP2_COMPILE_OPTIONS ${OPENJP2_COMPILE_OPTIONS} "$<$<CONFIG:Release>:-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)")
index b271485..7decabe 100644 (file)
@@ -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" "$<TARGET_SONAME_FILE:${OPENJPEG_LIBRARY_NAME}>"
-    COMMENT "dsymutil $<TARGET_SONAME_FILE:${OPENJPEG_LIBRARY_NAME}>"
-    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()
index 3273eda..ff8b160 100644 (file)
@@ -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)
index 0beaf19..22e20b6 100644 (file)
@@ -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()
 
index 4771559..b32a6aa 100644 (file)
@@ -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)
         {