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