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