fix getsup (HH)
[luatex.git] / source / libs / libpng / libpng-src / CMakeLists.txt
blobe076d5e946d572a22be14adb75fe1600d8db8ec5
1 # CMakeLists.txt
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.
18 if (POLICY CMP0020)
19   cmake_policy(SET CMP0020 NEW)
20 endif(POLICY CMP0020)
21 if (POLICY CMP0042)
22   cmake_policy(SET CMP0042 NEW)
23 endif(POLICY CMP0042)
24 # Use new variable expansion policy.
25 if (POLICY CMP0053)
26   cmake_policy(SET CMP0053 NEW)
27 endif(POLICY CMP0053)
28 if (POLICY CMP0054)
29   cmake_policy(SET CMP0054 NEW)
30 endif(POLICY CMP0054)
32 set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
34 project(libpng C)
35 enable_testing()
37 set(PNGLIB_MAJOR 1)
38 set(PNGLIB_MINOR 6)
39 set(PNGLIB_RELEASE 28)
40 set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
41 set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
43 # needed packages
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)
54 if(NOT WIN32)
55   find_library(M_LIBRARY
56     NAMES m
57     PATHS /usr/lib /usr/local/lib
58   )
59   if(NOT M_LIBRARY)
60     message(STATUS "math lib 'libm' not found; floating point support disabled")
61   endif()
62 else()
63   # not needed on windows
64   set(M_LIBRARY "")
65 endif()
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)
91   if(index EQUAL -1)
92     message(FATAL_ERROR
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
96       arm/arm_init.c
97       arm/filter_neon.S
98       arm/filter_neon_intrinsics.c)
99       
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)
104     endif()
105   else()
106     add_definitions(-DPNG_ARM_NEON_OPT=0)
107   endif()
108 endif()
110 # SET LIBNAME
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 {
121         global: sym;
122         local: *;
125 VERS_2 {
126         global: sym2;
127                 main;
128 } 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) {}
133 void sym2(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) {}
139 void sym2(void) {}
140 int main(void) {return 0;}
141 " HAVE_SOLARIS_LD_VERSION_SCRIPT)
142   endif()
143   set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
144   file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
145 endif()
147 # Find symbol prefix.  Likely obsolete and unnecessary with recent
148 # toolchains (it's not done in many other projects).
149 function(symbol_prefix)
150   set(SYMBOL_PREFIX)
152   execute_process(COMMAND "${CMAKE_C_COMPILER}" "-E" "-"
153                   INPUT_FILE /dev/null
154                   OUTPUT_VARIABLE OUT
155                   RESULT_VARIABLE STATUS)
157   if(CPP_FAIL)
158     message(WARNING "Failed to run the C preprocessor")
159   endif()
161   string(REPLACE "\n" ";" OUT "${OUT}")
162   foreach(line ${OUT})
163     string(REGEX MATCH "^PREFIX=" found_match "${line}")
164     if(found_match)
165       STRING(REGEX REPLACE "^PREFIX=(.*\)" "\\1" prefix "${line}")
166       string(REGEX MATCH "__USER_LABEL_PREFIX__" found_match "${prefix}")
167       if(found_match)
168         STRING(REGEX REPLACE "(.*)__USER_LABEL_PREFIX__(.*)" "\\1\\2" prefix "${prefix}")
169       endif()
170       set(SYMBOL_PREFIX "${prefix}")
171     endif()
172   endforeach()
174     message(STATUS "Symbol prefix: ${SYMBOL_PREFIX}")
175     set(SYMBOL_PREFIX "${SYMBOL_PREFIX}" PARENT_SCOPE)
176 endfunction()
178 if(UNIX)
179   symbol_prefix()
180 endif()
182 find_program(AWK NAMES gawk awk)
184 include_directories(${CMAKE_CURRENT_BINARY_DIR})
186 if(NOT AWK)
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
191 else()
192   include(CMakeParseArguments)
193   # Generate .chk from .out with awk
194   # generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
195   function(generate_chk)
196     set(options)
197     set(oneValueArgs INPUT OUTPUT)
198     set(multiValueArgs DEPENDS)
199     cmake_parse_arguments(_GC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
200     if (NOT _GC_INPUT)
201       message(FATAL_ERROR "Invalid arguments.  generate_out requires input.")
202     endif()
203     if (NOT _GC_OUTPUT)
204       message(FATAL_ERROR "Invalid arguments.  generate_out requires output.")
205     endif()
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}")
214   endfunction()
216   # Generate .out from .c with awk
217   # generate_out(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
218   function(generate_out)
219     set(options)
220     set(oneValueArgs INPUT OUTPUT)
221     set(multiValueArgs DEPENDS)
222     cmake_parse_arguments(_GO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
223     if (NOT _GO_INPUT)
224       message(FATAL_ERROR "Invalid arguments.  generate_out requires input.")
225     endif()
226     if (NOT _GO_OUTPUT)
227       message(FATAL_ERROR "Invalid arguments.  generate_out requires output.")
228     endif()
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}")
237   endfunction()
239   # Generate specific source file with awk
240   # generate_source(OUTPUT outputfile [DEPENDS dep1 [dep2...]])
241   function(generate_source)
242     set(options)
243     set(oneValueArgs OUTPUT)
244     set(multiValueArgs DEPENDS)
245     cmake_parse_arguments(_GSO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
246     if (NOT _GSO_OUTPUT)
247       message(FATAL_ERROR "Invalid arguments.  generate_source requires output.")
248     endif()
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}")
256   endfunction()
258   # Copy file
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}"
263                                                           "${destination}"
264                        DEPENDS "${source}")
265   endfunction()
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")
279   if(PNG_PREFIX)
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")
285   endif()
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")
365 endif(NOT AWK)
367 # OUR SOURCES
368 set(libpng_public_hdrs
369   png.h
370   pngconf.h
371   "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
373 set(libpng_private_hdrs
374   pngpriv.h
375   pngdebug.h
376   pnginfo.h
377   pngstruct.h
379 if(AWK)
380   list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h")
381 endif()
382 set(libpng_sources
383   ${libpng_public_hdrs}
384   ${libpng_private_hdrs}
385   png.c
386   pngerror.c
387   pngget.c
388   pngmem.c
389   pngpread.c
390   pngread.c
391   pngrio.c
392   pngrtran.c
393   pngrutil.c
394   pngset.c
395   pngtrans.c
396   pngwio.c
397   pngwrite.c
398   pngwtran.c
399   pngwutil.c
400   ${libpng_arm_sources}
402 set(pngtest_sources
403   pngtest.c
405 set(pngvalid_sources
406   contrib/libtests/pngvalid.c
408 set(pngstest_sources
409   contrib/libtests/pngstest.c
411 set(pngunknown_sources
412   contrib/libtests/pngunknown.c
414 set(pngimage_sources
415   contrib/libtests/pngimage.c
417 set(pngfix_sources
418   contrib/tools/pngfix.c
420 set(png_fix_itxt_sources
421   contrib/tools/png-fix-itxt.c
424 if(MSVC)
425   add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
426 endif(MSVC)
428 if(PNG_DEBUG)
429   add_definitions(-DPNG_DEBUG)
430 endif()
432 # NOW BUILD OUR TARGET
433 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
435 unset(PNG_LIB_TARGETS)
437 if(PNG_SHARED)
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)
442   if(MSVC)
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")
446   endif()
447   target_link_libraries(png ${ZLIB_LIBRARY} ${M_LIBRARY})
449   if(UNIX AND AWK)
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'")
456     endif()
457   endif()
458 endif()
460 if(PNG_STATIC)
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.
468   if(NOT MSVC)
469     set_target_properties(png_static PROPERTIES
470       OUTPUT_NAME "${PNG_LIB_NAME}"
471       CLEAN_DIRECT_OUTPUT 1)
472   else()
473     set_target_properties(png_static PROPERTIES
474       OUTPUT_NAME "${PNG_LIB_NAME}_static"
475       CLEAN_DIRECT_OUTPUT 1)
476   endif()
477   list(APPEND PNG_LIB_TARGETS png_static)
478   if(MSVC)
479     # msvc does not append 'lib' - do it here to have consistent name
480     set_target_properties(png_static PROPERTIES PREFIX "lib")
481   endif()
482   target_link_libraries(png_static ${ZLIB_LIBRARY} ${M_LIBRARY})
483 endif()
485 if(PNG_FRAMEWORK)
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
491     FRAMEWORK TRUE
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}"
498     OUTPUT_NAME png)
499   target_link_libraries(png_framework ${ZLIB_LIBRARY} ${M_LIBRARY})
500 endif()
502 if(NOT PNG_LIB_TARGETS)
503   message(SEND_ERROR
504     "No library variant selected to build. "
505     "Please enable at least one of the following options: "
506     " PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")
507 endif()
509 if(PNG_SHARED AND WIN32)
510   set_target_properties(png PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
511 endif()
513 function(png_add_test)
514   set(options)
515   set(oneValueArgs NAME COMMAND)
516   set(multiValueArgs OPTIONS FILES)
517   cmake_parse_arguments(_PAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
519   if (NOT _PAT_NAME)
520     message(FATAL_ERROR "Invalid arguments.  png_add_test requires name.")
521   endif()
522   if (NOT _PAT_COMMAND)
523     message(FATAL_ERROR "Invalid arguments.  png_add_test requires command.")
524   endif()
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")
543   endif()
544 endfunction()
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")
552   list(SORT TEST_PNGS)
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)
598       set(PNGSTEST_FILES)
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)
607         if(TEST_PNG_ALPHA)
608           if (NOT "${alpha_type}" STREQUAL "alpha")
609             set(TEST_PNG_VALID FALSE)
610           endif()
611         else()
612           if ("${alpha_type}" STREQUAL "alpha")
613             set(TEST_PNG_VALID FALSE)
614           endif()
615         endif()
617         if(TEST_PNG_LINEAR)
618           if(NOT "${gamma_type}" STREQUAL "linear")
619             set(TEST_PNG_VALID FALSE)
620           endif()
621         elseif(TEST_PNG_SRGB)
622           if(NOT "${gamma_type}" STREQUAL "sRGB")
623             set(TEST_PNG_VALID FALSE)
624           endif()
625         elseif(TEST_PNG_G18)
626           if(NOT "${gamma_type}" STREQUAL "1.8")
627             set(TEST_PNG_VALID FALSE)
628           endif()
629         else()
630           if(NOT "${gamma_type}" STREQUAL "none")
631             set(TEST_PNG_VALID FALSE)
632           endif()
633         endif()
635         if(TEST_PNG_VALID)
636           list(APPEND PNGSTEST_FILES "${test_png}")
637         endif()
638       endforeach()
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}
642                    COMMAND pngstest
643                    OPTIONS --tmpfile "${gamma_type}-${alpha_type}-" --log
644                    FILES ${PNGSTEST_FILES})
645     endforeach()
646   endforeach()
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})
664 endif()
666 if(PNG_SHARED)
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)
674 endif()
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)
687     ADD_CUSTOM_COMMAND(
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}
692         )
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)
700 endmacro()
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
719 # a UNIX look alike
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)
725   set(LIBS        "-lz -lm")
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)
735 # SET UP LINKS
736 if(PNG_SHARED)
737   set_target_properties(png PROPERTIES
738 #   VERSION 16.${PNGLIB_RELEASE}.1.6.28
739     VERSION 16.${PNGLIB_RELEASE}.0
740     SOVERSION 16
741     CLEAN_DIRECT_OUTPUT 1)
742 endif()
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)
751 endif()
753 # INSTALL
754 if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
755   install(TARGETS ${PNG_LIB_TARGETS}
756       ${PNG_EXPORT_RULE}
757       RUNTIME DESTINATION bin
758       LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
759       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
760       FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})
762   if(PNG_SHARED)
763     # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
764     if(CYGWIN OR MINGW)
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)
771     if(NOT WIN32)
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})
776     endif(NOT WIN32)
777   endif(PNG_SHARED)
779   if(PNG_STATIC)
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)
786  endif()
787 endif()
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})
792 endif()
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
797             DESTINATION bin)
798   endif(NOT WIN32 OR CYGWIN OR MINGW)
799 endif()
801 if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL )
802   install(TARGETS ${PNG_BIN_TARGETS}
803       RUNTIME DESTINATION bin)
804 endif()
806 if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
807   # Install man pages
808   if(NOT PNG_MAN_DIR)
809     set(PNG_MAN_DIR "share/man")
810   endif()
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
818             DESTINATION bin)
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
822             DESTINATION bin)
823   endif(NOT WIN32 OR CYGWIN OR MINGW)
824 endif()
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)
830 endif()
832 # what's with libpng-manual.txt and all the extra files?
834 # UNINSTALL
835 # do we need this?
837 # DIST
838 # do we need this?
840 # to create msvc import lib for mingw compiled shared lib
841 # pexports libpng.dll > libpng.def
842 # lib /def:libpng.def /machine:x86