3 # Copyright (C) 2007,2009-2016 Glenn Randers-Pehrson
4 # Written by Christian Ehrlicher, 2007
5 # Revised by Roger Lowman, 2009-2010
6 # Revised by Clifford Yapp, 2011-2012
7 # Revised by Roger Leigh, 2016
8 # Revised by Andreas Franek, 2016
10 # This code is released under the libpng license.
11 # For conditions of distribution and use, see the disclaimer
12 # and license in png.h
14 cmake_minimum_required(VERSION 2.8.3)
15 cmake_policy(VERSION 2.8.3)
17 # Set MacOSX @rpath usage globally.
19 cmake_policy(SET CMP0020 NEW)
22 cmake_policy(SET CMP0042 NEW)
24 # Use new variable expansion policy.
26 cmake_policy(SET CMP0053 NEW)
29 cmake_policy(SET CMP0054 NEW)
32 set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
39 set(PNGLIB_RELEASE 28)
40 set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
41 set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
45 #Allow users to specify location of Zlib,
46 # Useful if zlib is being built alongside this as a sub-project
47 option(PNG_BUILD_ZLIB "Custom zlib Location, else find_package is used" OFF)
49 IF(NOT PNG_BUILD_ZLIB)
50 find_package(ZLIB REQUIRED)
51 include_directories(${ZLIB_INCLUDE_DIR})
52 ENDIF(NOT PNG_BUILD_ZLIB)
55 find_library(M_LIBRARY
57 PATHS /usr/lib /usr/local/lib
60 message(STATUS "math lib 'libm' not found; floating point support disabled")
63 # not needed on windows
67 # COMMAND LINE OPTIONS
68 option(PNG_SHARED "Build shared lib" ON)
69 option(PNG_STATIC "Build static lib" ON)
70 option(PNG_TESTS "Build libpng tests" ON)
72 # Many more configuration options could be added here
73 option(PNG_FRAMEWORK "Build OS X framework" OFF)
74 option(PNG_DEBUG "Build with debug output" OFF)
75 option(PNGARG "Disable ANSI-C prototypes" OFF)
77 set(PNG_PREFIX "" CACHE STRING "Prefix to add to the API function names")
78 set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings")
80 # set definitions and sources for arm
81 if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm" OR
82 ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^aarch64")
83 set(PNG_ARM_NEON_POSSIBLE_VALUES check on off)
84 set(PNG_ARM_NEON "check" CACHE STRING "Enable ARM NEON optimizations:
85 check: (default) use internal checking code;
86 off: disable the optimizations;
87 on: turn on unconditionally.")
88 set_property(CACHE PNG_ARM_NEON PROPERTY STRINGS
89 ${PNG_ARM_NEON_POSSIBLE_VALUES})
90 list(FIND PNG_ARM_NEON_POSSIBLE_VALUES ${PNG_ARM_NEON} index)
93 " PNG_ARM_NEON must be one of [${PNG_ARM_NEON_POSSIBLE_VALUES}]")
94 elseif(NOT ${PNG_ARM_NEON} STREQUAL "no")
95 set(libpng_arm_sources
98 arm/filter_neon_intrinsics.c)
100 if(${PNG_ARM_NEON} STREQUAL "on")
101 add_definitions(-DPNG_ARM_NEON_OPT=2)
102 elseif(${PNG_ARM_NEON} STREQUAL "check")
103 add_definitions(-DPNG_ARM_NEON_CHECK_SUPPORTED)
106 add_definitions(-DPNG_ARM_NEON_OPT=0)
111 set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
113 # to distinguish between debug and release lib
114 set(CMAKE_DEBUG_POSTFIX "d")
116 include(CheckCSourceCompiles)
117 option(ld-version-script "Enable linker version script" ON)
118 if(ld-version-script AND NOT APPLE)
119 # Check if LD supports linker scripts.
120 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" "VERS_1 {
130 set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
131 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/conftest.map'")
132 check_c_source_compiles("void sym(void) {}
134 int main(void) {return 0;}
135 " HAVE_LD_VERSION_SCRIPT)
136 if(NOT HAVE_LD_VERSION_SCRIPT)
137 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE} "-Wl,-M -Wl,${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
138 check_c_source_compiles("void sym(void) {}
140 int main(void) {return 0;}
141 " HAVE_SOLARIS_LD_VERSION_SCRIPT)
143 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
144 file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
147 # Find symbol prefix. Likely obsolete and unnecessary with recent
148 # toolchains (it's not done in many other projects).
149 function(symbol_prefix)
152 execute_process(COMMAND "${CMAKE_C_COMPILER}" "-E" "-"
155 RESULT_VARIABLE STATUS)
158 message(WARNING "Failed to run the C preprocessor")
161 string(REPLACE "\n" ";" OUT "${OUT}")
163 string(REGEX MATCH "^PREFIX=" found_match "${line}")
165 STRING(REGEX REPLACE "^PREFIX=(.*\)" "\\1" prefix "${line}")
166 string(REGEX MATCH "__USER_LABEL_PREFIX__" found_match "${prefix}")
168 STRING(REGEX REPLACE "(.*)__USER_LABEL_PREFIX__(.*)" "\\1\\2" prefix "${prefix}")
170 set(SYMBOL_PREFIX "${prefix}")
174 message(STATUS "Symbol prefix: ${SYMBOL_PREFIX}")
175 set(SYMBOL_PREFIX "${SYMBOL_PREFIX}" PARENT_SCOPE)
182 find_program(AWK NAMES gawk awk)
184 include_directories(${CMAKE_CURRENT_BINARY_DIR})
187 # No awk available to generate sources; use pre-built pnglibconf.h
188 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
189 ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
190 add_custom_target(genfiles) # Dummy
192 include(CMakeParseArguments)
193 # Generate .chk from .out with awk
194 # generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
195 function(generate_chk)
197 set(oneValueArgs INPUT OUTPUT)
198 set(multiValueArgs DEPENDS)
199 cmake_parse_arguments(_GC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
201 message(FATAL_ERROR "Invalid arguments. generate_out requires input.")
204 message(FATAL_ERROR "Invalid arguments. generate_out requires output.")
207 add_custom_command(OUTPUT "${_GC_OUTPUT}"
208 COMMAND "${CMAKE_COMMAND}"
209 "-DINPUT=${_GC_INPUT}"
210 "-DOUTPUT=${_GC_OUTPUT}"
211 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake"
212 DEPENDS "${_GC_INPUT}" ${_GC_DEPENDS}
213 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
216 # Generate .out from .c with awk
217 # generate_out(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
218 function(generate_out)
220 set(oneValueArgs INPUT OUTPUT)
221 set(multiValueArgs DEPENDS)
222 cmake_parse_arguments(_GO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
224 message(FATAL_ERROR "Invalid arguments. generate_out requires input.")
227 message(FATAL_ERROR "Invalid arguments. generate_out requires output.")
230 add_custom_command(OUTPUT "${_GO_OUTPUT}"
231 COMMAND "${CMAKE_COMMAND}"
232 "-DINPUT=${_GO_INPUT}"
233 "-DOUTPUT=${_GO_OUTPUT}"
234 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake"
235 DEPENDS "${_GO_INPUT}" ${_GO_DEPENDS}
236 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
239 # Generate specific source file with awk
240 # generate_source(OUTPUT outputfile [DEPENDS dep1 [dep2...]])
241 function(generate_source)
243 set(oneValueArgs OUTPUT)
244 set(multiValueArgs DEPENDS)
245 cmake_parse_arguments(_GSO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
247 message(FATAL_ERROR "Invalid arguments. generate_source requires output.")
250 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_GSO_OUTPUT}"
251 COMMAND "${CMAKE_COMMAND}"
252 "-DOUTPUT=${_GSO_OUTPUT}"
253 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
254 DEPENDS ${_GSO_DEPENDS}
255 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
259 function(generate_copy source destination)
260 add_custom_command(OUTPUT "${destination}"
261 COMMAND "${CMAKE_COMMAND}" -E remove "${destination}"
262 COMMAND "${CMAKE_COMMAND}" -E copy "${source}"
267 # Generate scripts/pnglibconf.h
268 generate_source(OUTPUT "scripts/pnglibconf.c"
269 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa"
270 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk"
271 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h")
273 # Generate pnglibconf.c
274 generate_source(OUTPUT "pnglibconf.c"
275 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa"
276 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk"
277 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h")
280 set(PNGLIBCONF_H_EXTRA_DEPENDS
281 "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
282 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/macro.lst")
283 set(PNGPREFIX_H_EXTRA_DEPENDS
284 "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out")
287 generate_out(INPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
288 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out")
290 # Generate pnglibconf.h
291 generate_source(OUTPUT "pnglibconf.h"
292 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out"
293 ${PNGLIBCONF_H_EXTRA_DEPENDS})
295 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/intprefix.c"
296 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out"
297 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
299 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/prefix.c"
300 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
301 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
302 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
303 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out")
305 # Generate pngprefix.h
306 generate_source(OUTPUT "pngprefix.h"
307 DEPENDS ${PNGPREFIX_H_EXTRA_DEPENDS})
309 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/sym.c"
310 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
311 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
313 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.c"
314 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
315 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
316 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
317 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt")
319 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/vers.c"
320 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
321 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
322 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
323 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
325 generate_chk(INPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
326 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"
327 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk"
328 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def")
330 add_custom_target(symbol-check DEPENDS
331 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk")
333 generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
334 "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
335 generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
336 "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
338 add_custom_target(genvers DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
339 add_custom_target(gensym DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
341 add_custom_target("genprebuilt"
342 COMMAND "${CMAKE_COMMAND}"
343 "-DOUTPUT=scripts/pnglibconf.h.prebuilt"
344 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
345 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
347 # A single target handles generation of all generated files. If
348 # they are dependend upon separately by multiple targets, this
349 # confuses parallel make (it would require a separate top-level
350 # target for each file to track the dependencies properly).
351 add_custom_target(genfiles DEPENDS
352 "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym"
353 "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers"
354 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
355 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
356 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out"
357 "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h"
358 "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out"
359 "${CMAKE_CURRENT_BINARY_DIR}/scripts/pnglibconf.c"
360 "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
361 "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
362 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"
363 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
364 "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out")
368 set(libpng_public_hdrs
371 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
373 set(libpng_private_hdrs
380 list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h")
383 ${libpng_public_hdrs}
384 ${libpng_private_hdrs}
400 ${libpng_arm_sources}
406 contrib/libtests/pngvalid.c
409 contrib/libtests/pngstest.c
411 set(pngunknown_sources
412 contrib/libtests/pngunknown.c
415 contrib/libtests/pngimage.c
418 contrib/tools/pngfix.c
420 set(png_fix_itxt_sources
421 contrib/tools/png-fix-itxt.c
425 add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
429 add_definitions(-DPNG_DEBUG)
432 # NOW BUILD OUR TARGET
433 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
435 unset(PNG_LIB_TARGETS)
438 add_library(png SHARED ${libpng_sources})
439 set(PNG_LIB_TARGETS png)
440 set_target_properties(png PROPERTIES OUTPUT_NAME ${PNG_LIB_NAME})
441 add_dependencies(png genfiles)
443 # msvc does not append 'lib' - do it here to have consistent name
444 set_target_properties(png PROPERTIES PREFIX "lib")
445 set_target_properties(png PROPERTIES IMPORT_PREFIX "lib")
447 target_link_libraries(png ${ZLIB_LIBRARY} ${M_LIBRARY})
450 if(HAVE_LD_VERSION_SCRIPT)
451 set_target_properties(png PROPERTIES LINK_FLAGS
452 "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
453 elseif(HAVE_SOLARIS_LD_VERSION_SCRIPT)
454 set_target_properties(png PROPERTIES LINK_FLAGS
455 "-Wl,-M -Wl,'${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
461 # does not work without changing name
462 set(PNG_LIB_NAME_STATIC png_static)
463 add_library(png_static STATIC ${libpng_sources})
464 add_dependencies(png_static genfiles)
465 # MSVC doesn't use a different file extension for shared vs. static
466 # libs. We are able to change OUTPUT_NAME to remove the _static
467 # for all other platforms.
469 set_target_properties(png_static PROPERTIES
470 OUTPUT_NAME "${PNG_LIB_NAME}"
471 CLEAN_DIRECT_OUTPUT 1)
473 set_target_properties(png_static PROPERTIES
474 OUTPUT_NAME "${PNG_LIB_NAME}_static"
475 CLEAN_DIRECT_OUTPUT 1)
477 list(APPEND PNG_LIB_TARGETS png_static)
479 # msvc does not append 'lib' - do it here to have consistent name
480 set_target_properties(png_static PROPERTIES PREFIX "lib")
482 target_link_libraries(png_static ${ZLIB_LIBRARY} ${M_LIBRARY})
486 set(PNG_LIB_NAME_FRAMEWORK png_framework)
487 add_library(png_framework SHARED ${libpng_sources})
488 add_dependencies(png_framework genfiles)
489 list(APPEND PNG_LIB_TARGETS png_framework)
490 set_target_properties(png_framework PROPERTIES
492 FRAMEWORK_VERSION ${PNGLIB_VERSION}
493 MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PNGLIB_MAJOR}.${PNGLIB_MINOR}
494 MACOSX_FRAMEWORK_BUNDLE_VERSION ${PNGLIB_VERSION}
495 MACOSX_FRAMEWORK_IDENTIFIER org.libpng.libpng
496 XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
497 PUBLIC_HEADER "${libpng_public_hdrs}"
499 target_link_libraries(png_framework ${ZLIB_LIBRARY} ${M_LIBRARY})
502 if(NOT PNG_LIB_TARGETS)
504 "No library variant selected to build. "
505 "Please enable at least one of the following options: "
506 " PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")
509 if(PNG_SHARED AND WIN32)
510 set_target_properties(png PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
513 function(png_add_test)
515 set(oneValueArgs NAME COMMAND)
516 set(multiValueArgs OPTIONS FILES)
517 cmake_parse_arguments(_PAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
520 message(FATAL_ERROR "Invalid arguments. png_add_test requires name.")
522 if (NOT _PAT_COMMAND)
523 message(FATAL_ERROR "Invalid arguments. png_add_test requires command.")
526 set(TEST_OPTIONS "${_PAT_OPTIONS}")
527 set(TEST_FILES "${_PAT_FILES}")
529 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in"
530 "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake" @ONLY)
531 if(CMAKE_MAJOR_VERSION GREATER 2) # have generator expressions
532 add_test(NAME "${_PAT_NAME}"
533 COMMAND "${CMAKE_COMMAND}"
534 "-DLIBPNG=$<TARGET_FILE:png>"
535 "-DTEST_COMMAND=$<TARGET_FILE:${_PAT_COMMAND}>"
536 -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")
537 else() # old 2.x add_test; limited and won't work well on Windows
538 # Note LIBPNG is a dummy value as there are no generator expressions
539 add_test("${_PAT_NAME}" "${CMAKE_COMMAND}"
540 "-DLIBPNG=${CMAKE_CURRENT_BINARY_DIR}/libpng.so"
541 "-DTEST_COMMAND=./${_PAT_COMMAND}"
542 -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")
546 if(PNG_TESTS AND PNG_SHARED)
547 # Find test PNG files by globbing, but sort lists to ensure
548 # consistency between different filesystems.
549 file(GLOB PNGSUITE_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/*.png")
550 list(SORT PNGSUITE_PNGS)
551 file(GLOB TEST_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/testpngs/*.png")
554 set(PNGTEST_PNG "${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png")
556 add_executable(pngtest ${pngtest_sources})
557 target_link_libraries(pngtest png)
559 png_add_test(NAME pngtest COMMAND pngtest FILES "${PNGTEST_PNG}")
561 add_executable(pngvalid ${pngvalid_sources})
562 target_link_libraries(pngvalid png)
564 png_add_test(NAME pngvalid-gamma-16-to-8
565 COMMAND pngvalid OPTIONS --gamma-16-to-8)
566 png_add_test(NAME pngvalid-gamma-alpha-mode
567 COMMAND pngvalid OPTIONS --gamma-alpha-mode)
568 png_add_test(NAME pngvalid-gamma-background
569 COMMAND pngvalid OPTIONS --gamma-background)
570 png_add_test(NAME pngvalid-gamma-expand16-alpha-mode
571 COMMAND pngvalid OPTIONS --gamma-alpha-mode --expand16)
572 png_add_test(NAME pngvalid-gamma-expand16-background
573 COMMAND pngvalid OPTIONS --gamma-background --expand16)
574 png_add_test(NAME pngvalid-gamma-expand16-transform
575 COMMAND pngvalid OPTIONS --gamma-transform --expand16)
576 png_add_test(NAME pngvalid-gamma-sbit
577 COMMAND pngvalid OPTIONS --gamma-sbit)
578 png_add_test(NAME pngvalid-gamma-threshold
579 COMMAND pngvalid OPTIONS --gamma-threshold)
580 png_add_test(NAME pngvalid-gamma-transform
581 COMMAND pngvalid OPTIONS --gamma-transform)
582 png_add_test(NAME pngvalid-progressive-interlace-standard
583 COMMAND pngvalid OPTIONS --standard --progressive-read --interlace)
584 png_add_test(NAME pngvalid-progressive-size
585 COMMAND pngvalid OPTIONS --size --progressive-read)
586 png_add_test(NAME pngvalid-progressive-standard
587 COMMAND pngvalid OPTIONS --standard --progressive-read)
588 png_add_test(NAME pngvalid-standard
589 COMMAND pngvalid OPTIONS --standard)
590 png_add_test(NAME pngvalid-transform
591 COMMAND pngvalid OPTIONS --transform)
593 add_executable(pngstest ${pngstest_sources})
594 target_link_libraries(pngstest png)
596 foreach(gamma_type 1.8 linear none sRGB)
597 foreach(alpha_type none alpha)
599 foreach(test_png ${TEST_PNGS})
600 string(REGEX MATCH ".*-linear[-.].*" TEST_PNG_LINEAR "${test_png}")
601 string(REGEX MATCH ".*-sRGB[-.].*" TEST_PNG_SRGB "${test_png}")
602 string(REGEX MATCH ".*-1.8[-.].*" TEST_PNG_G18 "${test_png}")
603 string(REGEX MATCH ".*-alpha-.*" TEST_PNG_ALPHA "${test_png}")
605 set(TEST_PNG_VALID TRUE)
608 if (NOT "${alpha_type}" STREQUAL "alpha")
609 set(TEST_PNG_VALID FALSE)
612 if ("${alpha_type}" STREQUAL "alpha")
613 set(TEST_PNG_VALID FALSE)
618 if(NOT "${gamma_type}" STREQUAL "linear")
619 set(TEST_PNG_VALID FALSE)
621 elseif(TEST_PNG_SRGB)
622 if(NOT "${gamma_type}" STREQUAL "sRGB")
623 set(TEST_PNG_VALID FALSE)
626 if(NOT "${gamma_type}" STREQUAL "1.8")
627 set(TEST_PNG_VALID FALSE)
630 if(NOT "${gamma_type}" STREQUAL "none")
631 set(TEST_PNG_VALID FALSE)
636 list(APPEND PNGSTEST_FILES "${test_png}")
639 # Should already be sorted, but sort anyway to be certain.
640 list(SORT PNGSTEST_FILES)
641 png_add_test(NAME pngstest-${gamma_type}-${alpha_type}
643 OPTIONS --tmpfile "${gamma_type}-${alpha_type}-" --log
644 FILES ${PNGSTEST_FILES})
648 add_executable(pngunknown ${pngunknown_sources})
649 target_link_libraries(pngunknown png)
651 png_add_test(NAME pngunknown-discard COMMAND pngunknown OPTIONS --strict default=discard FILES "${PNGTEST_PNG}")
652 png_add_test(NAME pngunknown-IDAT COMMAND pngunknown OPTIONS --strict default=discard IDAT=save FILES "${PNGTEST_PNG}")
653 png_add_test(NAME pngunknown-if-safe COMMAND pngunknown OPTIONS --strict default=if-safe FILES "${PNGTEST_PNG}")
654 png_add_test(NAME pngunknown-sAPI COMMAND pngunknown OPTIONS --strict bKGD=save cHRM=save gAMA=save all=discard iCCP=save sBIT=save sRGB=save FILES "${PNGTEST_PNG}")
655 png_add_test(NAME pngunknown-save COMMAND pngunknown OPTIONS --strict default=save FILES "${PNGTEST_PNG}")
656 png_add_test(NAME pngunknown-sTER COMMAND pngunknown OPTIONS --strict sTER=if-safe FILES "${PNGTEST_PNG}")
657 png_add_test(NAME pngunknown-vpAg COMMAND pngunknown OPTIONS --strict vpAg=if-safe FILES "${PNGTEST_PNG}")
659 add_executable(pngimage ${pngimage_sources})
660 target_link_libraries(pngimage png)
662 png_add_test(NAME pngimage-quick COMMAND pngimage OPTIONS --list-combos --log FILES ${PNGSUITE_PNGS})
663 png_add_test(NAME pngimage-full COMMAND pngimage OPTIONS --exhaustive --list-combos --log FILES ${PNGSUITE_PNGS})
667 add_executable(pngfix ${pngfix_sources})
668 target_link_libraries(pngfix png)
669 set(PNG_BIN_TARGETS pngfix)
671 add_executable(png-fix-itxt ${png_fix_itxt_sources})
672 target_link_libraries(png-fix-itxt ${ZLIB_LIBRARY} ${M_LIBRARY})
673 list(APPEND PNG_BIN_TARGETS png-fix-itxt)
676 # Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
677 IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
678 SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
679 ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
681 # Set a variable with CMake code which:
682 # Creates a symlink from src to dest (if possible) or alternatively
683 # copies if different.
684 macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
685 FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
686 if(WIN32 AND NOT CYGWIN AND NOT MSYS)
688 OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
689 COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
690 COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
691 DEPENDS ${PNG_LIB_TARGETS}
693 ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
694 else(WIN32 AND NOT CYGWIN AND NOT MSYS)
695 get_filename_component(LINK_TARGET "${SRC_FILE}" NAME)
696 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
697 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
698 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
699 endif(WIN32 AND NOT CYGWIN AND NOT MSYS)
702 # Create source generation scripts.
703 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in
704 ${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake @ONLY)
705 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in
706 ${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake @ONLY)
707 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in
708 ${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake @ONLY)
711 # libpng is a library so default to 'lib'
712 if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
713 set(CMAKE_INSTALL_LIBDIR lib)
714 endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
716 # CREATE PKGCONFIG FILES
717 # we use the same files like ./configure, so we have to set its vars
718 # Only do this on Windows for Cygwin - the files don't make much sense outside
720 if(NOT WIN32 OR CYGWIN OR MINGW)
721 set(prefix ${CMAKE_INSTALL_PREFIX})
722 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
723 set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
724 set(includedir ${CMAKE_INSTALL_PREFIX}/include)
726 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
727 ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
728 CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
730 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
731 ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
732 CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
733 endif(NOT WIN32 OR CYGWIN OR MINGW)
737 set_target_properties(png PROPERTIES
738 # VERSION 16.${PNGLIB_RELEASE}.1.6.28
739 VERSION 16.${PNGLIB_RELEASE}.0
741 CLEAN_DIRECT_OUTPUT 1)
744 # If CMake > 2.4.x, we set a variable used below to export
745 # targets to an export file.
746 # TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
747 if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)
748 set(PNG_EXPORT_RULE EXPORT libpng)
749 elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof
750 set(PNG_EXPORT_RULE EXPORT libpng)
754 if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
755 install(TARGETS ${PNG_LIB_TARGETS}
757 RUNTIME DESTINATION bin
758 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
759 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
760 FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})
763 # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
765 get_target_property(BUILD_TARGET_LOCATION png LOCATION_${CMAKE_BUILD_TYPE})
766 CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
767 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
768 DESTINATION ${CMAKE_INSTALL_LIBDIR})
769 endif(CYGWIN OR MINGW)
772 get_target_property(BUILD_TARGET_LOCATION png LOCATION_${CMAKE_BUILD_TYPE})
773 CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
774 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
775 DESTINATION ${CMAKE_INSTALL_LIBDIR})
780 if(NOT WIN32 OR CYGWIN OR MINGW)
781 get_target_property(BUILD_TARGET_LOCATION png_static LOCATION_${CMAKE_BUILD_TYPE})
782 CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
783 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
784 DESTINATION ${CMAKE_INSTALL_LIBDIR})
785 endif(NOT WIN32 OR CYGWIN OR MINGW)
789 if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
790 install(FILES ${libpng_public_hdrs} DESTINATION include)
791 install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME})
793 if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
794 if(NOT WIN32 OR CYGWIN OR MINGW)
795 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
796 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
798 endif(NOT WIN32 OR CYGWIN OR MINGW)
801 if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL )
802 install(TARGETS ${PNG_BIN_TARGETS}
803 RUNTIME DESTINATION bin)
806 if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
809 set(PNG_MAN_DIR "share/man")
811 install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)
812 install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)
813 # Install pkg-config files
814 if(NOT WIN32 OR CYGWIN OR MINGW)
815 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
816 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
817 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
819 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
820 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
821 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
823 endif(NOT WIN32 OR CYGWIN OR MINGW)
826 # On versions of CMake that support it, create an export file CMake
827 # users can include() to import our targets
828 if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
829 install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
832 # what's with libpng-manual.txt and all the extra files?
840 # to create msvc import lib for mingw compiled shared lib
841 # pexports libpng.dll > libpng.def
842 # lib /def:libpng.def /machine:x86