CMakeLists.txt 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. project(${JPEG_LIBRARY} C)
  2. macro(boolean_number var)
  3. if(${var})
  4. set(${var} 1 ${ARGN})
  5. else()
  6. set(${var} 0 ${ARGN})
  7. endif()
  8. endmacro()
  9. ocv_warnings_disable(CMAKE_C_FLAGS -Wunused-parameter -Wsign-compare -Wshorten-64-to-32 -Wimplicit-fallthrough)
  10. if(APPLE)
  11. ocv_warnings_disable(CMAKE_C_FLAGS -Wunused-variable) # NEON flags are not used on Mac
  12. endif()
  13. if(CV_GCC AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13)
  14. # src/jchuff.c:1042:22: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
  15. ocv_warnings_disable(CMAKE_C_FLAGS -Wstringop-overflow)
  16. endif()
  17. set(VERSION 3.1.2)
  18. set(COPYRIGHT_YEAR "1991-2025")
  19. string(REPLACE "." ";" VERSION_TRIPLET ${VERSION})
  20. list(GET VERSION_TRIPLET 0 VERSION_MAJOR)
  21. list(GET VERSION_TRIPLET 1 VERSION_MINOR)
  22. list(GET VERSION_TRIPLET 2 VERSION_REVISION)
  23. function(pad_number NUMBER OUTPUT_LEN)
  24. string(LENGTH "${${NUMBER}}" INPUT_LEN)
  25. if(INPUT_LEN LESS OUTPUT_LEN)
  26. math(EXPR ZEROES "${OUTPUT_LEN} - ${INPUT_LEN} - 1")
  27. set(NUM ${${NUMBER}})
  28. foreach(C RANGE ${ZEROES})
  29. set(NUM "0${NUM}")
  30. endforeach()
  31. set(${NUMBER} ${NUM} PARENT_SCOPE)
  32. endif()
  33. endfunction()
  34. pad_number(VERSION_MINOR 3)
  35. pad_number(VERSION_REVISION 3)
  36. set(LIBJPEG_TURBO_VERSION_NUMBER ${VERSION_MAJOR}${VERSION_MINOR}${VERSION_REVISION})
  37. string(TIMESTAMP BUILD "opencv-${OPENCV_VERSION}-libjpeg-turbo")
  38. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  39. set(BUILD "${BUILD}-debug")
  40. endif()
  41. message(STATUS "libjpeg-turbo: VERSION = ${VERSION}, BUILD = ${BUILD}")
  42. math(EXPR BITS "${CMAKE_SIZEOF_VOID_P} * 8")
  43. string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" CMAKE_SYSTEM_PROCESSOR_LC)
  44. if(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86_64" OR
  45. CMAKE_SYSTEM_PROCESSOR_LC MATCHES "amd64" OR
  46. CMAKE_SYSTEM_PROCESSOR_LC MATCHES "i[0-9]86" OR
  47. CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86" OR
  48. CMAKE_SYSTEM_PROCESSOR_LC MATCHES "ia32")
  49. if(BITS EQUAL 64 OR CMAKE_C_COMPILER_ABI MATCHES "ELF X32")
  50. set(CPU_TYPE x86_64)
  51. else()
  52. set(CPU_TYPE i386)
  53. endif()
  54. if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL ${CPU_TYPE})
  55. set(CMAKE_SYSTEM_PROCESSOR ${CPU_TYPE})
  56. endif()
  57. elseif(CMAKE_SYSTEM_PROCESSOR_LC STREQUAL "aarch64" OR
  58. CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^arm")
  59. if(BITS EQUAL 64)
  60. set(CPU_TYPE arm64)
  61. else()
  62. set(CPU_TYPE arm)
  63. endif()
  64. elseif(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^ppc" OR
  65. CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^powerpc")
  66. set(CPU_TYPE powerpc)
  67. else()
  68. set(CPU_TYPE ${CMAKE_SYSTEM_PROCESSOR_LC})
  69. endif()
  70. if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR
  71. CMAKE_OSX_ARCHITECTURES MATCHES "arm64" OR
  72. CMAKE_OSX_ARCHITECTURES MATCHES "i386")
  73. set(CPU_TYPE ${CMAKE_OSX_ARCHITECTURES})
  74. endif()
  75. if(CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
  76. set(CPU_TYPE powerpc)
  77. endif()
  78. if(MSVC_IDE AND CMAKE_GENERATOR_PLATFORM MATCHES "arm64")
  79. set(CPU_TYPE arm64)
  80. endif()
  81. OCV_OPTION(ENABLE_LIBJPEG_TURBO_SIMD "Include SIMD extensions for libjpeg-turbo, if available for this platform" (NOT CV_DISABLE_OPTIMIZATION))
  82. option(WITH_ARITH_ENC "Include arithmetic encoding support when emulating the libjpeg v6b API/ABI" TRUE)
  83. option(WITH_ARITH_DEC "Include arithmetic decoding support when emulating the libjpeg v6b API/ABI" TRUE)
  84. set(WITH_SIMD 1)
  85. set(HAVE_LIBJPEG_TURBO_SIMD 0 PARENT_SCOPE)
  86. include(CheckCSourceCompiles)
  87. include(CheckIncludeFiles)
  88. include(CheckTypeSize)
  89. check_type_size("size_t" SIZE_T)
  90. check_type_size("unsigned long" UNSIGNED_LONG)
  91. if(SIZEOF_SIZE_T EQUAL SIZEOF_UNSIGNED_LONG)
  92. check_c_source_compiles("int main(int argc, char **argv) { unsigned long a = argc; return __builtin_ctzl(a); }"
  93. HAVE_BUILTIN_CTZL)
  94. endif()
  95. if(MSVC)
  96. check_include_files("intrin.h" HAVE_INTRIN_H)
  97. endif()
  98. if(UNIX)
  99. # Check for headers
  100. check_include_files(locale.h HAVE_LOCALE_H)
  101. check_include_files(stddef.h HAVE_STDDEF_H)
  102. check_include_files(stdlib.h HAVE_STDLIB_H)
  103. check_include_files(sys/types.h NEED_SYS_TYPES_H)
  104. # Other predefines
  105. # undef NEED_BSD_STRINGS
  106. ocv_update(HAVE_UNSIGNED_CHAR 1)
  107. ocv_update(HAVE_UNSIGNED_SHORT 1)
  108. # undef INCOMPLETE_TYPES_BROKEN
  109. ocv_update(RIGHT_SHIFT_IS_UNSIGNED 0)
  110. endif()
  111. set(BITS_IN_JSAMPLE 8)
  112. if(WITH_ARITH_ENC)
  113. set(C_ARITH_CODING_SUPPORTED 1)
  114. endif()
  115. if(WITH_ARITH_DEC)
  116. set(D_ARITH_CODING_SUPPORTED 1)
  117. endif()
  118. set(JPEG_LIB_VERSION 70)
  119. # OpenCV
  120. set(JPEG_LIB_VERSION "${VERSION}-${JPEG_LIB_VERSION}" PARENT_SCOPE)
  121. set(THREAD_LOCAL "") # WITH_TURBOJPEG is not used
  122. add_definitions(-DNO_GETENV -DNO_PUTENV)
  123. if(MSVC)
  124. add_definitions(-W3 -wd4996 -wd4018)
  125. endif()
  126. include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src)
  127. set(JPEG16_SOURCES jcapistd.c jccolor.c jcdiffct.c jclossls.c jcmainct.c
  128. jcprepct.c jcsample.c jdapistd.c jdcolor.c jddiffct.c jdlossls.c jdmainct.c
  129. jdpostct.c jdsample.c jutils.c)
  130. set(JPEG12_SOURCES ${JPEG16_SOURCES} jccoefct.c jcdctmgr.c jdcoefct.c
  131. jddctmgr.c jdmerge.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c
  132. jidctred.c jquant1.c jquant2.c)
  133. set(JPEG_SOURCES ${JPEG12_SOURCES} jcapimin.c jchuff.c jcicc.c jcinit.c
  134. jclhuff.c jcmarker.c jcmaster.c jcomapi.c jcparam.c jcphuff.c jctrans.c
  135. jdapimin.c jdatadst.c jdatasrc.c jdhuff.c jdicc.c jdinput.c jdlhuff.c
  136. jdmarker.c jdmaster.c jdphuff.c jdtrans.c jerror.c jfdctflt.c jmemmgr.c
  137. jmemnobs.c jpeg_nbits.c)
  138. if(WITH_ARITH_ENC OR WITH_ARITH_DEC)
  139. set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c)
  140. endif()
  141. if(WITH_ARITH_ENC)
  142. set(JPEG_SOURCES ${JPEG_SOURCES} jcarith.c)
  143. endif()
  144. if(WITH_ARITH_DEC)
  145. set(JPEG_SOURCES ${JPEG_SOURCES} jdarith.c)
  146. endif()
  147. if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
  148. # Use the maximum optimization level for release builds
  149. foreach(var CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
  150. if(${var} MATCHES "-O2")
  151. string(REGEX REPLACE "-O2" "-O3" ${var} "${${var}}")
  152. endif()
  153. endforeach()
  154. endif()
  155. if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  156. if(CMAKE_C_COMPILER_ID MATCHES "SunPro")
  157. # Use the maximum optimization level for release builds
  158. foreach(var CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
  159. if(${var} MATCHES "-xO3")
  160. string(REGEX REPLACE "-xO3" "-xO5" ${var} "${${var}}")
  161. endif()
  162. if(${var} MATCHES "-xO2")
  163. string(REGEX REPLACE "-xO2" "-xO5" ${var} "${${var}}")
  164. endif()
  165. endforeach()
  166. endif()
  167. endif()
  168. include(CheckTypeSize)
  169. check_type_size("size_t" SIZE_T)
  170. check_type_size("unsigned long" UNSIGNED_LONG)
  171. if(ENABLE_LIBJPEG_TURBO_SIMD)
  172. add_subdirectory(simd)
  173. if(NEON_INTRINSICS)
  174. add_definitions(-DNEON_INTRINSICS)
  175. endif()
  176. else()
  177. set(WITH_SIMD 0)
  178. endif()
  179. if(WITH_SIMD)
  180. message(STATUS "SIMD extensions: ${CPU_TYPE} (WITH_SIMD = ${WITH_SIMD})")
  181. set(HAVE_LIBJPEG_TURBO_SIMD 1 PARENT_SCOPE)
  182. if(MSVC_IDE OR XCODE)
  183. set_source_files_properties(${SIMD_OBJS} PROPERTIES GENERATED 1)
  184. endif()
  185. set(SIMD_TARGET_OBJECTS $<TARGET_OBJECTS:simd>)
  186. endif()
  187. configure_file(jversion.h.in jversion.h)
  188. configure_file(jconfig.h.in jconfig.h)
  189. configure_file(jconfigint.h.in jconfigint.h)
  190. ocv_list_add_prefix(JPEG16_SOURCES src/)
  191. ocv_list_add_prefix(JPEG12_SOURCES src/)
  192. ocv_list_add_prefix(JPEG_SOURCES src/)
  193. set(JPEG_SOURCES ${JPEG_SOURCES} ${SIMD_OBJS})
  194. add_library(jpeg12-static OBJECT ${JPEG12_SOURCES})
  195. set_property(TARGET jpeg12-static PROPERTY COMPILE_FLAGS
  196. "-DBITS_IN_JSAMPLE=12")
  197. add_library(jpeg16-static OBJECT ${JPEG16_SOURCES})
  198. set_property(TARGET jpeg16-static PROPERTY COMPILE_FLAGS
  199. "-DBITS_IN_JSAMPLE=16")
  200. add_library(${JPEG_LIBRARY} STATIC ${JPEG_SOURCES} ${SIMD_TARGET_OBJECTS}
  201. ${SIMD_OBJS} $<TARGET_OBJECTS:jpeg12-static>
  202. $<TARGET_OBJECTS:jpeg16-static>)
  203. set_target_properties(${JPEG_LIBRARY}
  204. PROPERTIES OUTPUT_NAME ${JPEG_LIBRARY}
  205. DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"
  206. COMPILE_PDB_NAME ${JPEG_LIBRARY}
  207. COMPILE_PDB_NAME_DEBUG "${JPEG_LIBRARY}${OPENCV_DEBUG_POSTFIX}"
  208. ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
  209. )
  210. if(ENABLE_SOLUTION_FOLDERS)
  211. set_target_properties(${JPEG_LIBRARY} PROPERTIES FOLDER "3rdparty/jpeg")
  212. set_target_properties(jpeg12-static PROPERTIES FOLDER "3rdparty/jpeg")
  213. set_target_properties(jpeg16-static PROPERTIES FOLDER "3rdparty/jpeg")
  214. endif()
  215. if(NOT BUILD_SHARED_LIBS)
  216. ocv_install_target(${JPEG_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev OPTIONAL)
  217. endif()
  218. ocv_install_3rdparty_licenses(libjpeg-turbo README.md LICENSE.md README.ijg)