Bump to 2.0.6
[platform/upstream/libjpeg-turbo.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8.12)
2
3 if(CMAKE_EXECUTABLE_SUFFIX)
4   set(CMAKE_EXECUTABLE_SUFFIX_TMP ${CMAKE_EXECUTABLE_SUFFIX})
5 endif()
6
7 project(libjpeg-turbo C)
8 set(VERSION 2.0.6)
9 string(REPLACE "." ";" VERSION_TRIPLET ${VERSION})
10 list(GET VERSION_TRIPLET 0 VERSION_MAJOR)
11 list(GET VERSION_TRIPLET 1 VERSION_MINOR)
12 list(GET VERSION_TRIPLET 2 VERSION_REVISION)
13 function(pad_number NUMBER OUTPUT_LEN)
14   string(LENGTH "${${NUMBER}}" INPUT_LEN)
15   if(INPUT_LEN LESS OUTPUT_LEN)
16     math(EXPR ZEROES "${OUTPUT_LEN} - ${INPUT_LEN} - 1")
17     set(NUM ${${NUMBER}})
18     foreach(C RANGE ${ZEROES})
19       set(NUM "0${NUM}")
20     endforeach()
21     set(${NUMBER} ${NUM} PARENT_SCOPE)
22   endif()
23 endfunction()
24 pad_number(VERSION_MINOR 3)
25 pad_number(VERSION_REVISION 3)
26 set(LIBJPEG_TURBO_VERSION_NUMBER ${VERSION_MAJOR}${VERSION_MINOR}${VERSION_REVISION})
27
28 string(TIMESTAMP DEFAULT_BUILD "%Y%m%d")
29 set(BUILD ${DEFAULT_BUILD} CACHE STRING "Build string (default: ${DEFAULT_BUILD})")
30
31 # NOTE: On Windows, this does nothing except when using MinGW or Cygwin.
32 # CMAKE_BUILD_TYPE has no meaning in Visual Studio, and it always defaults to
33 # Debug when using NMake.
34 if(NOT CMAKE_BUILD_TYPE)
35   set(CMAKE_BUILD_TYPE Release)
36 endif()
37 message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
38
39 message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}")
40
41 # Detect CPU type and whether we're building 64-bit or 32-bit code
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)
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 message(STATUS "${BITS}-bit build (${CPU_TYPE})")
71
72
73 ###############################################################################
74 # INSTALL DIRECTORIES
75 ###############################################################################
76
77 if(WIN32)
78   if(MSVC)
79     set(CMAKE_INSTALL_DEFAULT_PREFIX "c:/${CMAKE_PROJECT_NAME}")
80   else()
81     set(CMAKE_INSTALL_DEFAULT_PREFIX "c:/${CMAKE_PROJECT_NAME}-gcc")
82   endif()
83   if(BITS EQUAL 64)
84     set(CMAKE_INSTALL_DEFAULT_PREFIX "${CMAKE_INSTALL_DEFAULT_PREFIX}64")
85   endif()
86 else()
87   set(CMAKE_INSTALL_DEFAULT_PREFIX /opt/${CMAKE_PROJECT_NAME})
88 endif()
89 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
90   set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_DEFAULT_PREFIX}" CACHE PATH
91     "Directory into which to install ${CMAKE_PROJECT_NAME} (default: ${CMAKE_INSTALL_DEFAULT_PREFIX})"
92     FORCE)
93 endif()
94 message(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")
95
96 # When the prefix is /opt/${CMAKE_PROJECT_NAME}, we assume that an "official"
97 # build is being created, and thus we install things into specific locations.
98
99 if(CMAKE_INSTALL_PREFIX STREQUAL "${CMAKE_INSTALL_DEFAULT_PREFIX}")
100   set(CMAKE_INSTALL_DEFAULT_DATAROOTDIR "")
101   set(CMAKE_INSTALL_DEFAULT_DOCDIR "<CMAKE_INSTALL_DATAROOTDIR>/doc")
102   set(CMAKE_INSTALL_DEFAULT_JAVADIR "<CMAKE_INSTALL_DATAROOTDIR>/classes")
103   if(UNIX AND NOT APPLE)
104     if(BITS EQUAL 64)
105       set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib64")
106     else()
107       set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib32")
108     endif()
109   endif()
110 endif()
111
112 include(cmakescripts/GNUInstallDirs.cmake)
113
114 macro(report_directory var)
115   if(CMAKE_INSTALL_${var} STREQUAL CMAKE_INSTALL_FULL_${var})
116     message(STATUS "CMAKE_INSTALL_${var} = ${CMAKE_INSTALL_${var}}")
117   else()
118     message(STATUS "CMAKE_INSTALL_${var} = ${CMAKE_INSTALL_${var}} (${CMAKE_INSTALL_FULL_${var}})")
119   endif()
120   mark_as_advanced(CLEAR CMAKE_INSTALL_${var})
121 endmacro()
122
123 set(DIRLIST "BINDIR;DATAROOTDIR;DOCDIR;INCLUDEDIR;LIBDIR")
124 if(UNIX)
125   list(APPEND DIRLIST "MANDIR")
126 endif()
127 foreach(dir ${DIRLIST})
128   report_directory(${dir})
129 endforeach()
130
131
132 ###############################################################################
133 # CONFIGURATION OPTIONS
134 ###############################################################################
135
136 macro(boolean_number var)
137   if(${var})
138     set(${var} 1)
139   else()
140     set(${var} 0)
141   endif()
142 endmacro()
143
144 option(ENABLE_SHARED "Build shared libraries" TRUE)
145 boolean_number(ENABLE_SHARED)
146 option(ENABLE_STATIC "Build static libraries" TRUE)
147 boolean_number(ENABLE_STATIC)
148 option(REQUIRE_SIMD "Generate a fatal error if SIMD extensions are not available for this platform (default is to fall back to a non-SIMD build)" FALSE)
149 boolean_number(REQUIRE_SIMD)
150 option(WITH_12BIT "Encode/decode JPEG images with 12-bit samples (implies WITH_ARITH_DEC=0 WITH_ARITH_ENC=0 WITH_JAVA=0 WITH_SIMD=0 WITH_TURBOJPEG=0 )" FALSE)
151 boolean_number(WITH_12BIT)
152 option(WITH_ARITH_DEC "Include arithmetic decoding support when emulating the libjpeg v6b API/ABI" TRUE)
153 boolean_number(WITH_ARITH_DEC)
154 option(WITH_ARITH_ENC "Include arithmetic encoding support when emulating the libjpeg v6b API/ABI" TRUE)
155 boolean_number(WITH_ARITH_ENC)
156 option(WITH_JAVA "Build Java wrapper for the TurboJPEG API library (implies ENABLE_SHARED=1)" FALSE)
157 boolean_number(WITH_JAVA)
158 option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes ${CMAKE_PROJECT_NAME} backward-incompatible with libjpeg v6b)" FALSE)
159 boolean_number(WITH_JPEG7)
160 option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes ${CMAKE_PROJECT_NAME} backward-incompatible with libjpeg v6b)" FALSE)
161 boolean_number(WITH_JPEG8)
162 option(WITH_MEM_SRCDST "Include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI" TRUE)
163 boolean_number(WITH_MEM_SRCDST)
164 option(WITH_SIMD "Include SIMD extensions, if available for this platform" TRUE)
165 boolean_number(WITH_SIMD)
166 option(WITH_TURBOJPEG "Include the TurboJPEG API library and associated test programs" TRUE)
167 boolean_number(WITH_TURBOJPEG)
168 option(ENABLE_COLOR_PICKER "Enable color picker for product TV" FALSE)
169 boolean_number(ENABLE_COLOR_PICKER)
170
171 macro(report_option var desc)
172   if(${var})
173     message(STATUS "${desc} enabled (${var} = ${${var}})")
174   else()
175     message(STATUS "${desc} disabled (${var} = ${${var}})")
176   endif()
177 endmacro()
178
179 if(WITH_JAVA)
180   set(ENABLE_SHARED 1)
181 endif()
182
183 # Explicitly setting CMAKE_POSITION_INDEPENDENT_CODE=FALSE disables PIC for all
184 # targets, which will cause the shared library builds to fail.  Thus, if shared
185 # libraries are enabled and CMAKE_POSITION_INDEPENDENT_CODE is explicitly set
186 # to FALSE, we need to unset it, thus restoring the default behavior
187 # (automatically using PIC for shared library targets.)
188 if(DEFINED CMAKE_POSITION_INDEPENDENT_CODE AND
189   NOT CMAKE_POSITION_INDEPENDENT_CODE AND ENABLE_SHARED)
190   unset(CMAKE_POSITION_INDEPENDENT_CODE CACHE)
191 endif()
192
193 report_option(ENABLE_SHARED "Shared libraries")
194 report_option(ENABLE_STATIC "Static libraries")
195
196 if(ENABLE_SHARED)
197   set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR})
198 endif()
199
200 if(WITH_JPEG8 OR WITH_JPEG7)
201   set(WITH_ARITH_ENC 1)
202   set(WITH_ARITH_DEC 1)
203 endif()
204 if(WITH_JPEG8)
205   set(WITH_MEM_SRCDST 0)
206 endif()
207
208 if(WITH_12BIT)
209   set(WITH_ARITH_DEC 0)
210   set(WITH_ARITH_ENC 0)
211   set(WITH_JAVA 0)
212   set(WITH_SIMD 0)
213   set(WITH_TURBOJPEG 0)
214   set(BITS_IN_JSAMPLE 12)
215 else()
216   set(BITS_IN_JSAMPLE 8)
217 endif()
218 report_option(WITH_12BIT "12-bit JPEG support")
219
220 if(WITH_ARITH_DEC)
221   set(D_ARITH_CODING_SUPPORTED 1)
222 endif()
223 if(NOT WITH_12BIT)
224   report_option(WITH_ARITH_DEC "Arithmetic decoding support")
225 endif()
226
227 if(WITH_ARITH_ENC)
228   set(C_ARITH_CODING_SUPPORTED 1)
229 endif()
230 if(NOT WITH_12BIT)
231   report_option(WITH_ARITH_ENC "Arithmetic encoding support")
232 endif()
233
234 if(NOT WITH_12BIT)
235   report_option(WITH_TURBOJPEG "TurboJPEG API library")
236   report_option(WITH_JAVA "TurboJPEG Java wrapper")
237 endif()
238
239 if(WITH_MEM_SRCDST)
240   set(MEM_SRCDST_SUPPORTED 1)
241   set(MEM_SRCDST_FUNCTIONS "global:  jpeg_mem_dest;  jpeg_mem_src;")
242 endif()
243 if(NOT WITH_JPEG8)
244   report_option(WITH_MEM_SRCDST "In-memory source/destination managers")
245 endif()
246
247 set(SO_AGE 2)
248 if(WITH_MEM_SRCDST)
249   set(SO_AGE 3)
250 endif()
251
252 if(WITH_JPEG8)
253   set(JPEG_LIB_VERSION 80)
254 elseif(WITH_JPEG7)
255   set(JPEG_LIB_VERSION 70)
256 else()
257   set(JPEG_LIB_VERSION 62)
258 endif()
259
260 if(ENABLE_COLOR_PICKER)
261   set(COLOR_PICKER_ENABLE 1)
262 else()
263   set(COLOR_PICKER_ENABLE 0)
264 endif()
265
266 math(EXPR JPEG_LIB_VERSION_DIV10 "${JPEG_LIB_VERSION} / 10")
267 math(EXPR JPEG_LIB_VERSION_MOD10 "${JPEG_LIB_VERSION} % 10")
268 if(JPEG_LIB_VERSION STREQUAL "62")
269   set(DEFAULT_SO_MAJOR_VERSION ${JPEG_LIB_VERSION})
270 else()
271   set(DEFAULT_SO_MAJOR_VERSION ${JPEG_LIB_VERSION_DIV10})
272 endif()
273 if(JPEG_LIB_VERSION STREQUAL "80")
274   set(DEFAULT_SO_MINOR_VERSION 2)
275 else()
276   set(DEFAULT_SO_MINOR_VERSION 0)
277 endif()
278
279 # This causes SO_MAJOR_VERSION/SO_MINOR_VERSION to reset to defaults if
280 # WITH_JPEG7 or WITH_JPEG8 has changed.
281 if((DEFINED WITH_JPEG7_INT AND NOT WITH_JPEG7 EQUAL WITH_JPEG7_INT) OR
282   (DEFINED WITH_JPEG8_INT AND NOT WITH_JPEG8 EQUAL WITH_JPEG8_INT))
283   set(FORCE_SO_VERSION "FORCE")
284 endif()
285 set(WITH_JPEG7_INT ${WITH_JPEG7} CACHE INTERNAL "")
286 set(WITH_JPEG8_INT ${WITH_JPEG8} CACHE INTERNAL "")
287
288 set(SO_MAJOR_VERSION ${DEFAULT_SO_MAJOR_VERSION} CACHE STRING
289   "Major version of the libjpeg API shared library (default: ${DEFAULT_SO_MAJOR_VERSION})"
290   ${FORCE_SO_VERSION})
291 set(SO_MINOR_VERSION ${DEFAULT_SO_MINOR_VERSION} CACHE STRING
292   "Minor version of the libjpeg API shared library (default: ${DEFAULT_SO_MINOR_VERSION})"
293   ${FORCE_SO_VERSION})
294
295 set(JPEG_LIB_VERSION_DECIMAL "${JPEG_LIB_VERSION_DIV10}.${JPEG_LIB_VERSION_MOD10}")
296 message(STATUS "Emulating libjpeg API/ABI v${JPEG_LIB_VERSION_DECIMAL} (WITH_JPEG7 = ${WITH_JPEG7}, WITH_JPEG8 = ${WITH_JPEG8})")
297 message(STATUS "libjpeg API shared library version = ${SO_MAJOR_VERSION}.${SO_AGE}.${SO_MINOR_VERSION}")
298
299 # Because the TurboJPEG API library uses versioned symbols and changes the
300 # names of functions whenever they are modified in a backward-incompatible
301 # manner, it is always backward-ABI-compatible with itself, so the major and
302 # minor SO versions don't change.  However, we increase the middle number (the
303 # SO "age") whenever functions are added to the API.
304 set(TURBOJPEG_SO_MAJOR_VERSION 0)
305 set(TURBOJPEG_SO_VERSION 0.2.0)
306
307
308 ###############################################################################
309 # COMPILER SETTINGS
310 ###############################################################################
311
312 if(MSVC)
313   option(WITH_CRT_DLL
314     "Link all ${CMAKE_PROJECT_NAME} libraries and executables with the C run-time DLL (msvcr*.dll) instead of the static C run-time library (libcmt*.lib.)  The default is to use the C run-time DLL only with the libraries and executables that need it."
315     FALSE)
316   if(NOT WITH_CRT_DLL)
317     # Use the static C library for all build types
318     foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
319       CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
320       if(${var} MATCHES "/MD")
321         string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
322       endif()
323     endforeach()
324   endif()
325   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /wd4996")
326 endif()
327
328 if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
329   # Use the maximum optimization level for release builds
330   foreach(var CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
331     if(${var} MATCHES "-O2")
332       string(REGEX REPLACE "-O2" "-O3" ${var} "${${var}}")
333     endif()
334   endforeach()
335 endif()
336
337 if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
338   if(CMAKE_C_COMPILER_ID MATCHES "SunPro")
339     # Use the maximum optimization level for release builds
340     foreach(var CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
341       if(${var} MATCHES "-xO3")
342         string(REGEX REPLACE "-xO3" "-xO5" ${var} "${${var}}")
343       endif()
344       if(${var} MATCHES "-xO2")
345         string(REGEX REPLACE "-xO2" "-xO5" ${var} "${${var}}")
346       endif()
347     endforeach()
348   endif()
349 endif()
350
351 string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
352
353 set(EFFECTIVE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
354 message(STATUS "Compiler flags = ${EFFECTIVE_C_FLAGS}")
355
356 set(EFFECTIVE_LD_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
357 message(STATUS "Linker flags = ${EFFECTIVE_LD_FLAGS}")
358
359 include(CheckCSourceCompiles)
360 include(CheckIncludeFiles)
361 include(CheckTypeSize)
362
363 check_type_size("size_t" SIZE_T)
364 check_type_size("unsigned long" UNSIGNED_LONG)
365
366 if(SIZE_T EQUAL UNSIGNED_LONG)
367   check_c_source_compiles("int main(int argc, char **argv) { unsigned long a = argc;  return __builtin_ctzl(a); }"
368     HAVE_BUILTIN_CTZL)
369 endif()
370 if(MSVC)
371   check_include_files("intrin.h" HAVE_INTRIN_H)
372 endif()
373
374 if(UNIX)
375   # Check for headers
376   check_include_files(locale.h HAVE_LOCALE_H)
377   check_include_files(stddef.h HAVE_STDDEF_H)
378   check_include_files(stdlib.h HAVE_STDLIB_H)
379   check_include_files(sys/types.h NEED_SYS_TYPES_H)
380
381   # Check for functions
382   include(CheckSymbolExists)
383   check_symbol_exists(memset string.h HAVE_MEMSET)
384   check_symbol_exists(memcpy string.h HAVE_MEMCPY)
385   if(NOT HAVE_MEMSET AND NOT HAVE_MEMCPY)
386     set(NEED_BSD_STRINGS 1)
387   endif()
388
389   # Check for types
390   check_type_size("unsigned char" UNSIGNED_CHAR)
391   check_type_size("unsigned short" UNSIGNED_SHORT)
392
393   # Check for compiler features
394   check_c_source_compiles("int main(void) { typedef struct undefined_structure *undef_struct_ptr;  undef_struct_ptr ptr = 0;  return ptr != 0; }"
395     INCOMPLETE_TYPES)
396   if(INCOMPLETE_TYPES)
397     message(STATUS "Compiler supports pointers to undefined structures.")
398   else()
399     set(INCOMPLETE_TYPES_BROKEN 1)
400     message(STATUS "Compiler does not support pointers to undefined structures.")
401   endif()
402
403   if(CMAKE_CROSSCOMPILING)
404     set(RIGHT_SHIFT_IS_UNSIGNED 0)
405   else()
406     include(CheckCSourceRuns)
407     check_c_source_runs("
408       #include <stdio.h>
409       #include <stdlib.h>
410       int is_shifting_signed (long arg) {
411         long res = arg >> 4;
412         if (res == -0x7F7E80CL)
413           return 1; /* right shift is signed */
414         /* see if unsigned-shift hack will fix it. */
415         /* we can't just test exact value since it depends on width of long... */
416         res |= (~0L) << (32-4);
417         if (res == -0x7F7E80CL)
418           return 0; /* right shift is unsigned */
419         printf(\"Right shift isn't acting as I expect it to.\\\\n\");
420         printf(\"I fear the JPEG software will not work at all.\\\\n\\\\n\");
421         return 0; /* try it with unsigned anyway */
422       }
423       int main (void) {
424         exit(is_shifting_signed(-0x7F7E80B1L));
425       }" RIGHT_SHIFT_IS_UNSIGNED)
426   endif()
427
428   if(CMAKE_CROSSCOMPILING)
429     set(__CHAR_UNSIGNED__ 0)
430   else()
431     check_c_source_runs("int main(void) { return ((char) -1 < 0); }"
432       __CHAR_UNSIGNED__)
433   endif()
434 endif()
435
436 if(MSVC)
437   set(INLINE_OPTIONS "__inline;inline")
438 else()
439   set(INLINE_OPTIONS "__inline__;inline")
440 endif()
441 option(FORCE_INLINE "Force function inlining" TRUE)
442 boolean_number(FORCE_INLINE)
443 if(FORCE_INLINE)
444   if(MSVC)
445     list(INSERT INLINE_OPTIONS 0 "__forceinline")
446   else()
447     list(INSERT INLINE_OPTIONS 0 "inline __attribute__((always_inline))")
448     list(INSERT INLINE_OPTIONS 0 "__inline__ __attribute__((always_inline))")
449   endif()
450 endif()
451 foreach(inline ${INLINE_OPTIONS})
452   check_c_source_compiles("${inline} static int foo(void) { return 0; } int main(void) { return foo(); }"
453     INLINE_WORKS)
454   if(INLINE_WORKS)
455     set(INLINE ${inline})
456     break()
457   endif()
458 endforeach()
459 if(NOT INLINE_WORKS)
460   message(FATAL_ERROR "Could not determine how to inline functions.")
461 endif()
462 message(STATUS "INLINE = ${INLINE} (FORCE_INLINE = ${FORCE_INLINE})")
463
464 if(WITH_TURBOJPEG)
465   if(MSVC)
466     set(THREAD_LOCAL "__declspec(thread)")
467   else()
468     set(THREAD_LOCAL "__thread")
469   endif()
470   check_c_source_compiles("${THREAD_LOCAL} int i;  int main(void) { i = 0;  return i; }" HAVE_THREAD_LOCAL)
471   if(HAVE_THREAD_LOCAL)
472     message(STATUS "THREAD_LOCAL = ${THREAD_LOCAL}")
473   else()
474     message(WARNING "Thread-local storage is not available.  The TurboJPEG API library's global error handler will not be thread-safe.")
475     unset(THREAD_LOCAL)
476   endif()
477 endif()
478
479 if(UNIX AND NOT APPLE)
480   file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map "VERS_1 { global: *; };")
481   set(CMAKE_REQUIRED_FLAGS
482     "-Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
483   check_c_source_compiles("int main(void) { return 0; }" HAVE_VERSION_SCRIPT)
484   set(CMAKE_REQUIRED_FLAGS)
485   file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map)
486   if(HAVE_VERSION_SCRIPT)
487     message(STATUS "Linker supports GNU-style version scripts")
488     set(MAPFLAG "-Wl,--version-script,")
489     set(TJMAPFLAG "-Wl,--version-script,")
490   else()
491     message(STATUS "Linker does not support GNU-style version scripts")
492     if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
493       # The Solaris linker doesn't like our version script for the libjpeg API
494       # library, but the version script for the TurboJPEG API library should
495       # still work.
496       file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map
497         "VERS_1 { global: foo;  local: *; }; VERS_2 { global: foo2; } VERS_1;")
498       set(CMAKE_REQUIRED_FLAGS "-Wl,-M,${CMAKE_CURRENT_BINARY_DIR}/conftest.map -shared")
499       check_c_source_compiles("int foo() { return 0; } int foo2() { return 2; }"
500         HAVE_MAPFILE)
501       set(CMAKE_REQUIRED_FLAGS)
502       file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map)
503       if(HAVE_MAPFILE)
504         message(STATUS "Linker supports mapfiles")
505         set(TJMAPFLAG "-Wl,-M,")
506       else()
507         message(STATUS "Linker does not support mapfiles")
508       endif()
509     endif()
510   endif()
511 endif()
512
513 # Generate files
514 if(WIN32)
515   configure_file(win/jconfig.h.in jconfig.h)
516 else()
517   configure_file(jconfig.h.in jconfig.h)
518 endif()
519 configure_file(jconfigint.h.in jconfigint.h)
520 if(UNIX)
521   configure_file(libjpeg.map.in libjpeg.map)
522 endif()
523
524 # Include directories and compiler definitions
525 include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
526
527
528 ###############################################################################
529 # TARGETS
530 ###############################################################################
531
532 if(CMAKE_EXECUTABLE_SUFFIX_TMP)
533   set(CMAKE_EXECUTABLE_SUFFIX ${CMAKE_EXECUTABLE_SUFFIX_TMP})
534 endif()
535 message(STATUS "CMAKE_EXECUTABLE_SUFFIX = ${CMAKE_EXECUTABLE_SUFFIX}")
536
537 set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c
538   jcicc.c jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c
539   jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c
540   jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdicc.c jdinput.c
541   jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c
542   jdtrans.c jerror.c jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c
543   jidctint.c jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c)
544
545 if(WITH_ARITH_ENC OR WITH_ARITH_DEC)
546   set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c)
547 endif()
548
549 if(WITH_ARITH_ENC)
550   set(JPEG_SOURCES ${JPEG_SOURCES} jcarith.c)
551 endif()
552
553 if(WITH_ARITH_DEC)
554   set(JPEG_SOURCES ${JPEG_SOURCES} jdarith.c)
555 endif()
556
557 if(WITH_SIMD)
558   add_subdirectory(simd)
559 elseif(NOT WITH_12BIT)
560   message(STATUS "SIMD extensions: None (WITH_SIMD = ${WITH_SIMD})")
561 endif()
562 if(WITH_SIMD)
563   message(STATUS "SIMD extensions: ${CPU_TYPE} (WITH_SIMD = ${WITH_SIMD})")
564   if(MSVC_IDE OR XCODE)
565     set_source_files_properties(${SIMD_OBJS} PROPERTIES GENERATED 1)
566   endif()
567 else()
568   add_library(simd OBJECT jsimd_none.c)
569 endif()
570
571 if(WITH_JAVA)
572   add_subdirectory(java)
573 endif()
574
575 if(ENABLE_SHARED)
576   add_subdirectory(sharedlib)
577 endif()
578
579 if(ENABLE_STATIC)
580   add_library(jpeg-static STATIC ${JPEG_SOURCES} $<TARGET_OBJECTS:simd>
581     ${SIMD_OBJS})
582   if(NOT MSVC)
583     set_target_properties(jpeg-static PROPERTIES OUTPUT_NAME jpeg)
584   endif()
585 endif()
586
587 if(WITH_TURBOJPEG)
588   if(ENABLE_SHARED)
589     set(TURBOJPEG_SOURCES ${JPEG_SOURCES} $<TARGET_OBJECTS:simd> ${SIMD_OBJS}
590       turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c rdbmp.c rdppm.c
591       wrbmp.c wrppm.c)
592     set(TJMAPFILE ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg-mapfile)
593     if(WITH_JAVA)
594       set(TURBOJPEG_SOURCES ${TURBOJPEG_SOURCES} turbojpeg-jni.c)
595       include_directories(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
596       set(TJMAPFILE ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg-mapfile.jni)
597     endif()
598     add_library(turbojpeg SHARED ${TURBOJPEG_SOURCES})
599     set_property(TARGET turbojpeg PROPERTY COMPILE_FLAGS
600       "-DBMP_SUPPORTED -DPPM_SUPPORTED")
601     if(WIN32)
602       set_target_properties(turbojpeg PROPERTIES DEFINE_SYMBOL DLLDEFINE)
603     endif()
604     if(MINGW)
605       set_target_properties(turbojpeg PROPERTIES LINK_FLAGS -Wl,--kill-at)
606     endif()
607     if(APPLE AND (NOT CMAKE_OSX_DEPLOYMENT_TARGET OR
608                   CMAKE_OSX_DEPLOYMENT_TARGET VERSION_GREATER 10.4))
609       if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG)
610         set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
611       endif()
612       set_target_properties(turbojpeg PROPERTIES MACOSX_RPATH 1)
613     endif()
614     set_target_properties(turbojpeg PROPERTIES
615       SOVERSION ${TURBOJPEG_SO_MAJOR_VERSION} VERSION ${TURBOJPEG_SO_VERSION})
616     if(TJMAPFLAG)
617       set_target_properties(turbojpeg PROPERTIES
618         LINK_FLAGS "${TJMAPFLAG}${TJMAPFILE}")
619     endif()
620
621     add_executable(tjunittest tjunittest.c tjutil.c md5/md5.c md5/md5hl.c)
622     target_link_libraries(tjunittest turbojpeg)
623
624     add_executable(tjbench tjbench.c tjutil.c)
625     target_link_libraries(tjbench turbojpeg)
626     if(UNIX)
627       target_link_libraries(tjbench m)
628     endif()
629
630     add_executable(tjexample tjexample.c)
631     target_link_libraries(tjexample turbojpeg)
632   endif()
633
634   if(ENABLE_STATIC)
635     add_library(turbojpeg-static STATIC ${JPEG_SOURCES} $<TARGET_OBJECTS:simd>
636       ${SIMD_OBJS} turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c rdbmp.c
637       rdppm.c wrbmp.c wrppm.c)
638     set_property(TARGET turbojpeg-static PROPERTY COMPILE_FLAGS
639       "-DBMP_SUPPORTED -DPPM_SUPPORTED")
640     if(NOT MSVC)
641       set_target_properties(turbojpeg-static PROPERTIES OUTPUT_NAME turbojpeg)
642     endif()
643
644     add_executable(tjunittest-static tjunittest.c tjutil.c md5/md5.c
645       md5/md5hl.c)
646     target_link_libraries(tjunittest-static turbojpeg-static)
647
648     add_executable(tjbench-static tjbench.c tjutil.c)
649     target_link_libraries(tjbench-static turbojpeg-static)
650     if(UNIX)
651       target_link_libraries(tjbench-static m)
652     endif()
653   endif()
654 endif()
655
656 if(WIN32)
657   set(USE_SETMODE "-DUSE_SETMODE")
658 endif()
659 if(WITH_12BIT)
660   set(COMPILE_FLAGS "-DGIF_SUPPORTED -DPPM_SUPPORTED ${USE_SETMODE}")
661 else()
662   set(COMPILE_FLAGS "-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED ${USE_SETMODE}")
663   set(CJPEG_BMP_SOURCES rdbmp.c rdtarga.c)
664   set(DJPEG_BMP_SOURCES wrbmp.c wrtarga.c)
665 endif()
666
667 if(ENABLE_STATIC)
668   add_executable(cjpeg-static cjpeg.c cdjpeg.c rdgif.c rdppm.c rdswitch.c
669     ${CJPEG_BMP_SOURCES})
670   set_property(TARGET cjpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
671   target_link_libraries(cjpeg-static jpeg-static)
672
673   add_executable(djpeg-static djpeg.c cdjpeg.c rdcolmap.c rdswitch.c wrgif.c
674     wrppm.c ${DJPEG_BMP_SOURCES})
675   set_property(TARGET djpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
676   target_link_libraries(djpeg-static jpeg-static)
677
678   add_executable(jpegtran-static jpegtran.c cdjpeg.c rdswitch.c transupp.c)
679   target_link_libraries(jpegtran-static jpeg-static)
680   set_property(TARGET jpegtran-static PROPERTY COMPILE_FLAGS "${USE_SETMODE}")
681 endif()
682
683 add_executable(rdjpgcom rdjpgcom.c)
684
685 add_executable(wrjpgcom wrjpgcom.c)
686
687
688 ###############################################################################
689 # TESTS
690 ###############################################################################
691
692 add_subdirectory(md5)
693
694 if(MSVC_IDE OR XCODE)
695   set(OBJDIR "\${CTEST_CONFIGURATION_TYPE}/")
696 else()
697   set(OBJDIR "")
698 endif()
699
700 enable_testing()
701
702 if(WITH_12BIT)
703   set(TESTORIG testorig12.jpg)
704   set(MD5_JPEG_RGB_ISLOW 9d7369207c520d37f2c1cbfcb82b2964)
705   set(MD5_JPEG_RGB_ISLOW2 a00bd20d8ae49684640ef7177d2e0b64)
706   set(MD5_PPM_RGB_ISLOW f3301d2219783b8b3d942b7239fa50c0)
707   set(MD5_JPEG_422_IFAST_OPT 7322e3bd2f127f7de4b40d4480ce60e4)
708   set(MD5_PPM_422_IFAST 79807fa552899e66a04708f533e16950)
709   set(MD5_PPM_422M_IFAST 07737bfe8a7c1c87aaa393a0098d16b0)
710   set(MD5_JPEG_420_IFAST_Q100_PROG 008ab68d6ddbba04a8f01deee4e0f9f8)
711   set(MD5_PPM_420_Q100_IFAST 1b3730122709f53d007255e8dfd3305e)
712   set(MD5_PPM_420M_Q100_IFAST 980a1a3c5bf9510022869d30b7d26566)
713   set(MD5_JPEG_GRAY_ISLOW 235c90707b16e2e069f37c888b2636d9)
714   set(MD5_PPM_GRAY_ISLOW 7213c10af507ad467da5578ca5ee1fca)
715   set(MD5_PPM_GRAY_ISLOW_RGB e96ee81c30a6ed422d466338bd3de65d)
716   set(MD5_JPEG_420S_IFAST_OPT 7af8e60be4d9c227ec63ac9b6630855e)
717
718   set(MD5_JPEG_3x2_FLOAT_PROG_SSE a8c17daf77b457725ec929e215b603f8)
719   set(MD5_PPM_3x2_FLOAT_SSE 42876ab9e5c2f76a87d08db5fbd57956)
720   set(MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT a8c17daf77b457725ec929e215b603f8)
721   set(MD5_PPM_3x2_FLOAT_NO_FP_CONTRACT ${MD5_PPM_3x2_FLOAT_SSE})
722   set(MD5_JPEG_3x2_FLOAT_PROG_FP_CONTRACT
723     ${MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT})
724   set(MD5_PPM_3x2_FLOAT_FP_CONTRACT ${MD5_PPM_3x2_FLOAT_SSE})
725   set(MD5_JPEG_3x2_FLOAT_PROG_387 bc6dbbefac2872f6b9d6c4a0ae60c3c0)
726   set(MD5_PPM_3x2_FLOAT_387 bcc5723c61560463ac60f772e742d092)
727   set(MD5_JPEG_3x2_FLOAT_PROG_MSVC e27840755870fa849872e58aa0cd1400)
728   set(MD5_PPM_3x2_FLOAT_MSVC 6c2880b83bb1aa41dfe330e7a9768690)
729
730   set(MD5_JPEG_3x2_IFAST_PROG 1396cc2b7185cfe943d408c9d305339e)
731   set(MD5_PPM_3x2_IFAST 3975985ef6eeb0a2cdc58daa651ccc00)
732   set(MD5_PPM_420M_ISLOW_2_1 4ca6be2a6f326ff9eaab63e70a8259c0)
733   set(MD5_PPM_420M_ISLOW_15_8 12aa9f9534c1b3d7ba047322226365eb)
734   set(MD5_PPM_420M_ISLOW_13_8 f7e22817c7b25e1393e4ec101e9d4e96)
735   set(MD5_PPM_420M_ISLOW_11_8 800a16f9f4dc9b293197bfe11be10a82)
736   set(MD5_PPM_420M_ISLOW_9_8 06b7a92a9bc69f4dc36ec40f1937d55c)
737   set(MD5_PPM_420M_ISLOW_7_8 3ec444a14a4ab4eab88ffc49c48eca43)
738   set(MD5_PPM_420M_ISLOW_3_4 3e726b7ea872445b19437d1c1d4f0d93)
739   set(MD5_PPM_420M_ISLOW_5_8 a8a771abdc94301d20ffac119b2caccd)
740   set(MD5_PPM_420M_ISLOW_1_2 b419124dd5568b085787234866102866)
741   set(MD5_PPM_420M_ISLOW_3_8 343d19015531b7bbe746124127244fa8)
742   set(MD5_PPM_420M_ISLOW_1_4 35fd59d866e44659edfa3c18db2a3edb)
743   set(MD5_PPM_420M_ISLOW_1_8 ccaed48ac0aedefda5d4abe4013f4ad7)
744   set(MD5_PPM_420_ISLOW_SKIP15_31 86664cd9dc956536409e44e244d20a97)
745   set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 452a21656115a163029cfba5c04fa76a)
746   set(MD5_PPM_444_ISLOW_SKIP1_6 ef63901f71ef7a75cd78253fc0914f84)
747   set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 15b173fb5872d9575572fbcc1b05956f)
748   set(MD5_JPEG_CROP cdb35ff4b4519392690ea040c56ea99c)
749 else()
750   set(TESTORIG testorig.jpg)
751   set(MD5_JPEG_RGB_ISLOW 1d44a406f61da743b5fd31c0a9abdca3)
752   set(MD5_JPEG_RGB_ISLOW2 31d121e57b6c2934c890a7fc7763bcd4)
753   set(MD5_PPM_RGB_ISLOW 00a257f5393fef8821f2b88ac7421291)
754   set(MD5_BMP_RGB_ISLOW_565 f07d2e75073e4bb10f6c6f4d36e2e3be)
755   set(MD5_BMP_RGB_ISLOW_565D 4cfa0928ef3e6bb626d7728c924cfda4)
756   set(MD5_JPEG_422_IFAST_OPT 2540287b79d913f91665e660303ab2c8)
757   set(MD5_PPM_422_IFAST 35bd6b3f833bad23de82acea847129fa)
758   set(MD5_PPM_422M_IFAST 8dbc65323d62cca7c91ba02dd1cfa81d)
759   set(MD5_BMP_422M_IFAST_565 3294bd4d9a1f2b3d08ea6020d0db7065)
760   set(MD5_BMP_422M_IFAST_565D da98c9c7b6039511be4a79a878a9abc1)
761   set(MD5_JPEG_420_IFAST_Q100_PROG e59bb462016a8d9a748c330a3474bb55)
762   set(MD5_PPM_420_Q100_IFAST 5a732542015c278ff43635e473a8a294)
763   set(MD5_PPM_420M_Q100_IFAST ff692ee9323a3b424894862557c092f1)
764   set(MD5_JPEG_GRAY_ISLOW 72b51f894b8f4a10b3ee3066770aa38d)
765   set(MD5_PPM_GRAY_ISLOW 8d3596c56eace32f205deccc229aa5ed)
766   set(MD5_PPM_GRAY_ISLOW_RGB 116424ac07b79e5e801f00508eab48ec)
767   set(MD5_BMP_GRAY_ISLOW_565 12f78118e56a2f48b966f792fedf23cc)
768   set(MD5_BMP_GRAY_ISLOW_565D bdbbd616441a24354c98553df5dc82db)
769   set(MD5_JPEG_420S_IFAST_OPT 388708217ac46273ca33086b22827ed8)
770
771   set(MD5_JPEG_3x2_FLOAT_PROG_SSE 343e3f8caf8af5986ebaf0bdc13b5c71)
772   set(MD5_PPM_3x2_FLOAT_SSE 1a75f36e5904d6fc3a85a43da9ad89bb)
773   set(MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT 9bca803d2042bd1eb03819e2bf92b3e5)
774   set(MD5_PPM_3x2_FLOAT_NO_FP_CONTRACT f6bfab038438ed8f5522fbd33595dcdc)
775   set(MD5_JPEG_3x2_FLOAT_PROG_FP_CONTRACT
776     ${MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT})
777   set(MD5_PPM_3x2_FLOAT_FP_CONTRACT 0e917a34193ef976b679a6b069b1be26)
778   set(MD5_JPEG_3x2_FLOAT_PROG_387 1657664a410e0822c924b54f6f65e6e9)
779   set(MD5_PPM_3x2_FLOAT_387 cb0a1f027f3d2917c902b5640214e025)
780   set(MD5_JPEG_3x2_FLOAT_PROG_MSVC 7999ce9cd0ee9b6c7043b7351ab7639d)
781   set(MD5_PPM_3x2_FLOAT_MSVC 28cdc448a6b75e97892f0e0f8d4b21f3)
782
783   set(MD5_JPEG_3x2_IFAST_PROG 1ee5d2c1a77f2da495f993c8c7cceca5)
784   set(MD5_PPM_3x2_IFAST fd283664b3b49127984af0a7f118fccd)
785   set(MD5_JPEG_420_ISLOW_ARI e986fb0a637a8d833d96e8a6d6d84ea1)
786   set(MD5_JPEG_444_ISLOW_PROGARI 0a8f1c8f66e113c3cf635df0a475a617)
787   # Since v1.5.1, libjpeg-turbo uses the separate non-fancy upsampling and
788   # YCbCr -> RGB color conversion routines rather than merged upsampling/color
789   # conversion when fancy upsampling is disabled on platforms that have a SIMD
790   # implementation of YCbCr -> RGB color conversion but no SIMD implementation
791   # of merged upsampling/color conversion.  This was intended to improve the
792   # performance of the Arm Neon SIMD extensions, the only SIMD extensions for
793   # which those circumstances currently apply.  The separate non-fancy
794   # upsampling and color conversion routines usually produce bitwise-identical
795   # output to the merged upsampling/color conversion routines, but that is not
796   # the case when skipping scanlines starting at an odd-numbered scanline.  In
797   # libjpeg-turbo 2.0.5 and prior, doing that while using merged h2v2
798   # upsampling caused a segfault, so this test validates the fix for that
799   # segfault.  Unfortunately, however, the test also produces different bitwise
800   # output when using the Neon SIMD extensions, because of the aforementioned
801   # optimization.  The easiest workaround is to use the old test from
802   # libjpeg-turbo 2.0.5 and prior when using the Neon SIMD extensions.  The
803   # aforementioned segfault never would have occurred with the Neon SIMD
804   # extensions anyhow, since merged upsampling is disabled when using them.
805   if((CPU_TYPE STREQUAL "arm64" OR CPU_TYPE STREQUAL "arm") AND WITH_SIMD)
806     set(MD5_PPM_420M_IFAST_ARI 72b59a99bcf1de24c5b27d151bde2437)
807   else()
808     set(MD5_PPM_420M_IFAST_ARI 57251da28a35b46eecb7177d82d10e0e)
809   endif()
810   set(MD5_JPEG_420_ISLOW 9a68f56bc76e466aa7e52f415d0f4a5f)
811   set(MD5_PPM_420M_ISLOW_2_1 9f9de8c0612f8d06869b960b05abf9c9)
812   set(MD5_PPM_420M_ISLOW_15_8 b6875bc070720b899566cc06459b63b7)
813   set(MD5_PPM_420M_ISLOW_13_8 bc3452573c8152f6ae552939ee19f82f)
814   set(MD5_PPM_420M_ISLOW_11_8 d8cc73c0aaacd4556569b59437ba00a5)
815   set(MD5_PPM_420M_ISLOW_9_8 d25e61bc7eac0002f5b393aa223747b6)
816   set(MD5_PPM_420M_ISLOW_7_8 ddb564b7c74a09494016d6cd7502a946)
817   set(MD5_PPM_420M_ISLOW_3_4 8ed8e68808c3fbc4ea764fc9d2968646)
818   set(MD5_PPM_420M_ISLOW_5_8 a3363274999da2366a024efae6d16c9b)
819   set(MD5_PPM_420M_ISLOW_1_2 e692a315cea26b988c8e8b29a5dbcd81)
820   set(MD5_PPM_420M_ISLOW_3_8 79eca9175652ced755155c90e785a996)
821   set(MD5_PPM_420M_ISLOW_1_4 79cd778f8bf1a117690052cacdd54eca)
822   set(MD5_PPM_420M_ISLOW_1_8 391b3d4aca640c8567d6f8745eb2142f)
823   set(MD5_BMP_420_ISLOW_256 4980185e3776e89bd931736e1cddeee6)
824   set(MD5_BMP_420_ISLOW_565 bf9d13e16c4923b92e1faa604d7922cb)
825   set(MD5_BMP_420_ISLOW_565D 6bde71526acc44bcff76f696df8638d2)
826   set(MD5_BMP_420M_ISLOW_565 8dc0185245353cfa32ad97027342216f)
827   set(MD5_BMP_420M_ISLOW_565D ce034037d212bc403330df6f915c161b)
828   set(MD5_PPM_420_ISLOW_SKIP15_31 c4c65c1e43d7275cd50328a61e6534f0)
829   set(MD5_PPM_420_ISLOW_ARI_SKIP16_139 087c6b123db16ac00cb88c5b590bb74a)
830   set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 26eb36ccc7d1f0cb80cdabb0ac8b5d99)
831   set(MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4 886c6775af22370257122f8b16207e6d)
832   set(MD5_PPM_444_ISLOW_SKIP1_6 5606f86874cf26b8fcee1117a0a436a6)
833   set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 db87dc7ce26bcdc7a6b56239ce2b9d6c)
834   set(MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0 cb57b32bd6d03e35432362f7bf184b6d)
835   set(MD5_JPEG_CROP b4197f377e621c4e9b1d20471432610d)
836 endif()
837
838 if(WITH_JAVA)
839   add_test(TJUnitTest
840     ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
841       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
842       TJUnitTest)
843   add_test(TJUnitTest-yuv
844     ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
845       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
846       TJUnitTest -yuv)
847   add_test(TJUnitTest-yuv-nopad
848     ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
849       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
850       TJUnitTest -yuv -noyuvpad)
851   add_test(TJUnitTest-bi
852     ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
853       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
854       TJUnitTest -bi)
855   add_test(TJUnitTest-bi-yuv
856     ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
857       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
858       TJUnitTest -bi -yuv)
859   add_test(TJUnitTest-bi-yuv-nopad
860     ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
861       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
862       TJUnitTest -bi -yuv -noyuvpad)
863 endif()
864
865 set(TEST_LIBTYPES "")
866 if(ENABLE_SHARED)
867   set(TEST_LIBTYPES ${TEST_LIBTYPES} shared)
868 endif()
869 if(ENABLE_STATIC)
870   set(TEST_LIBTYPES ${TEST_LIBTYPES} static)
871 endif()
872
873 set(TESTIMAGES ${CMAKE_CURRENT_SOURCE_DIR}/testimages)
874 set(MD5CMP ${CMAKE_CURRENT_BINARY_DIR}/md5/md5cmp)
875 if(CMAKE_CROSSCOMPILING)
876   file(RELATIVE_PATH TESTIMAGES ${CMAKE_CURRENT_BINARY_DIR} ${TESTIMAGES})
877   file(RELATIVE_PATH MD5CMP ${CMAKE_CURRENT_BINARY_DIR} ${MD5CMP})
878 endif()
879
880 # The output of the floating point DCT/IDCT algorithms differs depending on the
881 # type of floating point math used, so the FLOATTEST CMake variable must be
882 # set in order to tell the testing system which floating point results it
883 # should expect:
884 #
885 # sse = validate against the expected results from the libjpeg-turbo SSE SIMD
886 #       extensions
887 # no-fp-contract = validate against the expected results from the C code when
888 #                  floating point expression contraction is disabled (the
889 #                  default with Clang, with GCC when building for platforms
890 #                  that lack fused multiply-add [FMA] instructions, or when
891 #                  passing -ffp-contract=off to the compiler)
892 # fp-contract = validate against the expected results from the C code when
893 #               floating point expression contraction is enabled (the default
894 #               with GCC when building for platforms that have fused multiply-
895 #               add [FMA] instructions or when passing -ffp-contract=fast to
896 #               the compiler)
897 # 387 = validate against the expected results from the C code when the 387 FPU
898 #       is being used for floating point math (which is generally the default
899 #       with x86 compilers)
900 # msvc = validate against the expected results from the C code when compiled
901 #        with a 32-bit version of Visual C++
902
903 if(CPU_TYPE STREQUAL "x86_64" OR CPU_TYPE STREQUAL "i386")
904   if(WITH_SIMD)
905     set(DEFAULT_FLOATTEST sse)
906   elseif(CPU_TYPE STREQUAL "x86_64")
907     set(DEFAULT_FLOATTEST no-fp-contract)
908   elseif(CPU_TYPE STREQUAL "i386" AND MSVC)
909     set(DEFAULT_FLOATTEST msvc)
910   # else we can't really set an intelligent default for i386.  The appropriate
911   # value could be 387, no-fp-contract, or fp-contract, depending on the
912   # compiler and compiler options.  We leave it to the user to set FLOATTEST
913   # manually.
914   endif()
915 else()
916   if((CPU_TYPE STREQUAL "powerpc" OR CPU_TYPE STREQUAL "arm64") AND
917     NOT CMAKE_C_COMPILER_ID STREQUAL "Clang")
918     set(DEFAULT_FLOATTEST fp-contract)
919   else()
920     set(DEFAULT_FLOATTEST no-fp-contract)
921   endif()
922 endif()
923
924 # This causes FLOATTEST to reset to the default value if WITH_SIMD has
925 # changed.
926 if(DEFINED WITH_SIMD_INT AND NOT WITH_SIMD EQUAL WITH_SIMD_INT)
927   set(FORCE_FLOATTEST "FORCE")
928 endif()
929 set(WITH_SIMD_INT ${WITH_SIMD} CACHE INTERNAL "")
930 set(FLOATTEST ${DEFAULT_FLOATTEST} CACHE STRING
931   "The type of floating point math used by the floating point DCT/IDCT algorithms.  This tells the testing system which numerical results it should expect from those tests.  [sse = libjpeg-turbo x86/x86-64 SIMD extensions, no-fp-contract = generic FPU with floating point expression contraction disabled, fp-contract = generic FPU with floating point expression contraction enabled, 387 = 387 FPU, msvc = 32-bit Visual Studio] (default = ${DEFAULT_FLOATTEST})"
932   ${FORCE_FLOATTEST})
933 message(STATUS "FLOATTEST = ${FLOATTEST}")
934
935 if(FLOATTEST)
936   string(TOUPPER ${FLOATTEST} FLOATTEST_UC)
937   string(REGEX REPLACE "-" "_" FLOATTEST_UC ${FLOATTEST_UC})
938   string(TOLOWER ${FLOATTEST} FLOATTEST)
939   if(NOT FLOATTEST STREQUAL "sse" AND
940     NOT FLOATTEST STREQUAL "no-fp-contract" AND
941     NOT FLOATTEST STREQUAL "fp-contract" AND NOT FLOATTEST STREQUAL "387" AND
942     NOT FLOATTEST STREQUAL "msvc")
943     message(FATAL_ERROR "\"${FLOATTEST}\" is not a valid value for FLOATTEST.")
944   endif()
945 endif()
946
947 foreach(libtype ${TEST_LIBTYPES})
948   if(libtype STREQUAL "static")
949     set(suffix -static)
950   endif()
951   if(WITH_TURBOJPEG)
952     add_test(tjunittest-${libtype}
953       ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix})
954     add_test(tjunittest-${libtype}-alloc
955       ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -alloc)
956     add_test(tjunittest-${libtype}-yuv
957       ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -yuv)
958     add_test(tjunittest-${libtype}-yuv-alloc
959       ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -yuv -alloc)
960     add_test(tjunittest-${libtype}-yuv-nopad
961       ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -yuv -noyuvpad)
962     add_test(tjunittest-${libtype}-bmp
963       ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -bmp)
964
965     set(MD5_PPM_GRAY_TILE 89d3ca21213d9d864b50b4e4e7de4ca6)
966     set(MD5_PPM_420_8x8_TILE 847fceab15c5b7b911cb986cf0f71de3)
967     set(MD5_PPM_420_16x16_TILE ca45552a93687e078f7137cc4126a7b0)
968     set(MD5_PPM_420_32x32_TILE d8676f1d6b68df358353bba9844f4a00)
969     set(MD5_PPM_420_64x64_TILE 4e4c1a3d7ea4bace4f868bcbe83b7050)
970     set(MD5_PPM_420_128x128_TILE f24c3429c52265832beab9df72a0ceae)
971     set(MD5_PPM_420M_8x8_TILE bc25320e1f4c31ce2e610e43e9fd173c)
972     set(MD5_PPM_420M_TILE 75ffdf14602258c5c189522af57fa605)
973     set(MD5_PPM_422_8x8_TILE d83dacd9fc73b0a6f10c09acad64eb1e)
974     set(MD5_PPM_422_16x16_TILE 35077fb610d72dd743b1eb0cbcfe10fb)
975     set(MD5_PPM_422_32x32_TILE e6902ed8a449ecc0f0d6f2bf945f65f7)
976     set(MD5_PPM_422_64x64_TILE 2b4502a8f316cedbde1da7bce3d2231e)
977     set(MD5_PPM_422_128x128_TILE f0b5617d578f5e13c8eee215d64d4877)
978     set(MD5_PPM_422M_8x8_TILE 828941d7f41cd6283abd6beffb7fd51d)
979     set(MD5_PPM_422M_TILE e877ae1324c4a280b95376f7f018172f)
980     set(MD5_PPM_444_TILE 7964e41e67cfb8d0a587c0aa4798f9c3)
981
982     # Test compressing from/decompressing to an arbitrary subregion of a larger
983     # image buffer
984     add_test(tjbench-${libtype}-tile-cp
985       ${CMAKE_COMMAND} -E copy_if_different ${TESTIMAGES}/testorig.ppm
986         testout_tile.ppm)
987     add_test(tjbench-${libtype}-tile
988       ${CMAKE_CROSSCOMPILING_EMULATOR} tjbench${suffix} testout_tile.ppm 95
989         -rgb -quiet -tile -benchtime 0.01 -warmup 0)
990     set_tests_properties(tjbench-${libtype}-tile
991       PROPERTIES DEPENDS tjbench-${libtype}-tile-cp)
992
993     foreach(tile 8 16 32 64 128)
994       add_test(tjbench-${libtype}-tile-gray-${tile}x${tile}-cmp
995         ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_GRAY_TILE}
996           testout_tile_GRAY_Q95_${tile}x${tile}.ppm)
997       foreach(subsamp 420 422)
998         add_test(tjbench-${libtype}-tile-${subsamp}-${tile}x${tile}-cmp
999           ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP}
1000             ${MD5_PPM_${subsamp}_${tile}x${tile}_TILE}
1001             testout_tile_${subsamp}_Q95_${tile}x${tile}.ppm)
1002       endforeach()
1003       add_test(tjbench-${libtype}-tile-444-${tile}x${tile}-cmp
1004         ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_444_TILE}
1005           testout_tile_444_Q95_${tile}x${tile}.ppm)
1006       foreach(subsamp gray 420 422 444)
1007         set_tests_properties(tjbench-${libtype}-tile-${subsamp}-${tile}x${tile}-cmp
1008           PROPERTIES DEPENDS tjbench-${libtype}-tile)
1009       endforeach()
1010     endforeach()
1011
1012     add_test(tjbench-${libtype}-tilem-cp
1013       ${CMAKE_COMMAND} -E copy_if_different ${TESTIMAGES}/testorig.ppm
1014         testout_tilem.ppm)
1015     add_test(tjbench-${libtype}-tilem
1016       ${CMAKE_CROSSCOMPILING_EMULATOR} tjbench${suffix} testout_tilem.ppm 95
1017         -rgb -fastupsample -quiet -tile -benchtime 0.01 -warmup 0)
1018     set_tests_properties(tjbench-${libtype}-tilem
1019       PROPERTIES DEPENDS tjbench-${libtype}-tilem-cp)
1020
1021     add_test(tjbench-${libtype}-tile-420m-8x8-cmp
1022       ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_420M_8x8_TILE}
1023         testout_tilem_420_Q95_8x8.ppm)
1024     add_test(tjbench-${libtype}-tile-422m-8x8-cmp
1025       ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_422M_8x8_TILE}
1026         testout_tilem_422_Q95_8x8.ppm)
1027     foreach(tile 16 32 64 128)
1028       foreach(subsamp 420 422)
1029         add_test(tjbench-${libtype}-tile-${subsamp}m-${tile}x${tile}-cmp
1030           ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP}
1031             ${MD5_PPM_${subsamp}M_TILE}
1032             testout_tilem_${subsamp}_Q95_${tile}x${tile}.ppm)
1033       endforeach()
1034     endforeach()
1035     foreach(tile 8 16 32 64 128)
1036       foreach(subsamp 420 422)
1037         set_tests_properties(tjbench-${libtype}-tile-${subsamp}m-${tile}x${tile}-cmp
1038           PROPERTIES DEPENDS tjbench-${libtype}-tilem)
1039       endforeach()
1040     endforeach()
1041   endif()
1042
1043   # These tests are carefully crafted to provide full coverage of as many of
1044   # the underlying algorithms as possible (including all of the
1045   # SIMD-accelerated ones.)
1046
1047   macro(add_bittest PROG NAME ARGS OUTFILE INFILE MD5SUM)
1048     add_test(${PROG}-${libtype}-${NAME}
1049       ${CMAKE_CROSSCOMPILING_EMULATOR} ${PROG}${suffix} ${ARGS}
1050         -outfile ${OUTFILE} ${INFILE})
1051     add_test(${PROG}-${libtype}-${NAME}-cmp
1052       ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5SUM} ${OUTFILE})
1053     set_tests_properties(${PROG}-${libtype}-${NAME}-cmp PROPERTIES
1054       DEPENDS ${PROG}-${libtype}-${NAME})
1055     if(${ARGC} GREATER 6)
1056       set(DEPENDS ${ARGN})
1057       set_tests_properties(${PROG}-${libtype}-${NAME} PROPERTIES
1058         DEPENDS ${DEPENDS})
1059     endif()
1060   endmacro()
1061
1062   # CC: null  SAMP: fullsize  FDCT: islow  ENT: huff
1063   add_bittest(cjpeg rgb-islow "-rgb;-dct;int;-icc;${TESTIMAGES}/test1.icc"
1064     testout_rgb_islow.jpg ${TESTIMAGES}/testorig.ppm
1065     ${MD5_JPEG_RGB_ISLOW})
1066
1067   # CC: null  SAMP: fullsize  IDCT: islow  ENT: huff
1068   add_bittest(djpeg rgb-islow "-dct;int;-ppm;-icc;testout_rgb_islow.icc"
1069     testout_rgb_islow.ppm testout_rgb_islow.jpg
1070     ${MD5_PPM_RGB_ISLOW} cjpeg-${libtype}-rgb-islow)
1071
1072   add_test(djpeg-${libtype}-rgb-islow-icc-cmp
1073     ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP}
1074       b06a39d730129122e85c1363ed1bbc9e testout_rgb_islow.icc)
1075   set_tests_properties(djpeg-${libtype}-rgb-islow-icc-cmp PROPERTIES
1076     DEPENDS djpeg-${libtype}-rgb-islow)
1077
1078   add_bittest(jpegtran icc "-copy;all;-icc;${TESTIMAGES}/test2.icc"
1079     testout_rgb_islow2.jpg testout_rgb_islow.jpg
1080     ${MD5_JPEG_RGB_ISLOW2} cjpeg-${libtype}-rgb-islow)
1081
1082   if(NOT WITH_12BIT)
1083     # CC: RGB->RGB565  SAMP: fullsize  IDCT: islow  ENT: huff
1084     add_bittest(djpeg rgb-islow-565 "-dct;int;-rgb565;-dither;none;-bmp"
1085       testout_rgb_islow_565.bmp testout_rgb_islow.jpg
1086       ${MD5_BMP_RGB_ISLOW_565} cjpeg-${libtype}-rgb-islow)
1087
1088     # CC: RGB->RGB565 (dithered)  SAMP: fullsize  IDCT: islow  ENT: huff
1089     add_bittest(djpeg rgb-islow-565D "-dct;int;-rgb565;-bmp"
1090       testout_rgb_islow_565D.bmp testout_rgb_islow.jpg
1091       ${MD5_BMP_RGB_ISLOW_565D} cjpeg-${libtype}-rgb-islow)
1092   endif()
1093
1094   # CC: RGB->YCC  SAMP: fullsize/h2v1  FDCT: ifast  ENT: 2-pass huff
1095   add_bittest(cjpeg 422-ifast-opt "-sample;2x1;-dct;fast;-opt"
1096     testout_422_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm
1097     ${MD5_JPEG_422_IFAST_OPT})
1098
1099   # CC: YCC->RGB  SAMP: fullsize/h2v1 fancy  IDCT: ifast  ENT: huff
1100   add_bittest(djpeg 422-ifast "-dct;fast"
1101     testout_422_ifast.ppm testout_422_ifast_opt.jpg
1102     ${MD5_PPM_422_IFAST} cjpeg-${libtype}-422-ifast-opt)
1103
1104   # CC: YCC->RGB  SAMP: h2v1 merged  IDCT: ifast  ENT: huff
1105   add_bittest(djpeg 422m-ifast "-dct;fast;-nosmooth"
1106     testout_422m_ifast.ppm testout_422_ifast_opt.jpg
1107     ${MD5_PPM_422M_IFAST} cjpeg-${libtype}-422-ifast-opt)
1108
1109   if(NOT WITH_12BIT)
1110     # CC: YCC->RGB565  SAMP: h2v1 merged  IDCT: ifast  ENT: huff
1111     add_bittest(djpeg 422m-ifast-565
1112       "-dct;int;-nosmooth;-rgb565;-dither;none;-bmp"
1113       testout_422m_ifast_565.bmp testout_422_ifast_opt.jpg
1114       ${MD5_BMP_422M_IFAST_565} cjpeg-${libtype}-422-ifast-opt)
1115
1116     # CC: YCC->RGB565 (dithered)  SAMP: h2v1 merged  IDCT: ifast  ENT: huff
1117     add_bittest(djpeg 422m-ifast-565D "-dct;int;-nosmooth;-rgb565;-bmp"
1118       testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg
1119       ${MD5_BMP_422M_IFAST_565D} cjpeg-${libtype}-422-ifast-opt)
1120   endif()
1121
1122   # CC: RGB->YCC  SAMP: fullsize/h2v2  FDCT: ifast  ENT: prog huff
1123   add_bittest(cjpeg 420-q100-ifast-prog
1124     "-sample;2x2;-quality;100;-dct;fast;-scans;${TESTIMAGES}/test.scan"
1125     testout_420_q100_ifast_prog.jpg ${TESTIMAGES}/testorig.ppm
1126     ${MD5_JPEG_420_IFAST_Q100_PROG})
1127
1128   # CC: YCC->RGB  SAMP: fullsize/h2v2 fancy  IDCT: ifast  ENT: prog huff
1129   add_bittest(djpeg 420-q100-ifast-prog "-dct;fast"
1130     testout_420_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
1131     ${MD5_PPM_420_Q100_IFAST} cjpeg-${libtype}-420-q100-ifast-prog)
1132
1133   # CC: YCC->RGB  SAMP: h2v2 merged  IDCT: ifast  ENT: prog huff
1134   add_bittest(djpeg 420m-q100-ifast-prog "-dct;fast;-nosmooth"
1135     testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
1136     ${MD5_PPM_420M_Q100_IFAST} cjpeg-${libtype}-420-q100-ifast-prog)
1137
1138   # CC: RGB->Gray  SAMP: fullsize  FDCT: islow  ENT: huff
1139   add_bittest(cjpeg gray-islow "-gray;-dct;int"
1140     testout_gray_islow.jpg ${TESTIMAGES}/testorig.ppm
1141     ${MD5_JPEG_GRAY_ISLOW})
1142
1143   # CC: Gray->Gray  SAMP: fullsize  IDCT: islow  ENT: huff
1144   add_bittest(djpeg gray-islow "-dct;int"
1145     testout_gray_islow.ppm testout_gray_islow.jpg
1146     ${MD5_PPM_GRAY_ISLOW} cjpeg-${libtype}-gray-islow)
1147
1148   # CC: Gray->RGB  SAMP: fullsize  IDCT: islow  ENT: huff
1149   add_bittest(djpeg gray-islow-rgb "-dct;int;-rgb"
1150     testout_gray_islow_rgb.ppm testout_gray_islow.jpg
1151     ${MD5_PPM_GRAY_ISLOW_RGB} cjpeg-${libtype}-gray-islow)
1152
1153   if(NOT WITH_12BIT)
1154     # CC: Gray->RGB565  SAMP: fullsize  IDCT: islow  ENT: huff
1155     add_bittest(djpeg gray-islow-565 "-dct;int;-rgb565;-dither;none;-bmp"
1156       testout_gray_islow_565.bmp testout_gray_islow.jpg
1157       ${MD5_BMP_GRAY_ISLOW_565} cjpeg-${libtype}-gray-islow)
1158
1159     # CC: Gray->RGB565 (dithered)  SAMP: fullsize  IDCT: islow  ENT: huff
1160     add_bittest(djpeg gray-islow-565D "-dct;int;-rgb565;-bmp"
1161       testout_gray_islow_565D.bmp testout_gray_islow.jpg
1162       ${MD5_BMP_GRAY_ISLOW_565D} cjpeg-${libtype}-gray-islow)
1163   endif()
1164
1165   # CC: RGB->YCC  SAMP: fullsize smooth/h2v2 smooth  FDCT: islow
1166   # ENT: 2-pass huff
1167   add_bittest(cjpeg 420s-ifast-opt "-sample;2x2;-smooth;1;-dct;int;-opt"
1168     testout_420s_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm
1169     ${MD5_JPEG_420S_IFAST_OPT})
1170
1171   if(FLOATTEST)
1172     # CC: RGB->YCC  SAMP: fullsize/int  FDCT: float  ENT: prog huff
1173     add_bittest(cjpeg 3x2-float-prog "-sample;3x2;-dct;float;-prog"
1174       testout_3x2_float_prog.jpg ${TESTIMAGES}/testorig.ppm
1175       ${MD5_JPEG_3x2_FLOAT_PROG_${FLOATTEST_UC}})
1176
1177     # CC: YCC->RGB  SAMP: fullsize/int  IDCT: float  ENT: prog huff
1178     add_bittest(djpeg 3x2-float-prog "-dct;float"
1179       testout_3x2_float.ppm testout_3x2_float_prog.jpg
1180       ${MD5_PPM_3x2_FLOAT_${FLOATTEST_UC}} cjpeg-${libtype}-3x2-float-prog)
1181   endif()
1182
1183     # CC: RGB->YCC  SAMP: fullsize/int  FDCT: ifast  ENT: prog huff
1184   add_bittest(cjpeg 3x2-ifast-prog "-sample;3x2;-dct;fast;-prog"
1185     testout_3x2_ifast_prog.jpg ${TESTIMAGES}/testorig.ppm
1186     ${MD5_JPEG_3x2_IFAST_PROG})
1187
1188   # CC: YCC->RGB  SAMP: fullsize/int  IDCT: ifast  ENT: prog huff
1189   add_bittest(djpeg 3x2-ifast-prog "-dct;fast"
1190     testout_3x2_ifast.ppm testout_3x2_ifast_prog.jpg
1191     ${MD5_PPM_3x2_IFAST} cjpeg-${libtype}-3x2-ifast-prog)
1192
1193   if(WITH_ARITH_ENC)
1194     # CC: YCC->RGB  SAMP: fullsize/h2v2  FDCT: islow  ENT: arith
1195     add_bittest(cjpeg 420-islow-ari "-dct;int;-arithmetic"
1196       testout_420_islow_ari.jpg ${TESTIMAGES}/testorig.ppm
1197       ${MD5_JPEG_420_ISLOW_ARI})
1198
1199     add_bittest(jpegtran 420-islow-ari "-arithmetic"
1200       testout_420_islow_ari2.jpg ${TESTIMAGES}/testimgint.jpg
1201       ${MD5_JPEG_420_ISLOW_ARI})
1202
1203     # CC: YCC->RGB  SAMP: fullsize  FDCT: islow  ENT: prog arith
1204     add_bittest(cjpeg 444-islow-progari
1205       "-sample;1x1;-dct;int;-prog;-arithmetic"
1206       testout_444_islow_progari.jpg ${TESTIMAGES}/testorig.ppm
1207       ${MD5_JPEG_444_ISLOW_PROGARI})
1208   endif()
1209
1210   if(WITH_ARITH_DEC)
1211     # CC: RGB->YCC  SAMP: h2v2 merged  IDCT: ifast  ENT: arith
1212     if((CPU_TYPE STREQUAL "arm64" OR CPU_TYPE STREQUAL "arm") AND WITH_SIMD)
1213       # Refer to the comment above the definition of MD5_PPM_420M_IFAST_ARI for
1214       # an explanation of why this is necessary.
1215       add_bittest(djpeg 420m-ifast-ari "-fast;-ppm"
1216         testout_420m_ifast_ari.ppm ${TESTIMAGES}/testimgari.jpg
1217         ${MD5_PPM_420M_IFAST_ARI})
1218     else()
1219       add_bittest(djpeg 420m-ifast-ari "-fast;-skip;1,20;-ppm"
1220         testout_420m_ifast_ari.ppm ${TESTIMAGES}/testimgari.jpg
1221         ${MD5_PPM_420M_IFAST_ARI})
1222     endif()
1223
1224     add_bittest(jpegtran 420-islow ""
1225       testout_420_islow.jpg ${TESTIMAGES}/testimgari.jpg
1226       ${MD5_JPEG_420_ISLOW})
1227   endif()
1228
1229   # 2/1--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 16x16 islow  ENT: huff
1230   # 15/8--  CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 15x15 islow  ENT: huff
1231   # 13/8--  CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 13x13 islow  ENT: huff
1232   # 11/8--  CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 11x11 islow  ENT: huff
1233   # 9/8--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 9x9 islow  ENT: huff
1234   # 7/8--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 7x7 islow/14x14 islow
1235   #         ENT: huff
1236   # 3/4--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 6x6 islow/12x12 islow
1237   #         ENT: huff
1238   # 5/8--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 5x5 islow/10x10 islow
1239   #         ENT: huff
1240   # 1/2--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 4x4 islow/8x8 islow
1241   #         ENT: huff
1242   # 3/8--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 3x3 islow/6x6 islow
1243   #         ENT: huff
1244   # 1/4--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 2x2 islow/4x4 islow
1245   #         ENT: huff
1246   # 1/8--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 1x1 islow/2x2 islow
1247   #         ENT: huff
1248   foreach(scale 2_1 15_8 13_8 11_8 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8)
1249     string(REGEX REPLACE "_" "/" scalearg ${scale})
1250     add_bittest(djpeg 420m-islow-${scale}
1251       "-dct;int;-scale;${scalearg};-nosmooth;-ppm"
1252       testout_420m_islow_${scale}.ppm ${TESTIMAGES}/${TESTORIG}
1253       ${MD5_PPM_420M_ISLOW_${scale}})
1254   endforeach()
1255
1256   if(NOT WITH_12BIT)
1257     # CC: YCC->RGB (dithered)  SAMP: h2v2 fancy  IDCT: islow  ENT: huff
1258     add_bittest(djpeg 420-islow-256 "-dct;int;-colors;256;-bmp"
1259       testout_420_islow_256.bmp ${TESTIMAGES}/${TESTORIG}
1260       ${MD5_BMP_420_ISLOW_256})
1261
1262     # CC: YCC->RGB565  SAMP: h2v2 fancy  IDCT: islow  ENT: huff
1263     add_bittest(djpeg 420-islow-565 "-dct;int;-rgb565;-dither;none;-bmp"
1264       testout_420_islow_565.bmp ${TESTIMAGES}/${TESTORIG}
1265       ${MD5_BMP_420_ISLOW_565})
1266
1267     # CC: YCC->RGB565 (dithered)  SAMP: h2v2 fancy  IDCT: islow  ENT: huff
1268     add_bittest(djpeg 420-islow-565D "-dct;int;-rgb565;-bmp"
1269       testout_420_islow_565D.bmp ${TESTIMAGES}/${TESTORIG}
1270       ${MD5_BMP_420_ISLOW_565D})
1271
1272     # CC: YCC->RGB565  SAMP: h2v2 merged  IDCT: islow  ENT: huff
1273     add_bittest(djpeg 420m-islow-565
1274       "-dct;int;-nosmooth;-rgb565;-dither;none;-bmp"
1275       testout_420m_islow_565.bmp ${TESTIMAGES}/${TESTORIG}
1276       ${MD5_BMP_420M_ISLOW_565})
1277
1278     # CC: YCC->RGB565 (dithered)  SAMP: h2v2 merged  IDCT: islow  ENT: huff
1279     add_bittest(djpeg 420m-islow-565D "-dct;int;-nosmooth;-rgb565;-bmp"
1280       testout_420m_islow_565D.bmp ${TESTIMAGES}/${TESTORIG}
1281       ${MD5_BMP_420M_ISLOW_565D})
1282   endif()
1283
1284   # Partial decode tests.  These tests are designed to cover all of the
1285   # possible code paths in jpeg_skip_scanlines().
1286
1287   # Context rows: Yes  Intra-iMCU row: Yes  iMCU row prefetch: No   ENT: huff
1288   add_bittest(djpeg 420-islow-skip15_31 "-dct;int;-skip;15,31;-ppm"
1289     testout_420_islow_skip15,31.ppm ${TESTIMAGES}/${TESTORIG}
1290     ${MD5_PPM_420_ISLOW_SKIP15_31})
1291
1292   # Context rows: Yes  Intra-iMCU row: No   iMCU row prefetch: Yes  ENT: arith
1293   if(WITH_ARITH_DEC)
1294     add_bittest(djpeg 420-islow-ari-skip16_139 "-dct;int;-skip;16,139;-ppm"
1295       testout_420_islow_ari_skip16,139.ppm ${TESTIMAGES}/testimgari.jpg
1296       ${MD5_PPM_420_ISLOW_ARI_SKIP16_139})
1297   endif()
1298
1299   # Context rows: Yes  Intra-iMCU row: No   iMCU row prefetch: No   ENT: prog huff
1300   add_test(cjpeg-${libtype}-420-islow-prog
1301     ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -prog
1302       -outfile testout_420_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
1303   add_bittest(djpeg 420-islow-prog-crop62x62_71_71
1304     "-dct;int;-crop;62x62+71+71;-ppm"
1305     testout_420_islow_prog_crop62x62,71,71.ppm testout_420_islow_prog.jpg
1306     ${MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71} cjpeg-${libtype}-420-islow-prog)
1307
1308   # Context rows: Yes  Intra-iMCU row: No   iMCU row prefetch: No   ENT: arith
1309   if(WITH_ARITH_DEC)
1310     add_bittest(djpeg 420-islow-ari-crop53x53_4_4
1311       "-dct;int;-crop;53x53+4+4;-ppm"
1312       testout_420_islow_ari_crop53x53,4,4.ppm ${TESTIMAGES}/testimgari.jpg
1313       ${MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4})
1314   endif()
1315
1316   # Context rows: No   Intra-iMCU row: Yes  ENT: huff
1317   add_test(cjpeg-${libtype}-444-islow
1318     ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -sample 1x1
1319       -outfile testout_444_islow.jpg ${TESTIMAGES}/testorig.ppm)
1320   add_bittest(djpeg 444-islow-skip1_6 "-dct;int;-skip;1,6;-ppm"
1321     testout_444_islow_skip1,6.ppm testout_444_islow.jpg
1322     ${MD5_PPM_444_ISLOW_SKIP1_6} cjpeg-${libtype}-444-islow)
1323
1324   # Context rows: No   Intra-iMCU row: No   ENT: prog huff
1325   add_test(cjpeg-${libtype}-444-islow-prog
1326     ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -prog -sample 1x1
1327       -outfile testout_444_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
1328   add_bittest(djpeg 444-islow-prog-crop98x98_13_13
1329     "-dct;int;-crop;98x98+13+13;-ppm"
1330     testout_444_islow_prog_crop98x98,13,13.ppm testout_444_islow_prog.jpg
1331     ${MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13} cjpeg-${libtype}-444-islow-prog)
1332
1333   # Context rows: No   Intra-iMCU row: No   ENT: arith
1334   if(WITH_ARITH_ENC)
1335     add_test(cjpeg-${libtype}-444-islow-ari
1336       ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -arithmetic
1337         -sample 1x1 -outfile testout_444_islow_ari.jpg
1338         ${TESTIMAGES}/testorig.ppm)
1339     if(WITH_ARITH_DEC)
1340       add_bittest(djpeg 444-islow-ari-crop37x37_0_0
1341         "-dct;int;-crop;37x37+0+0;-ppm"
1342         testout_444_islow_ari_crop37x37,0,0.ppm testout_444_islow_ari.jpg
1343         ${MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0} cjpeg-${libtype}-444-islow-ari)
1344     endif()
1345   endif()
1346
1347   add_bittest(jpegtran crop "-crop;120x90+20+50;-transpose;-perfect"
1348     testout_crop.jpg ${TESTIMAGES}/${TESTORIG}
1349     ${MD5_JPEG_CROP})
1350
1351 endforeach()
1352
1353 add_custom_target(testclean COMMAND ${CMAKE_COMMAND} -P
1354   ${CMAKE_CURRENT_SOURCE_DIR}/cmakescripts/testclean.cmake)
1355
1356 configure_file(croptest.in croptest @ONLY)
1357 add_custom_target(croptest
1358   COMMAND echo croptest
1359   COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/croptest)
1360
1361 if(WITH_TURBOJPEG)
1362   configure_file(tjbenchtest.in tjbenchtest @ONLY)
1363   configure_file(tjexampletest.in tjexampletest @ONLY)
1364   if(WIN32)
1365     set(BASH bash)
1366   endif()
1367   if(WITH_JAVA)
1368     configure_file(tjbenchtest.java.in tjbenchtest.java @ONLY)
1369     configure_file(tjexampletest.java.in tjexampletest.java @ONLY)
1370     add_custom_target(tjtest
1371       COMMAND echo tjbenchtest
1372       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest
1373       COMMAND echo tjbenchtest -alloc
1374       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -alloc
1375       COMMAND echo tjbenchtest -yuv
1376       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv
1377       COMMAND echo tjbenchtest -yuv -alloc
1378       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv -alloc
1379       COMMAND echo tjbenchtest -progressive
1380       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive
1381       COMMAND echo tjbenchtest -progressive -yuv
1382       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive -yuv
1383       COMMAND echo tjexampletest
1384       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest
1385       COMMAND echo tjbenchtest.java
1386       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java
1387       COMMAND echo tjbenchtest.java -yuv
1388       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java -yuv
1389       COMMAND echo tjbenchtest.java -progressive
1390       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java -progressive
1391       COMMAND echo tjexampletest.java -progressive -yuv
1392       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java
1393         -progressive -yuv
1394       COMMAND echo tjexampletest.java
1395       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest.java
1396       DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest
1397         ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java
1398         ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest)
1399   else()
1400     add_custom_target(tjtest
1401       COMMAND echo tjbenchtest
1402       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest
1403       COMMAND echo tjbenchtest -alloc
1404       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -alloc
1405       COMMAND echo tjbenchtest -yuv
1406       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv
1407       COMMAND echo tjbenchtest -yuv -alloc
1408       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv -alloc
1409       COMMAND echo tjbenchtest -progressive
1410       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive
1411       COMMAND echo tjbenchtest -progressive -yuv
1412       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive -yuv
1413       COMMAND echo tjexampletest
1414       COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest
1415       DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest)
1416   endif()
1417 endif()
1418
1419
1420 ###############################################################################
1421 # INSTALLATION
1422 ###############################################################################
1423
1424 set(EXE ${CMAKE_EXECUTABLE_SUFFIX})
1425
1426 if(WITH_TURBOJPEG)
1427   if(ENABLE_SHARED)
1428     install(TARGETS turbojpeg tjbench
1429       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1430       LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1431       RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1432     if(NOT CMAKE_VERSION VERSION_LESS "3.1" AND MSVC AND
1433       CMAKE_C_LINKER_SUPPORTS_PDB)
1434       install(FILES "$<TARGET_PDB_FILE:turbojpeg>"
1435         DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL)
1436     endif()
1437   endif()
1438   if(ENABLE_STATIC)
1439     install(TARGETS turbojpeg-static ARCHIVE
1440       DESTINATION ${CMAKE_INSTALL_LIBDIR})
1441     if(NOT ENABLE_SHARED)
1442       if(MSVC_IDE OR XCODE)
1443         set(DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
1444       else()
1445         set(DIR ${CMAKE_CURRENT_BINARY_DIR})
1446       endif()
1447       install(PROGRAMS ${DIR}/tjbench-static${EXE}
1448         DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME tjbench${EXE})
1449     endif()
1450   endif()
1451   install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg.h
1452     DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1453 endif()
1454
1455 if(ENABLE_STATIC)
1456   install(TARGETS jpeg-static ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
1457   if(NOT ENABLE_SHARED)
1458     if(MSVC_IDE OR XCODE)
1459       set(DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
1460     else()
1461       set(DIR ${CMAKE_CURRENT_BINARY_DIR})
1462     endif()
1463     install(PROGRAMS ${DIR}/cjpeg-static${EXE}
1464       DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME cjpeg${EXE})
1465     install(PROGRAMS ${DIR}/djpeg-static${EXE}
1466       DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME djpeg${EXE})
1467     install(PROGRAMS ${DIR}/jpegtran-static${EXE}
1468       DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME jpegtran${EXE})
1469   endif()
1470 endif()
1471
1472 install(TARGETS rdjpgcom wrjpgcom RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1473
1474 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/README.ijg
1475   ${CMAKE_CURRENT_SOURCE_DIR}/README.md ${CMAKE_CURRENT_SOURCE_DIR}/example.txt
1476   ${CMAKE_CURRENT_SOURCE_DIR}/tjexample.c
1477   ${CMAKE_CURRENT_SOURCE_DIR}/libjpeg.txt
1478   ${CMAKE_CURRENT_SOURCE_DIR}/structure.txt
1479   ${CMAKE_CURRENT_SOURCE_DIR}/usage.txt ${CMAKE_CURRENT_SOURCE_DIR}/wizard.txt
1480   ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md DESTINATION ${CMAKE_INSTALL_DOCDIR})
1481 if(WITH_JAVA)
1482   install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/java/TJExample.java
1483     DESTINATION ${CMAKE_INSTALL_DOCDIR})
1484 endif()
1485
1486 if(UNIX OR MINGW)
1487   install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cjpeg.1
1488     ${CMAKE_CURRENT_SOURCE_DIR}/djpeg.1 ${CMAKE_CURRENT_SOURCE_DIR}/jpegtran.1
1489     ${CMAKE_CURRENT_SOURCE_DIR}/rdjpgcom.1
1490     ${CMAKE_CURRENT_SOURCE_DIR}/wrjpgcom.1
1491     DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
1492 endif()
1493 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/libjpeg.pc
1494   ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/libturbojpeg.pc
1495   DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
1496
1497 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/jconfig.h
1498   ${CMAKE_CURRENT_SOURCE_DIR}/jerror.h ${CMAKE_CURRENT_SOURCE_DIR}/jmorecfg.h
1499   ${CMAKE_CURRENT_SOURCE_DIR}/jpeglib.h
1500   DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1501
1502 include(cmakescripts/BuildPackages.cmake)
1503
1504 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmakescripts/cmake_uninstall.cmake.in"
1505   "cmake_uninstall.cmake" IMMEDIATE @ONLY)
1506
1507 add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P cmake_uninstall.cmake)