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