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