Home | History | Annotate | Download | only in libpng
      1 # CMakeLists.txt
      2 
      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 
      9 # This code is released under the libpng license.
     10 # For conditions of distribution and use, see the disclaimer
     11 # and license in png.h
     12 
     13 cmake_minimum_required(VERSION 2.8.3)
     14 cmake_policy(VERSION 2.8.3)
     15 
     16 # Set MacOSX @rpath usage globally.
     17 if (POLICY CMP0020)
     18   cmake_policy(SET CMP0020 NEW)
     19 endif(POLICY CMP0020)
     20 if (POLICY CMP0042)
     21   cmake_policy(SET CMP0042 NEW)
     22 endif(POLICY CMP0042)
     23 # Use new variable expansion policy.
     24 if (POLICY CMP0053)
     25   cmake_policy(SET CMP0053 NEW)
     26 endif(POLICY CMP0053)
     27 if (POLICY CMP0054)
     28   cmake_policy(SET CMP0054 NEW)
     29 endif(POLICY CMP0054)
     30 
     31 set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
     32 
     33 project(libpng C)
     34 enable_testing()
     35 
     36 set(PNGLIB_MAJOR 1)
     37 set(PNGLIB_MINOR 6)
     38 set(PNGLIB_RELEASE 22)
     39 set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
     40 set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
     41 
     42 # needed packages
     43 find_package(ZLIB REQUIRED)
     44 include_directories(${ZLIB_INCLUDE_DIR})
     45 
     46 if(NOT WIN32)
     47   find_library(M_LIBRARY
     48     NAMES m
     49     PATHS /usr/lib /usr/local/lib
     50   )
     51   if(NOT M_LIBRARY)
     52     message(STATUS "math lib 'libm' not found; floating point support disabled")
     53   endif()
     54 else()
     55   # not needed on windows
     56   set(M_LIBRARY "")
     57 endif()
     58 
     59 # COMMAND LINE OPTIONS
     60 option(PNG_SHARED "Build shared lib" ON)
     61 option(PNG_STATIC "Build static lib" ON)
     62 option(PNG_TESTS  "Build libpng tests" ON)
     63 
     64 # Many more configuration options could be added here
     65 option(PNG_FRAMEWORK "Build OS X framework" OFF)
     66 option(PNG_DEBUG     "Build with debug output" OFF)
     67 option(PNGARG        "Disable ANSI-C prototypes" OFF)
     68 
     69 set(PNG_PREFIX "" CACHE STRING "Prefix to add to the API function names")
     70 set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings")
     71 
     72 # SET LIBNAME
     73 set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
     74 
     75 # to distinguish between debug and release lib
     76 set(CMAKE_DEBUG_POSTFIX "d")
     77 
     78 include(CheckCSourceCompiles)
     79 option(ld-version-script "Enable linker version script" ON)
     80 if(ld-version-script AND NOT APPLE)
     81   # Check if LD supports linker scripts.
     82   file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" "VERS_1 {
     83         global: sym;
     84         local: *;
     85 };
     86 
     87 VERS_2 {
     88         global: sym2;
     89                 main;
     90 } VERS_1;
     91 ")
     92   set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
     93   set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/conftest.map'")
     94   check_c_source_compiles("void sym(void) {}
     95 void sym2(void) {}
     96 int main(void) {return 0;}
     97 " HAVE_LD_VERSION_SCRIPT)
     98   if(NOT HAVE_LD_VERSION_SCRIPT)
     99     set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE} "-Wl,-M -Wl,${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
    100   check_c_source_compiles("void sym(void) {}
    101 void sym2(void) {}
    102 int main(void) {return 0;}
    103 " HAVE_SOLARIS_LD_VERSION_SCRIPT)
    104   endif()
    105   set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
    106   file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
    107 endif()
    108 
    109 # Find symbol prefix.  Likely obsolete and unnecessary with recent
    110 # toolchains (it's not done in many other projects).
    111 function(symbol_prefix)
    112   set(SYMBOL_PREFIX)
    113 
    114   execute_process(COMMAND "${CMAKE_C_COMPILER}" "-E" "-"
    115                   INPUT_FILE /dev/null
    116                   OUTPUT_VARIABLE OUT
    117                   RESULT_VARIABLE STATUS)
    118 
    119   if(CPP_FAIL)
    120     message(WARNING "Failed to run the C preprocessor")
    121   endif()
    122 
    123   string(REPLACE "\n" ";" OUT "${OUT}")
    124   foreach(line ${OUT})
    125     string(REGEX MATCH "^PREFIX=" found_match "${line}")
    126     if(found_match)
    127       STRING(REGEX REPLACE "^PREFIX=(.*\)" "\\1" prefix "${line}")
    128       string(REGEX MATCH "__USER_LABEL_PREFIX__" found_match "${prefix}")
    129       if(found_match)
    130         STRING(REGEX REPLACE "(.*)__USER_LABEL_PREFIX__(.*)" "\\1\\2" prefix "${prefix}")
    131       endif()
    132       set(SYMBOL_PREFIX "${prefix}")
    133     endif()
    134   endforeach()
    135 
    136     message(STATUS "Symbol prefix: ${SYMBOL_PREFIX}")
    137     set(SYMBOL_PREFIX "${SYMBOL_PREFIX}" PARENT_SCOPE)
    138 endfunction()
    139 
    140 if(UNIX)
    141   symbol_prefix()
    142 endif()
    143 
    144 find_program(AWK NAMES gawk awk)
    145 
    146 include_directories(${CMAKE_CURRENT_BINARY_DIR})
    147 
    148 if(NOT AWK)
    149   # No awk available to generate sources; use pre-built pnglibconf.h
    150   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
    151                  ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
    152   add_custom_target(genfiles) # Dummy
    153 else()
    154   include(CMakeParseArguments)
    155   # Generate .chk from .out with awk
    156   # generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
    157   function(generate_chk)
    158     set(options)
    159     set(oneValueArgs INPUT OUTPUT)
    160     set(multiValueArgs DEPENDS)
    161     cmake_parse_arguments(_GC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
    162     if (NOT _GC_INPUT)
    163       message(FATAL_ERROR "Invalid arguments.  generate_out requires input.")
    164     endif()
    165     if (NOT _GC_OUTPUT)
    166       message(FATAL_ERROR "Invalid arguments.  generate_out requires output.")
    167     endif()
    168 
    169     add_custom_command(OUTPUT "${_GC_OUTPUT}"
    170                        COMMAND "${CMAKE_COMMAND}"
    171                                "-DINPUT=${_GC_INPUT}"
    172                                "-DOUTPUT=${_GC_OUTPUT}"
    173                                -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake"
    174                        DEPENDS "${_GC_INPUT}" ${_GC_DEPENDS}
    175                        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
    176   endfunction()
    177 
    178   # Generate .out from .c with awk
    179   # generate_out(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
    180   function(generate_out)
    181     set(options)
    182     set(oneValueArgs INPUT OUTPUT)
    183     set(multiValueArgs DEPENDS)
    184     cmake_parse_arguments(_GO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
    185     if (NOT _GO_INPUT)
    186       message(FATAL_ERROR "Invalid arguments.  generate_out requires input.")
    187     endif()
    188     if (NOT _GO_OUTPUT)
    189       message(FATAL_ERROR "Invalid arguments.  generate_out requires output.")
    190     endif()
    191 
    192     add_custom_command(OUTPUT "${_GO_OUTPUT}"
    193                        COMMAND "${CMAKE_COMMAND}"
    194                                "-DINPUT=${_GO_INPUT}"
    195                                "-DOUTPUT=${_GO_OUTPUT}"
    196                                -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake"
    197                        DEPENDS "${_GO_INPUT}" ${_GO_DEPENDS}
    198                        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
    199   endfunction()
    200 
    201   # Generate specific source file with awk
    202   # generate_source(OUTPUT outputfile [DEPENDS dep1 [dep2...]])
    203   function(generate_source)
    204     set(options)
    205     set(oneValueArgs OUTPUT)
    206     set(multiValueArgs DEPENDS)
    207     cmake_parse_arguments(_GSO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
    208     if (NOT _GSO_OUTPUT)
    209       message(FATAL_ERROR "Invalid arguments.  generate_source requires output.")
    210     endif()
    211 
    212     add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_GSO_OUTPUT}"
    213                        COMMAND "${CMAKE_COMMAND}"
    214                                "-DOUTPUT=${_GSO_OUTPUT}"
    215                                -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
    216                        DEPENDS ${_GSO_DEPENDS}
    217                        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
    218   endfunction()
    219 
    220   # Copy file
    221   function(generate_copy source destination)
    222     add_custom_command(OUTPUT "${destination}"
    223                        COMMAND "${CMAKE_COMMAND}" -E remove "${destination}"
    224                        COMMAND "${CMAKE_COMMAND}" -E copy "${source}"
    225                                                           "${destination}"
    226                        DEPENDS "${source}")
    227   endfunction()
    228 
    229   # Generate scripts/pnglibconf.h
    230   generate_source(OUTPUT "scripts/pnglibconf.c"
    231                   DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa"
    232                           "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk"
    233                           "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h")
    234 
    235   # Generate pnglibconf.c
    236   generate_source(OUTPUT "pnglibconf.c"
    237                   DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa"
    238                           "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk"
    239                           "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h")
    240 
    241   if(PNG_PREFIX)
    242     set(PNGLIBCONF_H_EXTRA_DEPENDS
    243         "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
    244         "${CMAKE_CURRENT_SOURCE_DIR}/scripts/macro.lst")
    245     set(PNGPREFIX_H_EXTRA_DEPENDS
    246         "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out")
    247   endif()
    248 
    249   generate_out(INPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
    250                OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out")
    251 
    252   # Generate pnglibconf.h
    253   generate_source(OUTPUT "pnglibconf.h"
    254                   DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out"
    255                           ${PNGLIBCONF_H_EXTRA_DEPENDS})
    256 
    257   generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/intprefix.c"
    258                OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out"
    259                DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
    260 
    261   generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/prefix.c"
    262                OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
    263                DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
    264                        "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
    265                        "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out")
    266 
    267   # Generate pngprefix.h
    268   generate_source(OUTPUT "pngprefix.h"
    269                   DEPENDS ${PNGPREFIX_H_EXTRA_DEPENDS})
    270 
    271   generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/sym.c"
    272                OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
    273                DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
    274 
    275   generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.c"
    276                OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
    277                DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
    278                        "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
    279                        "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt")
    280 
    281   generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/vers.c"
    282                OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
    283                DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
    284                        "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
    285                        "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
    286 
    287   generate_chk(INPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
    288                OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"
    289                DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk"
    290                        "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def")
    291 
    292   add_custom_target(symbol-check DEPENDS
    293                     "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk")
    294 
    295   generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
    296                 "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
    297   generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
    298                 "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
    299 
    300   add_custom_target(genvers DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
    301   add_custom_target(gensym DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
    302 
    303   add_custom_target("genprebuilt"
    304                     COMMAND "${CMAKE_COMMAND}"
    305                             "-DOUTPUT=scripts/pnglibconf.h.prebuilt"
    306                             -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
    307                     WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
    308 
    309   # A single target handles generation of all generated files.  If
    310   # they are dependend upon separately by multiple targets, this
    311   # confuses parallel make (it would require a separate top-level
    312   # target for each file to track the dependencies properly).
    313   add_custom_target(genfiles DEPENDS
    314     "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym"
    315     "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers"
    316     "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
    317     "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
    318     "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out"
    319     "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h"
    320     "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out"
    321     "${CMAKE_CURRENT_BINARY_DIR}/scripts/pnglibconf.c"
    322     "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
    323     "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
    324     "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"
    325     "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
    326     "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out")
    327 endif(NOT AWK)
    328 
    329 # OUR SOURCES
    330 set(libpng_public_hdrs
    331   png.h
    332   pngconf.h
    333   "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
    334 )
    335 set(libpng_private_hdrs
    336   pngpriv.h
    337   pngdebug.h
    338   pnginfo.h
    339   pngstruct.h
    340 )
    341 if(AWK)
    342   list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h")
    343 endif()
    344 set(libpng_sources
    345   ${libpng_public_hdrs}
    346   ${libpng_private_hdrs}
    347   png.c
    348   pngerror.c
    349   pngget.c
    350   pngmem.c
    351   pngpread.c
    352   pngread.c
    353   pngrio.c
    354   pngrtran.c
    355   pngrutil.c
    356   pngset.c
    357   pngtrans.c
    358   pngwio.c
    359   pngwrite.c
    360   pngwtran.c
    361   pngwutil.c
    362 )
    363 set(pngtest_sources
    364   pngtest.c
    365 )
    366 set(pngvalid_sources
    367   contrib/libtests/pngvalid.c
    368 )
    369 set(pngstest_sources
    370   contrib/libtests/pngstest.c
    371 )
    372 set(pngunknown_sources
    373   contrib/libtests/pngunknown.c
    374 )
    375 set(pngimage_sources
    376   contrib/libtests/pngimage.c
    377 )
    378 set(pngfix_sources
    379   contrib/tools/pngfix.c
    380 )
    381 set(png_fix_itxt_sources
    382   contrib/tools/png-fix-itxt.c
    383 )
    384 
    385 if(MSVC)
    386   add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
    387 endif(MSVC)
    388 
    389 if(PNG_DEBUG)
    390   add_definitions(-DPNG_DEBUG)
    391 endif()
    392 
    393 # NOW BUILD OUR TARGET
    394 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
    395 
    396 unset(PNG_LIB_TARGETS)
    397 
    398 if(PNG_SHARED)
    399   add_library(png SHARED ${libpng_sources})
    400   set(PNG_LIB_TARGETS png)
    401   set_target_properties(png PROPERTIES OUTPUT_NAME ${PNG_LIB_NAME})
    402   add_dependencies(png genfiles)
    403   if(MSVC)
    404     # msvc does not append 'lib' - do it here to have consistent name
    405     set_target_properties(png PROPERTIES PREFIX "lib")
    406     set_target_properties(png PROPERTIES IMPORT_PREFIX "lib")
    407   endif()
    408   target_link_libraries(png ${ZLIB_LIBRARY} ${M_LIBRARY})
    409 
    410   if(UNIX AND AWK)
    411     if(HAVE_LD_VERSION_SCRIPT)
    412       set_target_properties(png PROPERTIES LINK_FLAGS
    413         "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
    414     elseif(HAVE_SOLARIS_LD_VERSION_SCRIPT)
    415       set_target_properties(png PROPERTIES LINK_FLAGS
    416         "-Wl,-M -Wl,'${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
    417     endif()
    418   endif()
    419 endif()
    420 
    421 if(PNG_STATIC)
    422   # does not work without changing name
    423   set(PNG_LIB_NAME_STATIC png_static)
    424   add_library(png_static STATIC ${libpng_sources})
    425   add_dependencies(png_static genfiles)
    426   # MSVC doesn't use a different file extension for shared vs. static
    427   # libs.  We are able to change OUTPUT_NAME to remove the _static
    428   # for all other platforms.
    429   if(NOT MSVC)
    430     set_target_properties(png_static PROPERTIES
    431       OUTPUT_NAME "${PNG_LIB_NAME}"
    432       CLEAN_DIRECT_OUTPUT 1)
    433   else()
    434     set_target_properties(png_static PROPERTIES
    435       OUTPUT_NAME "${PNG_LIB_NAME}_static"
    436       CLEAN_DIRECT_OUTPUT 1)
    437   endif()
    438   list(APPEND PNG_LIB_TARGETS png_static)
    439   if(MSVC)
    440     # msvc does not append 'lib' - do it here to have consistent name
    441     set_target_properties(png_static PROPERTIES PREFIX "lib")
    442   endif()
    443   target_link_libraries(png_static ${ZLIB_LIBRARY} ${M_LIBRARY})
    444 endif()
    445 
    446 if(PNG_FRAMEWORK)
    447   set(PNG_LIB_NAME_FRAMEWORK png_framework)
    448   add_library(png_framework SHARED ${libpng_sources})
    449   add_dependencies(png_framework genfiles)
    450   list(APPEND PNG_LIB_TARGETS png_framework)
    451   set_target_properties(png_framework PROPERTIES
    452     FRAMEWORK TRUE
    453     FRAMEWORK_VERSION ${PNGLIB_VERSION}
    454     MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PNGLIB_MAJOR}.${PNGLIB_MINOR}
    455     MACOSX_FRAMEWORK_BUNDLE_VERSION ${PNGLIB_VERSION}
    456     MACOSX_FRAMEWORK_IDENTIFIER org.libpng.libpng
    457     XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
    458     PUBLIC_HEADER "${libpng_public_hdrs}"
    459     OUTPUT_NAME png)
    460   target_link_libraries(png_framework ${ZLIB_LIBRARY} ${M_LIBRARY})
    461 endif()
    462 
    463 if(NOT PNG_LIB_TARGETS)
    464   message(SEND_ERROR
    465     "No library variant selected to build. "
    466     "Please enable at least one of the following options: "
    467     " PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")
    468 endif()
    469 
    470 if(PNG_SHARED AND WIN32)
    471   set_target_properties(png PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
    472 endif()
    473 
    474 function(png_add_test)
    475   set(options)
    476   set(oneValueArgs NAME COMMAND)
    477   set(multiValueArgs OPTIONS FILES)
    478   cmake_parse_arguments(_PAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
    479 
    480   if (NOT _PAT_NAME)
    481     message(FATAL_ERROR "Invalid arguments.  png_add_test requires name.")
    482   endif()
    483   if (NOT _PAT_COMMAND)
    484     message(FATAL_ERROR "Invalid arguments.  png_add_test requires command.")
    485   endif()
    486 
    487   set(TEST_OPTIONS "${_PAT_OPTIONS}")
    488   set(TEST_FILES "${_PAT_FILES}")
    489 
    490   configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in"
    491                  "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake" @ONLY)
    492   if(CMAKE_MAJOR_VERSION GREATER 2) # have generator expressions
    493     add_test(NAME "${_PAT_NAME}"
    494              COMMAND "${CMAKE_COMMAND}"
    495              "-DLIBPNG=$<TARGET_FILE:png>"
    496              "-DTEST_COMMAND=$<TARGET_FILE:${_PAT_COMMAND}>"
    497              -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")
    498   else() # old 2.x add_test; limited and won't work well on Windows
    499     # Note LIBPNG is a dummy value as there are no generator expressions
    500     add_test("${_PAT_NAME}" "${CMAKE_COMMAND}"
    501              "-DLIBPNG=${CMAKE_CURRENT_BINARY_DIR}/libpng.so"
    502              "-DTEST_COMMAND=./${_PAT_COMMAND}"
    503              -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")
    504   endif()
    505 endfunction()
    506 
    507 if(PNG_TESTS AND PNG_SHARED)
    508   # Find test PNG files by globbing, but sort lists to ensure
    509   # consistency between different filesystems.
    510   file(GLOB PNGSUITE_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/*.png")
    511   list(SORT PNGSUITE_PNGS)
    512   file(GLOB TEST_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/testpngs/*.png")
    513   list(SORT TEST_PNGS)
    514 
    515   set(PNGTEST_PNG "${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png")
    516 
    517   add_executable(pngtest ${pngtest_sources})
    518   target_link_libraries(pngtest png)
    519 
    520   png_add_test(NAME pngtest COMMAND pngtest FILES "${PNGTEST_PNG}")
    521 
    522   add_executable(pngvalid ${pngvalid_sources})
    523   target_link_libraries(pngvalid png)
    524 
    525   png_add_test(NAME pngvalid-gamma-16-to-8
    526                COMMAND pngvalid OPTIONS --gamma-16-to-8)
    527   png_add_test(NAME pngvalid-gamma-alpha-mode
    528                COMMAND pngvalid OPTIONS --gamma-alpha-mode)
    529   png_add_test(NAME pngvalid-gamma-background
    530                COMMAND pngvalid OPTIONS --gamma-background)
    531   png_add_test(NAME pngvalid-gamma-expand16-alpha-mode
    532                COMMAND pngvalid OPTIONS --gamma-alpha-mode --expand16)
    533   png_add_test(NAME pngvalid-gamma-expand16-background
    534                COMMAND pngvalid OPTIONS --gamma-background --expand16)
    535   png_add_test(NAME pngvalid-gamma-expand16-transform
    536                COMMAND pngvalid OPTIONS --gamma-transform --expand16)
    537   png_add_test(NAME pngvalid-gamma-sbit
    538                COMMAND pngvalid OPTIONS --gamma-sbit)
    539   png_add_test(NAME pngvalid-gamma-threshold
    540                COMMAND pngvalid OPTIONS --gamma-threshold)
    541   png_add_test(NAME pngvalid-gamma-transform
    542                COMMAND pngvalid OPTIONS --gamma-transform)
    543   png_add_test(NAME pngvalid-progressive-interlace-standard
    544                COMMAND pngvalid OPTIONS --standard --progressive-read --interlace)
    545   png_add_test(NAME pngvalid-progressive-size
    546                COMMAND pngvalid OPTIONS --size --progressive-read)
    547   png_add_test(NAME pngvalid-progressive-standard
    548                COMMAND pngvalid OPTIONS --standard --progressive-read)
    549   png_add_test(NAME pngvalid-standard
    550                COMMAND pngvalid OPTIONS --standard)
    551   png_add_test(NAME pngvalid-transform
    552                COMMAND pngvalid OPTIONS --transform)
    553 
    554   add_executable(pngstest ${pngstest_sources})
    555   target_link_libraries(pngstest png)
    556 
    557   foreach(gamma_type 1.8 linear none sRGB)
    558     foreach(alpha_type none alpha)
    559       set(PNGSTEST_FILES)
    560       foreach(test_png ${TEST_PNGS})
    561         string(REGEX MATCH ".*-linear[-.].*" TEST_PNG_LINEAR "${test_png}")
    562         string(REGEX MATCH ".*-sRGB[-.].*" TEST_PNG_SRGB "${test_png}")
    563         string(REGEX MATCH ".*-1.8[-.].*" TEST_PNG_G18 "${test_png}")
    564         string(REGEX MATCH ".*-alpha-.*" TEST_PNG_ALPHA "${test_png}")
    565 
    566         set(TEST_PNG_VALID TRUE)
    567 
    568         if(TEST_PNG_ALPHA)
    569           if (NOT "${alpha_type}" STREQUAL "alpha")
    570             set(TEST_PNG_VALID FALSE)
    571           endif()
    572         else()
    573           if ("${alpha_type}" STREQUAL "alpha")
    574             set(TEST_PNG_VALID FALSE)
    575           endif()
    576         endif()
    577 
    578         if(TEST_PNG_LINEAR)
    579           if(NOT "${gamma_type}" STREQUAL "linear")
    580             set(TEST_PNG_VALID FALSE)
    581           endif()
    582         elseif(TEST_PNG_SRGB)
    583           if(NOT "${gamma_type}" STREQUAL "sRGB")
    584             set(TEST_PNG_VALID FALSE)
    585           endif()
    586         elseif(TEST_PNG_G18)
    587           if(NOT "${gamma_type}" STREQUAL "1.8")
    588             set(TEST_PNG_VALID FALSE)
    589           endif()
    590         else()
    591           if(NOT "${gamma_type}" STREQUAL "none")
    592             set(TEST_PNG_VALID FALSE)
    593           endif()
    594         endif()
    595 
    596         if(TEST_PNG_VALID)
    597           list(APPEND PNGSTEST_FILES "${test_png}")
    598         endif()
    599       endforeach()
    600       # Should already be sorted, but sort anyway to be certain.
    601       list(SORT PNGSTEST_FILES)
    602       png_add_test(NAME pngstest-${gamma_type}-${alpha_type}
    603                    COMMAND pngstest
    604                    OPTIONS --tmpfile "${gamma_type}-${alpha_type}-" --log
    605                    FILES ${PNGSTEST_FILES})
    606     endforeach()
    607   endforeach()
    608 
    609   add_executable(pngunknown ${pngunknown_sources})
    610   target_link_libraries(pngunknown png)
    611 
    612   png_add_test(NAME pngunknown-discard COMMAND pngunknown OPTIONS --strict default=discard FILES "${PNGTEST_PNG}")
    613   png_add_test(NAME pngunknown-IDAT COMMAND pngunknown OPTIONS --strict default=discard IDAT=save FILES "${PNGTEST_PNG}")
    614   png_add_test(NAME pngunknown-if-safe COMMAND pngunknown OPTIONS --strict default=if-safe FILES "${PNGTEST_PNG}")
    615   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}")
    616   png_add_test(NAME pngunknown-save COMMAND pngunknown OPTIONS --strict default=save FILES "${PNGTEST_PNG}")
    617   png_add_test(NAME pngunknown-sTER COMMAND pngunknown OPTIONS --strict sTER=if-safe FILES "${PNGTEST_PNG}")
    618   png_add_test(NAME pngunknown-vpAg COMMAND pngunknown OPTIONS --strict vpAg=if-safe FILES "${PNGTEST_PNG}")
    619 
    620   add_executable(pngimage ${pngimage_sources})
    621   target_link_libraries(pngimage png)
    622 
    623   png_add_test(NAME pngimage-quick COMMAND pngimage OPTIONS --list-combos --log FILES ${PNGSUITE_PNGS})
    624   png_add_test(NAME pngimage-full COMMAND pngimage OPTIONS --exhaustive --list-combos --log FILES ${PNGSUITE_PNGS})
    625 endif()
    626 
    627 if(PNG_SHARED)
    628   add_executable(pngfix ${pngfix_sources})
    629   target_link_libraries(pngfix png)
    630   set(PNG_BIN_TARGETS pngfix)
    631 
    632   add_executable(png-fix-itxt ${png_fix_itxt_sources})
    633   target_link_libraries(png-fix-itxt ${ZLIB_LIBRARY} ${M_LIBRARY})
    634   list(APPEND PNG_BIN_TARGETS png-fix-itxt)
    635 endif()
    636 
    637 # Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
    638 IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
    639   SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
    640 ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
    641 
    642 # Set a variable with CMake code which:
    643 # Creates a symlink from src to dest (if possible) or alternatively
    644 # copies if different.
    645 macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
    646   FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
    647   if(WIN32 AND NOT CYGWIN AND NOT MSYS)
    648     ADD_CUSTOM_COMMAND(
    649         OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}   ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
    650         COMMAND ${CMAKE_COMMAND} -E copy_if_different  "${SRC_FILE}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
    651         COMMAND ${CMAKE_COMMAND} -E copy_if_different  "${SRC_FILE}" ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
    652         DEPENDS ${PNG_LIB_TARGETS}
    653         )
    654     ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
    655   else(WIN32 AND NOT CYGWIN AND NOT MSYS)
    656     get_filename_component(LINK_TARGET "${SRC_FILE}" NAME)
    657     execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
    658     execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
    659     execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
    660   endif(WIN32 AND NOT CYGWIN AND NOT MSYS)
    661 endmacro()
    662 
    663 # Create source generation scripts.
    664 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in
    665                ${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake @ONLY)
    666 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in
    667                ${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake @ONLY)
    668 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in
    669                ${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake @ONLY)
    670 
    671 
    672 # libpng is a library so default to 'lib'
    673 if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
    674   set(CMAKE_INSTALL_LIBDIR lib)
    675 endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
    676 
    677 # CREATE PKGCONFIG FILES
    678 # we use the same files like ./configure, so we have to set its vars
    679 # Only do this on Windows for Cygwin - the files don't make much sense outside
    680 # a UNIX look alike
    681 if(NOT WIN32 OR CYGWIN OR MINGW)
    682   set(prefix      ${CMAKE_INSTALL_PREFIX})
    683   set(exec_prefix ${CMAKE_INSTALL_PREFIX})
    684   set(libdir      ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
    685   set(includedir  ${CMAKE_INSTALL_PREFIX}/include)
    686   set(LIBS        "-lz -lm")
    687   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
    688     ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
    689   CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
    690 
    691   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
    692     ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
    693   CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
    694 endif(NOT WIN32 OR CYGWIN OR MINGW)
    695 
    696 # SET UP LINKS
    697 if(PNG_SHARED)
    698   set_target_properties(png PROPERTIES
    699 #   VERSION 16.${PNGLIB_RELEASE}.1.6.22beta03
    700     VERSION 16.${PNGLIB_RELEASE}.0
    701     SOVERSION 16
    702     CLEAN_DIRECT_OUTPUT 1)
    703 endif()
    704 
    705 # If CMake > 2.4.x, we set a variable used below to export
    706 # targets to an export file.
    707 # TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
    708 if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)
    709   set(PNG_EXPORT_RULE EXPORT libpng)
    710 elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof
    711   set(PNG_EXPORT_RULE EXPORT libpng)
    712 endif()
    713 
    714 # INSTALL
    715 if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
    716   install(TARGETS ${PNG_LIB_TARGETS}
    717       ${PNG_EXPORT_RULE}
    718       RUNTIME DESTINATION bin
    719       LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    720       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    721       FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})
    722 
    723   if(PNG_SHARED)
    724     # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
    725     if(CYGWIN OR MINGW)
    726        get_target_property(BUILD_TARGET_LOCATION png LOCATION_${CMAKE_BUILD_TYPE})
    727        CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
    728        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
    729          DESTINATION ${CMAKE_INSTALL_LIBDIR})
    730     endif(CYGWIN OR MINGW)
    731 
    732     if(NOT WIN32)
    733       get_target_property(BUILD_TARGET_LOCATION png LOCATION_${CMAKE_BUILD_TYPE})
    734       CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
    735       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
    736          DESTINATION ${CMAKE_INSTALL_LIBDIR})
    737     endif(NOT WIN32)
    738   endif(PNG_SHARED)
    739 
    740   if(PNG_STATIC)
    741     if(NOT WIN32 OR CYGWIN OR MINGW)
    742       get_target_property(BUILD_TARGET_LOCATION png_static LOCATION_${CMAKE_BUILD_TYPE})
    743       CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
    744       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
    745          DESTINATION ${CMAKE_INSTALL_LIBDIR})
    746     endif(NOT WIN32 OR CYGWIN OR MINGW)
    747  endif()
    748 endif()
    749 
    750 if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
    751   install(FILES ${libpng_public_hdrs}   DESTINATION include)
    752   install(FILES ${libpng_public_hdrs}   DESTINATION include/${PNGLIB_NAME})
    753 endif()
    754 if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
    755   if(NOT WIN32 OR CYGWIN OR MINGW)
    756     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
    757     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
    758             DESTINATION bin)
    759   endif(NOT WIN32 OR CYGWIN OR MINGW)
    760 endif()
    761 
    762 if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL )
    763   install(TARGETS ${PNG_BIN_TARGETS}
    764       RUNTIME DESTINATION bin)
    765 endif()
    766 
    767 if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
    768   # Install man pages
    769   if(NOT PNG_MAN_DIR)
    770     set(PNG_MAN_DIR "share/man")
    771   endif()
    772   install(FILES libpng.3 libpngpf.3      DESTINATION ${PNG_MAN_DIR}/man3)
    773   install(FILES png.5                    DESTINATION ${PNG_MAN_DIR}/man5)
    774   # Install pkg-config files
    775   if(NOT WIN32 OR CYGWIN OR MINGW)
    776     install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
    777             DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
    778     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
    779             DESTINATION bin)
    780     install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
    781             DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
    782     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
    783             DESTINATION bin)
    784   endif(NOT WIN32 OR CYGWIN OR MINGW)
    785 endif()
    786 
    787 # On versions of CMake that support it, create an export file CMake
    788 # users can include() to import our targets
    789 if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
    790   install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
    791 endif()
    792 
    793 # what's with libpng-manual.txt and all the extra files?
    794 
    795 # UNINSTALL
    796 # do we need this?
    797 
    798 # DIST
    799 # do we need this?
    800 
    801 # to create msvc import lib for mingw compiled shared lib
    802 # pexports libpng.dll > libpng.def
    803 # lib /def:libpng.def /machine:x86
    804 
    805