Initial empty repository
[platform/upstream/opencv.git] / openjpeg / CMakeLists.txt
1 # Build scripts are adopted to OpenCV project
2 # Main CMakeLists.txt to build the OpenJPEG project using CMake (www.cmake.org)
3 # Written by Mathieu Malaterre
4
5 cmake_policy(SET CMP0003 NEW)
6 if(POLICY CMP0042)
7   cmake_policy(SET CMP0042 NEW)
8 endif()
9
10 set(OPENJPEG_LIBRARY_NAME libopenjp2)
11
12 project(openjpeg C)
13
14 ocv_warnings_disable(CMAKE_C_FLAGS
15     -Wimplicit-const-int-float-conversion  # clang
16     -Wunused-but-set-variable # clang15
17 )
18
19 #-----------------------------------------------------------------------------
20 # OPENJPEG version number, useful for packaging and doxygen doc:
21 set(OPENJPEG_VERSION_MAJOR 2)
22 set(OPENJPEG_VERSION_MINOR 4)
23 set(OPENJPEG_VERSION_BUILD 0)
24 set(OPENJPEG_VERSION
25   "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}")
26 set(PACKAGE_VERSION
27   "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}")
28
29 # Because autotools does not support X.Y notation for SOVERSION, we have to use
30 # two numbering, one for the openjpeg version and one for openjpeg soversion
31 # version | soversion
32 #   1.0   |  0
33 #   1.1   |  1
34 #   1.2   |  2
35 #   1.3   |  3
36 #   1.4   |  4
37 #   1.5   |  5
38 #   1.5.1 |  5
39 #   2.0   |  6
40 #   2.0.1 |  6
41 #   2.1   |  7
42 #   2.1.1 |  7
43 #   2.1.2 |  7
44 #   2.2.0 |  7
45 #   2.3.0 |  7
46 #   2.3.1 |  7
47 #   2.4.0 |  7
48 # above is the recommendation by the OPJ team. If you really need to override this default,
49 # you can specify your own OPENJPEG_SOVERSION at cmake configuration time:
50 # cmake -DOPENJPEG_SOVERSION:STRING=42 /path/to/openjpeg
51 if(NOT OPENJPEG_SOVERSION)
52   set(OPENJPEG_SOVERSION 7)
53 endif()
54
55 set(OPENJPEG_LIBRARY_PROPERTIES
56   VERSION   "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}"
57   SOVERSION "${OPENJPEG_SOVERSION}"
58 )
59
60 set(OPENJPEG_BUILD "opencv-${OPENCV_VERSION}-openjp2-${OPENJPEG_VERSION}")
61 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
62   set(OPENJPEG_BUILD "${OPENJPEG_BUILD}-debug")
63 endif()
64
65 message(STATUS "OpenJPEG: VERSION = ${OPENJPEG_VERSION}, BUILD = ${OPENJPEG_BUILD}")
66
67 # --------------------------------------------------------------------------
68 # On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security
69 # warnings
70 if(WIN32)
71   if(NOT BORLAND)
72     if(NOT CYGWIN)
73       if(NOT MINGW)
74         if(NOT ITK_ENABLE_VISUAL_STUDIO_DEPRECATED_C_WARNINGS)
75           add_definitions(
76             -D_CRT_FAR_MAPPINGS_NO_DEPRECATE
77             -D_CRT_IS_WCTYPE_NO_DEPRECATE
78             -D_CRT_MANAGED_FP_NO_DEPRECATE
79             -D_CRT_NONSTDC_NO_DEPRECATE
80             -D_CRT_SECURE_NO_DEPRECATE
81             -D_CRT_SECURE_NO_DEPRECATE_GLOBALS
82             -D_CRT_SETERRORMODE_BEEP_SLEEP_NO_DEPRECATE
83             -D_CRT_TIME_FUNCTIONS_NO_DEPRECATE
84             -D_CRT_VCCLRIT_NO_DEPRECATE
85             -D_SCL_SECURE_NO_DEPRECATE
86             )
87         endif()
88       endif()
89     endif()
90   endif()
91 endif()
92
93 #-----------------------------------------------------------------------------
94 # Big endian test:
95 include(TestBigEndian)
96 test_big_endian(OPJ_BIG_ENDIAN)
97
98 #-----------------------------------------------------------------------------
99 # opj_config.h generation (1/2)
100
101 # Check if some include files are provided by the system
102 # These files are mandatory, so if they are not provided OpenJPEG library can't be built
103 include(CheckIncludeFile)
104 macro(ensure_file_include INCLUDE_FILENAME VARIABLE_NAME MANDATORY_STATUS)
105   check_include_file(${INCLUDE_FILENAME} ${VARIABLE_NAME})
106   if(NOT ${VARIABLE_NAME})
107     if(${MANDATORY_STATUS})
108       message(STATUS "The file '${INCLUDE_FILENAME}' is mandatory for OpenJPEG build, but not found on your system")
109       return()
110     else()
111       message(STATUS "The file '${INCLUDE_FILENAME}' is optional for OpenJPEG build and not found on your system."
112               " Internal implementation will be used.")
113     endif()
114   endif()
115 endmacro()
116
117 ensure_file_include("string.h"   HAVE_STRING_H YES)
118 ensure_file_include("memory.h"   HAVE_MEMORY_H YES)
119 ensure_file_include("stdlib.h"   HAVE_STDLIB_H YES)
120 ensure_file_include("stdio.h"    HAVE_STDIO_H  YES)
121 ensure_file_include("math.h"     HAVE_MATH_H   YES)
122 ensure_file_include("float.h"    HAVE_FLOAT_H  YES)
123 ensure_file_include("time.h"     HAVE_TIME_H   YES)
124 ensure_file_include("stdarg.h"   HAVE_STDARG_H YES)
125 ensure_file_include("ctype.h"    HAVE_CTYPE_H  YES)
126 ensure_file_include("assert.h"   HAVE_ASSERT_H YES)
127
128 # For the following files, we provide an alternative, they are not mandatory
129 ensure_file_include("stdint.h"   OPJ_HAVE_STDINT_H   NO)
130 ensure_file_include("inttypes.h" OPJ_HAVE_INTTYPES_H NO)
131
132 # why check this one ? for openjpip ?
133 CHECK_INCLUDE_FILE("strings.h"      HAVE_STRINGS_H)
134 CHECK_INCLUDE_FILE("sys/stat.h"     HAVE_SYS_STAT_H)
135 CHECK_INCLUDE_FILE("sys/types.h"    HAVE_SYS_TYPES_H)
136 CHECK_INCLUDE_FILE("unistd.h"       HAVE_UNISTD_H)
137
138 # Allocating Aligned Memory Blocks
139 include(CheckIncludeFiles)
140 check_include_files(malloc.h OPJ_HAVE_MALLOC_H)
141 include(CheckSymbolExists)
142 # _aligned_alloc https://msdn.microsoft.com/en-us/library/8z34s9c6.aspx
143 check_symbol_exists(_aligned_malloc malloc.h OPJ_HAVE__ALIGNED_MALLOC)
144 # posix_memalign (needs _POSIX_C_SOURCE >= 200112L on Linux)
145 set(_prev_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
146 set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200112L)
147 check_symbol_exists(posix_memalign stdlib.h OPJ_HAVE_POSIX_MEMALIGN)
148 set(CMAKE_REQUIRED_DEFINITIONS ${_prev_CMAKE_REQUIRED_DEFINITIONS})
149 unset(_prev_CMAKE_REQUIRED_DEFINITIONS)
150 # memalign (obsolete)
151 check_symbol_exists(memalign malloc.h OPJ_HAVE_MEMALIGN)
152 #-----------------------------------------------------------------------------
153 # opj_config.h generation (2/2)
154 configure_file(
155   ${CMAKE_CURRENT_LIST_DIR}/openjp2/opj_config.h.cmake.in
156   ${CMAKE_CURRENT_BINARY_DIR}/openjp2/opj_config.h
157   @ONLY
158 )
159
160 configure_file(
161   ${CMAKE_CURRENT_LIST_DIR}/openjp2/opj_config_private.h.cmake.in
162   ${CMAKE_CURRENT_BINARY_DIR}/openjp2/opj_config_private.h
163   @ONLY
164 )
165
166 add_subdirectory(openjp2)
167
168 set_target_properties(${OPENJPEG_LIBRARY_NAME}
169   PROPERTIES
170     OUTPUT_NAME              ${OPENJPEG_LIBRARY_NAME}
171     DEBUG_POSTFIX            "${OPENCV_DEBUG_POSTFIX}"
172     COMPILE_PDB_NAME         ${OPENJPEG_LIBRARY_NAME}
173     COMPILE_PDB_NAME_DEBUG   "${OPENJPEG_LIBRARY_NAME}${OPENCV_DEBUG_POSTFIX}"
174     ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
175 )
176
177 if(ENABLE_SOLUTION_FOLDERS)
178   set_target_properties(${OPENJPEG_LIBRARY_NAME}
179     PROPERTIES
180       FOLDER "3rdparty"
181   )
182 endif()
183
184 ocv_install_3rdparty_licenses(${OPENJPEG_LIBRARY_NAME} README.md LICENSE)
185
186 # Setting all necessary variables
187 set(OPENJPEG_LIBRARIES     ${OPENJPEG_LIBRARY_NAME}  PARENT_SCOPE)
188 set(OPENJPEG_VERSION       ${OPENJPEG_VERSION}       PARENT_SCOPE)
189 set(OPENJPEG_MAJOR_VERSION ${OPENJPEG_VERSION_MAJOR} PARENT_SCOPE)
190 set(OPENJPEG_MINOR_VERSION ${OPENJPEG_VERSION_MINOR} PARENT_SCOPE)
191 set(OPENJPEG_BUILD_VERSION ${OPENJPEG_VERSION_BUILD} PARENT_SCOPE)
192 get_target_property(_openjpeg_include_dirs ${OPENJPEG_LIBRARY_NAME} INCLUDE_DIRECTORIES)
193 set(OPENJPEG_INCLUDE_DIRS  ${_openjpeg_include_dirs} PARENT_SCOPE)
194
195 # OpenJPEG can't be built only if configuration script doesn't encounter any problem
196 if(NOT DEFINED OCV_CAN_BUILD_OPENJPEG)
197   # all prerequisites are fulfilled
198   set(OCV_CAN_BUILD_OPENJPEG TRUE PARENT_SCOPE)
199 endif()