3 # Copyright (C) 2018 Cosmin Truta
\r
4 # Copyright (C) 2007,2009-2018 Glenn Randers-Pehrson
\r
5 # Written by Christian Ehrlicher, 2007
\r
6 # Revised by Roger Lowman, 2009-2010
\r
7 # Revised by Clifford Yapp, 2011-2012,2017
\r
8 # Revised by Roger Leigh, 2016
\r
9 # Revised by Andreas Franek, 2016
\r
10 # Revised by Sam Serrels, 2017
\r
11 # Revised by Vadim Barkov, 2017
\r
12 # Revised by Vicky Pfau, 2018
\r
13 # Revised by Cameron Cawley, 2018
\r
14 # Revised by Cosmin Truta, 2018
\r
15 # Revised by Kyle Bentley, 2018
\r
17 # This code is released under the libpng license.
\r
18 # For conditions of distribution and use, see the disclaimer
\r
19 # and license in png.h
\r
21 cmake_minimum_required(VERSION 3.1)
\r
22 cmake_policy(VERSION 3.1)
\r
24 project(libpng C ASM)
\r
29 set(PNGLIB_RELEASE 37)
\r
30 set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
\r
31 set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
\r
33 include(GNUInstallDirs)
\r
37 # Allow users to specify location of Zlib.
\r
38 # Useful if zlib is being built alongside this as a sub-project.
\r
39 option(PNG_BUILD_ZLIB "Custom zlib Location, else find_package is used" OFF)
\r
41 if(NOT PNG_BUILD_ZLIB)
\r
42 find_package(ZLIB REQUIRED)
\r
43 include_directories(${ZLIB_INCLUDE_DIR})
\r
46 if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU)
\r
47 find_library(M_LIBRARY m)
\r
49 # libm is not needed and/or not available
\r
53 # COMMAND LINE OPTIONS
\r
54 option(PNG_SHARED "Build shared lib" ON)
\r
55 option(PNG_STATIC "Build static lib" ON)
\r
56 option(PNG_TESTS "Build libpng tests" ON)
\r
58 # Many more configuration options could be added here
\r
59 option(PNG_FRAMEWORK "Build OS X framework" OFF)
\r
60 option(PNG_DEBUG "Build with debug output" OFF)
\r
61 option(PNG_HARDWARE_OPTIMIZATIONS "Enable hardware optimizations" ON)
\r
63 set(PNG_PREFIX "" CACHE STRING "Prefix to add to the API function names")
\r
64 set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings")
\r
66 if(PNG_HARDWARE_OPTIMIZATIONS)
\r
68 # set definitions and sources for arm
\r
69 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR
\r
70 CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
\r
71 set(PNG_ARM_NEON_POSSIBLE_VALUES check on off)
\r
72 set(PNG_ARM_NEON "check" CACHE STRING "Enable ARM NEON optimizations:
\r
73 check: (default) use internal checking code;
\r
74 off: disable the optimizations;
\r
75 on: turn on unconditionally.")
\r
76 set_property(CACHE PNG_ARM_NEON PROPERTY STRINGS
\r
77 ${PNG_ARM_NEON_POSSIBLE_VALUES})
\r
78 list(FIND PNG_ARM_NEON_POSSIBLE_VALUES ${PNG_ARM_NEON} index)
\r
81 "PNG_ARM_NEON must be one of [${PNG_ARM_NEON_POSSIBLE_VALUES}]")
\r
82 elseif(NOT ${PNG_ARM_NEON} STREQUAL "off")
\r
83 set(libpng_arm_sources
\r
86 arm/filter_neon_intrinsics.c
\r
87 arm/palette_neon_intrinsics.c)
\r
89 if(${PNG_ARM_NEON} STREQUAL "on")
\r
90 add_definitions(-DPNG_ARM_NEON_OPT=2)
\r
91 elseif(${PNG_ARM_NEON} STREQUAL "check")
\r
92 add_definitions(-DPNG_ARM_NEON_CHECK_SUPPORTED)
\r
95 add_definitions(-DPNG_ARM_NEON_OPT=0)
\r
99 # set definitions and sources for powerpc
\r
100 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR
\r
101 CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*")
\r
102 set(PNG_POWERPC_VSX_POSSIBLE_VALUES on off)
\r
103 set(PNG_POWERPC_VSX "on" CACHE STRING "Enable POWERPC VSX optimizations:
\r
104 off: disable the optimizations.")
\r
105 set_property(CACHE PNG_POWERPC_VSX PROPERTY STRINGS
\r
106 ${PNG_POWERPC_VSX_POSSIBLE_VALUES})
\r
107 list(FIND PNG_POWERPC_VSX_POSSIBLE_VALUES ${PNG_POWERPC_VSX} index)
\r
109 message(FATAL_ERROR
\r
110 "PNG_POWERPC_VSX must be one of [${PNG_POWERPC_VSX_POSSIBLE_VALUES}]")
\r
111 elseif(NOT ${PNG_POWERPC_VSX} STREQUAL "off")
\r
112 set(libpng_powerpc_sources
\r
113 powerpc/powerpc_init.c
\r
114 powerpc/filter_vsx_intrinsics.c)
\r
115 if(${PNG_POWERPC_VSX} STREQUAL "on")
\r
116 add_definitions(-DPNG_POWERPC_VSX_OPT=2)
\r
119 add_definitions(-DPNG_POWERPC_VSX_OPT=0)
\r
123 # set definitions and sources for intel
\r
124 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR
\r
125 CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*")
\r
126 set(PNG_INTEL_SSE_POSSIBLE_VALUES on off)
\r
127 set(PNG_INTEL_SSE "on" CACHE STRING "Enable INTEL_SSE optimizations:
\r
128 off: disable the optimizations")
\r
129 set_property(CACHE PNG_INTEL_SSE PROPERTY STRINGS
\r
130 ${PNG_INTEL_SSE_POSSIBLE_VALUES})
\r
131 list(FIND PNG_INTEL_SSE_POSSIBLE_VALUES ${PNG_INTEL_SSE} index)
\r
133 message(FATAL_ERROR
\r
134 "PNG_INTEL_SSE must be one of [${PNG_INTEL_SSE_POSSIBLE_VALUES}]")
\r
135 elseif(NOT ${PNG_INTEL_SSE} STREQUAL "off")
\r
136 set(libpng_intel_sources
\r
138 intel/filter_sse2_intrinsics.c)
\r
139 if(${PNG_INTEL_SSE} STREQUAL "on")
\r
140 add_definitions(-DPNG_INTEL_SSE_OPT=1)
\r
143 add_definitions(-DPNG_INTEL_SSE_OPT=0)
\r
147 # set definitions and sources for MIPS
\r
148 if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR
\r
149 CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*")
\r
150 set(PNG_MIPS_MSA_POSSIBLE_VALUES on off)
\r
151 set(PNG_MIPS_MSA "on" CACHE STRING "Enable MIPS_MSA optimizations:
\r
152 off: disable the optimizations")
\r
153 set_property(CACHE PNG_MIPS_MSA PROPERTY STRINGS
\r
154 ${PNG_MIPS_MSA_POSSIBLE_VALUES})
\r
155 list(FIND PNG_MIPS_MSA_POSSIBLE_VALUES ${PNG_MIPS_MSA} index)
\r
157 message(FATAL_ERROR
\r
158 "PNG_MIPS_MSA must be one of [${PNG_MIPS_MSA_POSSIBLE_VALUES}]")
\r
159 elseif(NOT ${PNG_MIPS_MSA} STREQUAL "off")
\r
160 set(libpng_mips_sources
\r
162 mips/filter_msa_intrinsics.c)
\r
163 if(${PNG_MIPS_MSA} STREQUAL "on")
\r
164 add_definitions(-DPNG_MIPS_MSA_OPT=2)
\r
167 add_definitions(-DPNG_MIPS_MSA_OPT=0)
\r
171 else(PNG_HARDWARE_OPTIMIZATIONS)
\r
173 # set definitions and sources for arm
\r
174 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR
\r
175 CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
\r
176 add_definitions(-DPNG_ARM_NEON_OPT=0)
\r
179 # set definitions and sources for powerpc
\r
180 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR
\r
181 CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*")
\r
182 add_definitions(-DPNG_POWERPC_VSX_OPT=0)
\r
185 # set definitions and sources for intel
\r
186 if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR
\r
187 CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*")
\r
188 add_definitions(-DPNG_INTEL_SSE_OPT=0)
\r
191 # set definitions and sources for MIPS
\r
192 if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR
\r
193 CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*")
\r
194 add_definitions(-DPNG_MIPS_MSA_OPT=0)
\r
197 endif(PNG_HARDWARE_OPTIMIZATIONS)
\r
200 set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
\r
202 # to distinguish between debug and release lib
\r
203 set(CMAKE_DEBUG_POSTFIX "d")
\r
205 include(CheckCSourceCompiles)
\r
206 option(ld-version-script "Enable linker version script" ON)
\r
207 if(ld-version-script AND NOT APPLE)
\r
208 # Check if LD supports linker scripts.
\r
209 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" "VERS_1 {
\r
219 set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
\r
220 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/conftest.map'")
\r
221 check_c_source_compiles("void sym(void) {}
\r
223 int main(void) {return 0;}
\r
224 " HAVE_LD_VERSION_SCRIPT)
\r
225 if(NOT HAVE_LD_VERSION_SCRIPT)
\r
226 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE} "-Wl,-M -Wl,${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
\r
227 check_c_source_compiles("void sym(void) {}
\r
229 int main(void) {return 0;}
\r
230 " HAVE_SOLARIS_LD_VERSION_SCRIPT)
\r
232 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
\r
233 file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
\r
236 # Find symbol prefix. Likely obsolete and unnecessary with recent
\r
237 # toolchains (it's not done in many other projects).
\r
238 function(symbol_prefix)
\r
241 execute_process(COMMAND "${CMAKE_C_COMPILER}" "-E" "-"
\r
242 INPUT_FILE /dev/null
\r
243 OUTPUT_VARIABLE OUT
\r
244 RESULT_VARIABLE STATUS)
\r
247 message(WARNING "Failed to run the C preprocessor")
\r
250 string(REPLACE "\n" ";" OUT "${OUT}")
\r
251 foreach(line ${OUT})
\r
252 string(REGEX MATCH "^PREFIX=" found_match "${line}")
\r
254 string(REGEX REPLACE "^PREFIX=(.*\)" "\\1" prefix "${line}")
\r
255 string(REGEX MATCH "__USER_LABEL_PREFIX__" found_match "${prefix}")
\r
257 string(REGEX REPLACE "(.*)__USER_LABEL_PREFIX__(.*)" "\\1\\2" prefix "${prefix}")
\r
259 set(SYMBOL_PREFIX "${prefix}")
\r
263 message(STATUS "Symbol prefix: ${SYMBOL_PREFIX}")
\r
264 set(SYMBOL_PREFIX "${SYMBOL_PREFIX}" PARENT_SCOPE)
\r
271 find_program(AWK NAMES gawk awk)
\r
273 include_directories(${CMAKE_CURRENT_BINARY_DIR})
\r
275 if(NOT AWK OR ANDROID)
\r
276 # No awk available to generate sources; use pre-built pnglibconf.h
\r
277 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
\r
278 ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
\r
279 add_custom_target(genfiles) # Dummy
\r
281 include(CMakeParseArguments)
\r
282 # Generate .chk from .out with awk
\r
283 # generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
\r
284 function(generate_chk)
\r
286 set(oneValueArgs INPUT OUTPUT)
\r
287 set(multiValueArgs DEPENDS)
\r
288 cmake_parse_arguments(_GC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
\r
290 message(FATAL_ERROR "generate_chk: Missing INPUT argument")
\r
293 message(FATAL_ERROR "generate_chk: Missing OUTPUT argument")
\r
296 add_custom_command(OUTPUT "${_GC_OUTPUT}"
\r
297 COMMAND "${CMAKE_COMMAND}"
\r
298 "-DINPUT=${_GC_INPUT}"
\r
299 "-DOUTPUT=${_GC_OUTPUT}"
\r
300 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake"
\r
301 DEPENDS "${_GC_INPUT}" ${_GC_DEPENDS}
\r
302 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
\r
305 # Generate .out from .c with awk
\r
306 # generate_out(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
\r
307 function(generate_out)
\r
309 set(oneValueArgs INPUT OUTPUT)
\r
310 set(multiValueArgs DEPENDS)
\r
311 cmake_parse_arguments(_GO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
\r
313 message(FATAL_ERROR "generate_out: Missing INPUT argument")
\r
316 message(FATAL_ERROR "generate_out: Missing OUTPUT argument")
\r
319 add_custom_command(OUTPUT "${_GO_OUTPUT}"
\r
320 COMMAND "${CMAKE_COMMAND}"
\r
321 "-DINPUT=${_GO_INPUT}"
\r
322 "-DOUTPUT=${_GO_OUTPUT}"
\r
323 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake"
\r
324 DEPENDS "${_GO_INPUT}" ${_GO_DEPENDS}
\r
325 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
\r
328 # Generate specific source file with awk
\r
329 # generate_source(OUTPUT outputfile [DEPENDS dep1 [dep2...]])
\r
330 function(generate_source)
\r
332 set(oneValueArgs OUTPUT)
\r
333 set(multiValueArgs DEPENDS)
\r
334 cmake_parse_arguments(_GSO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
\r
335 if(NOT _GSO_OUTPUT)
\r
336 message(FATAL_ERROR "generate_source: Missing OUTPUT argument")
\r
339 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_GSO_OUTPUT}"
\r
340 COMMAND "${CMAKE_COMMAND}"
\r
341 "-DOUTPUT=${_GSO_OUTPUT}"
\r
342 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
\r
343 DEPENDS ${_GSO_DEPENDS}
\r
344 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
\r
348 function(generate_copy source destination)
\r
349 add_custom_command(OUTPUT "${destination}"
\r
350 COMMAND "${CMAKE_COMMAND}" -E remove "${destination}"
\r
351 COMMAND "${CMAKE_COMMAND}" -E copy "${source}"
\r
353 DEPENDS "${source}")
\r
356 # Generate scripts/pnglibconf.h
\r
357 generate_source(OUTPUT "scripts/pnglibconf.c"
\r
358 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa"
\r
359 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk"
\r
360 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h")
\r
362 # Generate pnglibconf.c
\r
363 generate_source(OUTPUT "pnglibconf.c"
\r
364 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa"
\r
365 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk"
\r
366 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h")
\r
369 set(PNGLIBCONF_H_EXTRA_DEPENDS
\r
370 "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
\r
371 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/macro.lst")
\r
372 set(PNGPREFIX_H_EXTRA_DEPENDS
\r
373 "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out")
\r
376 generate_out(INPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
\r
377 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out")
\r
379 # Generate pnglibconf.h
\r
380 generate_source(OUTPUT "pnglibconf.h"
\r
381 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out"
\r
382 ${PNGLIBCONF_H_EXTRA_DEPENDS})
\r
384 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/intprefix.c"
\r
385 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out"
\r
386 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
\r
388 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/prefix.c"
\r
389 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
\r
390 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
\r
391 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
\r
392 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out")
\r
394 # Generate pngprefix.h
\r
395 generate_source(OUTPUT "pngprefix.h"
\r
396 DEPENDS ${PNGPREFIX_H_EXTRA_DEPENDS})
\r
398 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/sym.c"
\r
399 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
\r
400 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
\r
402 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.c"
\r
403 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
\r
404 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
\r
405 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
\r
406 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt")
\r
408 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/vers.c"
\r
409 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
\r
410 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
\r
411 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
\r
412 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
\r
414 generate_chk(INPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
\r
415 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"
\r
416 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk"
\r
417 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def")
\r
419 add_custom_target(symbol-check DEPENDS
\r
420 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk")
\r
422 generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
\r
423 "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
\r
424 generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
\r
425 "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
\r
427 add_custom_target(genvers DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
\r
428 add_custom_target(gensym DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
\r
430 add_custom_target("genprebuilt"
\r
431 COMMAND "${CMAKE_COMMAND}"
\r
432 "-DOUTPUT=scripts/pnglibconf.h.prebuilt"
\r
433 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
\r
434 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
\r
436 # A single target handles generation of all generated files. If
\r
437 # they are depended upon separately by multiple targets, this
\r
438 # confuses parallel make (it would require a separate top-level
\r
439 # target for each file to track the dependencies properly).
\r
440 add_custom_target(genfiles DEPENDS
\r
441 "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym"
\r
442 "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers"
\r
443 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
\r
444 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
\r
445 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out"
\r
446 "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h"
\r
447 "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out"
\r
448 "${CMAKE_CURRENT_BINARY_DIR}/scripts/pnglibconf.c"
\r
449 "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
\r
450 "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
\r
451 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"
\r
452 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
\r
453 "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out")
\r
454 endif(NOT AWK OR ANDROID)
\r
457 set(libpng_public_hdrs
\r
460 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
\r
462 set(libpng_private_hdrs
\r
468 if(AWK AND NOT ANDROID)
\r
469 list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h")
\r
472 ${libpng_public_hdrs}
\r
473 ${libpng_private_hdrs}
\r
489 ${libpng_arm_sources}
\r
490 ${libpng_intel_sources}
\r
491 ${libpng_mips_sources}
\r
492 ${libpng_powerpc_sources}
\r
494 set(pngtest_sources
\r
497 set(pngvalid_sources
\r
498 contrib/libtests/pngvalid.c
\r
500 set(pngstest_sources
\r
501 contrib/libtests/pngstest.c
\r
503 set(pngunknown_sources
\r
504 contrib/libtests/pngunknown.c
\r
506 set(pngimage_sources
\r
507 contrib/libtests/pngimage.c
\r
510 contrib/tools/pngfix.c
\r
512 set(png_fix_itxt_sources
\r
513 contrib/tools/png-fix-itxt.c
\r
517 add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
\r
521 add_definitions(-DPNG_DEBUG)
\r
524 # NOW BUILD OUR TARGET
\r
525 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
\r
527 unset(PNG_LIB_TARGETS)
\r
530 add_library(png SHARED ${libpng_sources})
\r
531 set(PNG_LIB_TARGETS png)
\r
532 set_target_properties(png PROPERTIES OUTPUT_NAME ${PNG_LIB_NAME})
\r
533 add_dependencies(png genfiles)
\r
535 # msvc does not append 'lib' - do it here to have consistent name
\r
536 set_target_properties(png PROPERTIES PREFIX "lib")
\r
537 set_target_properties(png PROPERTIES IMPORT_PREFIX "lib")
\r
539 target_link_libraries(png ${ZLIB_LIBRARY} ${M_LIBRARY})
\r
542 if(HAVE_LD_VERSION_SCRIPT)
\r
543 set_target_properties(png PROPERTIES LINK_FLAGS
\r
544 "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
\r
545 elseif(HAVE_SOLARIS_LD_VERSION_SCRIPT)
\r
546 set_target_properties(png PROPERTIES LINK_FLAGS
\r
547 "-Wl,-M -Wl,'${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
\r
553 # does not work without changing name
\r
554 set(PNG_LIB_NAME_STATIC png_static)
\r
555 add_library(png_static STATIC ${libpng_sources})
\r
556 add_dependencies(png_static genfiles)
\r
557 # MSVC doesn't use a different file extension for shared vs. static
\r
558 # libs. We are able to change OUTPUT_NAME to remove the _static
\r
559 # for all other platforms.
\r
561 set_target_properties(png_static PROPERTIES
\r
562 OUTPUT_NAME "${PNG_LIB_NAME}"
\r
563 CLEAN_DIRECT_OUTPUT 1)
\r
565 set_target_properties(png_static PROPERTIES
\r
566 OUTPUT_NAME "${PNG_LIB_NAME}_static"
\r
567 CLEAN_DIRECT_OUTPUT 1)
\r
569 list(APPEND PNG_LIB_TARGETS png_static)
\r
571 # msvc does not append 'lib' - do it here to have consistent name
\r
572 set_target_properties(png_static PROPERTIES PREFIX "lib")
\r
574 target_link_libraries(png_static ${ZLIB_LIBRARY} ${M_LIBRARY})
\r
578 set(PNG_LIB_NAME_FRAMEWORK png_framework)
\r
579 add_library(png_framework SHARED ${libpng_sources})
\r
580 add_dependencies(png_framework genfiles)
\r
581 list(APPEND PNG_LIB_TARGETS png_framework)
\r
582 set_target_properties(png_framework PROPERTIES
\r
584 FRAMEWORK_VERSION ${PNGLIB_VERSION}
\r
585 MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PNGLIB_MAJOR}.${PNGLIB_MINOR}
\r
586 MACOSX_FRAMEWORK_BUNDLE_VERSION ${PNGLIB_VERSION}
\r
587 MACOSX_FRAMEWORK_IDENTIFIER org.libpng.libpng
\r
588 XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
\r
589 PUBLIC_HEADER "${libpng_public_hdrs}"
\r
591 target_link_libraries(png_framework ${ZLIB_LIBRARY} ${M_LIBRARY})
\r
594 if(NOT PNG_LIB_TARGETS)
\r
596 "No library variant selected to build. "
\r
597 "Please enable at least one of the following options: "
\r
598 "PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")
\r
601 if(PNG_SHARED AND WIN32)
\r
602 set_target_properties(png PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
\r
605 function(png_add_test)
\r
607 set(oneValueArgs NAME COMMAND)
\r
608 set(multiValueArgs OPTIONS FILES)
\r
609 cmake_parse_arguments(_PAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
\r
612 message(FATAL_ERROR "png_add_test: Missing NAME argument")
\r
614 if(NOT _PAT_COMMAND)
\r
615 message(FATAL_ERROR "png_add_test: Missing COMMAND argument")
\r
618 set(TEST_OPTIONS "${_PAT_OPTIONS}")
\r
619 set(TEST_FILES "${_PAT_FILES}")
\r
621 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in"
\r
622 "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake" @ONLY)
\r
623 add_test(NAME "${_PAT_NAME}"
\r
624 COMMAND "${CMAKE_COMMAND}"
\r
625 "-DLIBPNG=$<TARGET_FILE:png>"
\r
626 "-DTEST_COMMAND=$<TARGET_FILE:${_PAT_COMMAND}>"
\r
627 -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")
\r
630 if(PNG_TESTS AND PNG_SHARED)
\r
631 # Find test PNG files by globbing, but sort lists to ensure
\r
632 # consistency between different filesystems.
\r
633 file(GLOB PNGSUITE_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/*.png")
\r
634 list(SORT PNGSUITE_PNGS)
\r
635 file(GLOB TEST_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/testpngs/*.png")
\r
636 list(SORT TEST_PNGS)
\r
638 set(PNGTEST_PNG "${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png")
\r
640 add_executable(pngtest ${pngtest_sources})
\r
641 target_link_libraries(pngtest png)
\r
643 png_add_test(NAME pngtest COMMAND pngtest FILES "${PNGTEST_PNG}")
\r
645 add_executable(pngvalid ${pngvalid_sources})
\r
646 target_link_libraries(pngvalid png)
\r
648 png_add_test(NAME pngvalid-gamma-16-to-8
\r
649 COMMAND pngvalid OPTIONS --gamma-16-to-8)
\r
650 png_add_test(NAME pngvalid-gamma-alpha-mode
\r
651 COMMAND pngvalid OPTIONS --gamma-alpha-mode)
\r
652 png_add_test(NAME pngvalid-gamma-background
\r
653 COMMAND pngvalid OPTIONS --gamma-background)
\r
654 png_add_test(NAME pngvalid-gamma-expand16-alpha-mode
\r
655 COMMAND pngvalid OPTIONS --gamma-alpha-mode --expand16)
\r
656 png_add_test(NAME pngvalid-gamma-expand16-background
\r
657 COMMAND pngvalid OPTIONS --gamma-background --expand16)
\r
658 png_add_test(NAME pngvalid-gamma-expand16-transform
\r
659 COMMAND pngvalid OPTIONS --gamma-transform --expand16)
\r
660 png_add_test(NAME pngvalid-gamma-sbit
\r
661 COMMAND pngvalid OPTIONS --gamma-sbit)
\r
662 png_add_test(NAME pngvalid-gamma-threshold
\r
663 COMMAND pngvalid OPTIONS --gamma-threshold)
\r
664 png_add_test(NAME pngvalid-gamma-transform
\r
665 COMMAND pngvalid OPTIONS --gamma-transform)
\r
666 png_add_test(NAME pngvalid-progressive-interlace-standard
\r
667 COMMAND pngvalid OPTIONS --standard --progressive-read --interlace)
\r
668 png_add_test(NAME pngvalid-progressive-size
\r
669 COMMAND pngvalid OPTIONS --size --progressive-read)
\r
670 png_add_test(NAME pngvalid-progressive-standard
\r
671 COMMAND pngvalid OPTIONS --standard --progressive-read)
\r
672 png_add_test(NAME pngvalid-standard
\r
673 COMMAND pngvalid OPTIONS --standard)
\r
674 png_add_test(NAME pngvalid-transform
\r
675 COMMAND pngvalid OPTIONS --transform)
\r
677 add_executable(pngstest ${pngstest_sources})
\r
678 target_link_libraries(pngstest png)
\r
680 foreach(gamma_type 1.8 linear none sRGB)
\r
681 foreach(alpha_type none alpha)
\r
682 set(PNGSTEST_FILES)
\r
683 foreach(test_png ${TEST_PNGS})
\r
684 string(REGEX MATCH ".*-linear[-.].*" TEST_PNG_LINEAR "${test_png}")
\r
685 string(REGEX MATCH ".*-sRGB[-.].*" TEST_PNG_SRGB "${test_png}")
\r
686 string(REGEX MATCH ".*-1.8[-.].*" TEST_PNG_G18 "${test_png}")
\r
687 string(REGEX MATCH ".*-alpha-.*" TEST_PNG_ALPHA "${test_png}")
\r
689 set(TEST_PNG_VALID TRUE)
\r
692 if(NOT "${alpha_type}" STREQUAL "alpha")
\r
693 set(TEST_PNG_VALID FALSE)
\r
696 if("${alpha_type}" STREQUAL "alpha")
\r
697 set(TEST_PNG_VALID FALSE)
\r
701 if(TEST_PNG_LINEAR)
\r
702 if(NOT "${gamma_type}" STREQUAL "linear")
\r
703 set(TEST_PNG_VALID FALSE)
\r
705 elseif(TEST_PNG_SRGB)
\r
706 if(NOT "${gamma_type}" STREQUAL "sRGB")
\r
707 set(TEST_PNG_VALID FALSE)
\r
709 elseif(TEST_PNG_G18)
\r
710 if(NOT "${gamma_type}" STREQUAL "1.8")
\r
711 set(TEST_PNG_VALID FALSE)
\r
714 if(NOT "${gamma_type}" STREQUAL "none")
\r
715 set(TEST_PNG_VALID FALSE)
\r
720 list(APPEND PNGSTEST_FILES "${test_png}")
\r
723 # Should already be sorted, but sort anyway to be certain.
\r
724 list(SORT PNGSTEST_FILES)
\r
725 png_add_test(NAME pngstest-${gamma_type}-${alpha_type}
\r
727 OPTIONS --tmpfile "${gamma_type}-${alpha_type}-" --log
\r
728 FILES ${PNGSTEST_FILES})
\r
732 add_executable(pngunknown ${pngunknown_sources})
\r
733 target_link_libraries(pngunknown png)
\r
735 png_add_test(NAME pngunknown-discard COMMAND pngunknown OPTIONS --strict default=discard FILES "${PNGTEST_PNG}")
\r
736 png_add_test(NAME pngunknown-IDAT COMMAND pngunknown OPTIONS --strict default=discard IDAT=save FILES "${PNGTEST_PNG}")
\r
737 png_add_test(NAME pngunknown-if-safe COMMAND pngunknown OPTIONS --strict default=if-safe FILES "${PNGTEST_PNG}")
\r
738 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}")
\r
739 png_add_test(NAME pngunknown-save COMMAND pngunknown OPTIONS --strict default=save FILES "${PNGTEST_PNG}")
\r
740 png_add_test(NAME pngunknown-sTER COMMAND pngunknown OPTIONS --strict sTER=if-safe FILES "${PNGTEST_PNG}")
\r
741 png_add_test(NAME pngunknown-vpAg COMMAND pngunknown OPTIONS --strict vpAg=if-safe FILES "${PNGTEST_PNG}")
\r
743 add_executable(pngimage ${pngimage_sources})
\r
744 target_link_libraries(pngimage png)
\r
746 png_add_test(NAME pngimage-quick COMMAND pngimage OPTIONS --list-combos --log FILES ${PNGSUITE_PNGS})
\r
747 png_add_test(NAME pngimage-full COMMAND pngimage OPTIONS --exhaustive --list-combos --log FILES ${PNGSUITE_PNGS})
\r
751 add_executable(pngfix ${pngfix_sources})
\r
752 target_link_libraries(pngfix png)
\r
753 set(PNG_BIN_TARGETS pngfix)
\r
755 add_executable(png-fix-itxt ${png_fix_itxt_sources})
\r
756 target_link_libraries(png-fix-itxt ${ZLIB_LIBRARY} ${M_LIBRARY})
\r
757 list(APPEND PNG_BIN_TARGETS png-fix-itxt)
\r
760 # Set a variable with CMake code which:
\r
761 # Creates a symlink from src to dest (if possible) or alternatively
\r
762 # copies if different.
\r
763 include(CMakeParseArguments)
\r
765 function(create_symlink DEST_FILE)
\r
767 cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN})
\r
769 if(NOT S_TARGET AND NOT S_FILE)
\r
770 message(FATAL_ERROR "create_symlink: Missing TARGET or FILE argument")
\r
773 if(S_TARGET AND S_FILE)
\r
774 message(FATAL_ERROR "create_symlink: Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; can only have one.")
\r
778 # If we don't need to symlink something that's coming from a build target,
\r
779 # we can go ahead and symlink/copy at configure time.
\r
780 if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
\r
782 COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${S_FILE} ${DEST_FILE}
\r
783 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
\r
786 COMMAND ${CMAKE_COMMAND} -E create_symlink ${S_FILE} ${DEST_FILE}
\r
787 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
\r
792 # We need to use generator expressions, which can be a bit tricky, so for
\r
793 # simplicity make the symlink a POST_BUILD step and use the TARGET
\r
794 # signature of add_custom_command.
\r
795 if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
\r
796 add_custom_command(TARGET ${S_TARGET} POST_BUILD
\r
797 COMMAND "${CMAKE_COMMAND}" -E copy_if_different $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
\r
799 add_custom_command(TARGET ${S_TARGET} POST_BUILD
\r
800 COMMAND "${CMAKE_COMMAND}" -E create_symlink $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
\r
806 # Create source generation scripts.
\r
807 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in
\r
808 ${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake @ONLY)
\r
809 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in
\r
810 ${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake @ONLY)
\r
811 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in
\r
812 ${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake @ONLY)
\r
814 # libpng is a library so default to 'lib'
\r
815 if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
\r
816 set(CMAKE_INSTALL_LIBDIR lib)
\r
819 # CREATE PKGCONFIG FILES
\r
820 # We use the same files like ./configure, so we have to set its vars.
\r
821 # Only do this on Windows for Cygwin - the files don't make much sense outside
\r
822 # of a UNIX look-alike.
\r
823 if(NOT WIN32 OR CYGWIN OR MINGW)
\r
824 set(prefix ${CMAKE_INSTALL_PREFIX})
\r
825 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
\r
826 set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
\r
827 set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
\r
828 set(LIBS "-lz -lm")
\r
829 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
\r
830 ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
\r
831 create_symlink(libpng.pc FILE ${PNGLIB_NAME}.pc)
\r
833 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
\r
834 ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
\r
835 create_symlink(libpng-config FILE ${PNGLIB_NAME}-config)
\r
840 set_target_properties(png PROPERTIES
\r
841 # VERSION 16.${PNGLIB_RELEASE}.1.6.37
\r
842 VERSION 16.${PNGLIB_RELEASE}.0
\r
844 CLEAN_DIRECT_OUTPUT 1)
\r
848 if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
\r
849 install(TARGETS ${PNG_LIB_TARGETS}
\r
851 RUNTIME DESTINATION bin
\r
852 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
\r
853 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
\r
854 FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})
\r
857 # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
\r
858 if(CYGWIN OR MINGW)
\r
859 create_symlink(libpng${CMAKE_IMPORT_LIBRARY_SUFFIX} TARGET png)
\r
860 install(FILES $<TARGET_LINKER_FILE_DIR:png>/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
\r
861 DESTINATION ${CMAKE_INSTALL_LIBDIR})
\r
865 create_symlink(libpng${CMAKE_SHARED_LIBRARY_SUFFIX} TARGET png)
\r
866 install(FILES $<TARGET_LINKER_FILE_DIR:png>/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
\r
867 DESTINATION ${CMAKE_INSTALL_LIBDIR})
\r
872 if(NOT WIN32 OR CYGWIN OR MINGW)
\r
873 create_symlink(libpng${CMAKE_STATIC_LIBRARY_SUFFIX} TARGET png_static)
\r
874 install(FILES $<TARGET_LINKER_FILE_DIR:png_static>/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
\r
875 DESTINATION ${CMAKE_INSTALL_LIBDIR})
\r
880 if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
\r
881 install(FILES ${libpng_public_hdrs} DESTINATION include)
\r
882 install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME})
\r
884 if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL)
\r
885 if(NOT WIN32 OR CYGWIN OR MINGW)
\r
886 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
\r
887 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config DESTINATION bin)
\r
891 if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL)
\r
892 install(TARGETS ${PNG_BIN_TARGETS}
\r
893 RUNTIME DESTINATION bin)
\r
896 if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL)
\r
897 # Install man pages
\r
898 if(NOT PNG_MAN_DIR)
\r
899 set(PNG_MAN_DIR "share/man")
\r
901 install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)
\r
902 install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)
\r
903 # Install pkg-config files
\r
904 if(NOT CMAKE_HOST_WIN32 OR CYGWIN OR MINGW)
\r
905 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
\r
906 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
\r
907 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
\r
909 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
\r
910 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
\r
911 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
\r
916 # Create an export file that CMake users can include() to import our targets.
\r
917 if(NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL)
\r
918 install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
\r
921 # what's with libpng-manual.txt and all the extra files?
\r
929 # to create msvc import lib for mingw compiled shared lib
\r
930 # pexports libpng.dll > libpng.def
\r
931 # lib /def:libpng.def /machine:x86
\r