Home | History | Annotate | Download | only in libpng
      1 # CMakeLists.txt
      2 
      3 # Copyright (C) 2007-2013 Glenn Randers-Pehrson
      4 
      5 # This code is released under the libpng license.
      6 # For conditions of distribution and use, see the disclaimer
      7 # and license in png.h
      8 
      9 cmake_minimum_required(VERSION 2.4.4)
     10 set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
     11 
     12 set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
     13 
     14 project(libpng C)
     15 enable_testing()
     16 
     17 set(PNGLIB_MAJOR 1)
     18 set(PNGLIB_MINOR 6)
     19 set(PNGLIB_RELEASE 10)
     20 set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
     21 set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
     22 
     23 # needed packages
     24 find_package(ZLIB REQUIRED)
     25 include_directories(${ZLIB_INCLUDE_DIR})
     26 
     27 if(NOT WIN32)
     28   find_library(M_LIBRARY
     29     NAMES m
     30     PATHS /usr/lib /usr/local/lib
     31   )
     32   if(NOT M_LIBRARY)
     33     message(STATUS
     34       "math library 'libm' not found - floating point support disabled")
     35   endif()
     36 else()
     37   # not needed on windows
     38   set(M_LIBRARY "")
     39 endif()
     40 
     41 # COMMAND LINE OPTIONS
     42 if(DEFINED PNG_SHARED)
     43   option(PNG_SHARED "Build shared lib" ${PNG_SHARED})
     44 else()
     45   option(PNG_SHARED "Build shared lib" ON)
     46 endif()
     47 if(DEFINED PNG_STATIC)
     48   option(PNG_STATIC "Build static lib" ${PNG_STATIC})
     49 else()
     50   option(PNG_STATIC "Build static lib" ON)
     51 endif()
     52 
     53 option(PNG_TESTS  "Build libpng tests" YES)
     54 
     55 # Many more configuration options could be added here
     56 option(PNG_DEBUG         "Build with debug output" NO)
     57 option(PNGARG            "Disable ANSI-C prototypes" NO)
     58 
     59 # SET LIBNAME
     60 set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
     61 
     62 # to distinguish between debug and release lib
     63 set(CMAKE_DEBUG_POSTFIX "d")
     64 
     65 # Use the prebuilt pnglibconf.h file from the scripts folder
     66 # TODO: fix this by building with awk; without this no cmake build can be
     67 # configured directly (to do so indirectly use your local awk to build a
     68 # pnglibconf.h in the build directory.)
     69 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
     70                ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
     71 include_directories(${CMAKE_CURRENT_BINARY_DIR})
     72 
     73 # OUR SOURCES
     74 set(libpng_public_hdrs
     75   png.h
     76   pngconf.h
     77   ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h
     78 )
     79 set(libpng_sources
     80   ${libpng_public_hdrs}
     81   pngdebug.h
     82   pnginfo.h
     83   pngpriv.h
     84   pngstruct.h
     85   png.c
     86   pngerror.c
     87   pngget.c
     88   pngmem.c
     89   pngpread.c
     90   pngread.c
     91   pngrio.c
     92   pngrtran.c
     93   pngrutil.c
     94   pngset.c
     95   pngtrans.c
     96   pngwio.c
     97   pngwrite.c
     98   pngwtran.c
     99   pngwutil.c
    100 )
    101 set(pngtest_sources
    102   pngtest.c
    103 )
    104 set(pngvalid_sources
    105   contrib/libtests/pngvalid.c
    106 )
    107 set(pngstest_sources
    108   contrib/libtests/pngstest.c
    109 )
    110 # SOME NEEDED DEFINITIONS
    111 
    112 if(MSVC)
    113   add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
    114 endif(MSVC)
    115 
    116 if(PNG_DEBUG)
    117   add_definitions(-DPNG_DEBUG)
    118 endif()
    119 
    120 # NOW BUILD OUR TARGET
    121 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
    122 
    123 unset(PNG_LIB_TARGETS)
    124 
    125 if(PNG_SHARED)
    126   add_library(${PNG_LIB_NAME} SHARED ${libpng_sources})
    127   set(PNG_LIB_TARGETS ${PNG_LIB_NAME})
    128   if(MSVC)
    129     # msvc does not append 'lib' - do it here to have consistent name
    130     set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
    131     set_target_properties(${PNG_LIB_NAME} PROPERTIES IMPORT_PREFIX "lib")
    132   endif()
    133   target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
    134 endif()
    135 
    136 if(PNG_STATIC)
    137 # does not work without changing name
    138   set(PNG_LIB_NAME_STATIC ${PNG_LIB_NAME}_static)
    139   add_library(${PNG_LIB_NAME_STATIC} STATIC ${libpng_sources})
    140   list(APPEND PNG_LIB_TARGETS ${PNG_LIB_NAME_STATIC})
    141   if(MSVC)
    142     # msvc does not append 'lib' - do it here to have consistent name
    143     set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
    144   endif()
    145   target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
    146 endif()
    147 
    148 if(NOT PNG_LIB_TARGETS)
    149   message(SEND_ERROR
    150     "No library variant selected to build. "
    151     "Please enable at least one of the following options: PNG_STATIC, PNG_SHARED")
    152 endif()
    153 
    154 if(PNG_SHARED AND WIN32)
    155   set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
    156 endif()
    157 
    158 if(PNG_TESTS AND PNG_SHARED)
    159   # does not work with msvc due to png_lib_ver issue
    160   add_executable(pngtest ${pngtest_sources})
    161   target_link_libraries(pngtest ${PNG_LIB_NAME})
    162   add_test(pngtest ./pngtest ${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png)
    163   #
    164   add_executable(pngvalid ${pngvalid_sources})
    165   target_link_libraries(pngvalid ${PNG_LIB_NAME})
    166   add_test(pngvalid ./pngvalid)
    167   add_executable(pngstest ${pngstest_sources})
    168   target_link_libraries(pngstest ${PNG_LIB_NAME})
    169   add_test(pngstest ./pngstest
    170     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g01.png
    171     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g02.png
    172     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g04.png
    173     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g08.png
    174     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g16.png
    175     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn2c08.png
    176     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn2c16.png
    177     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p01.png
    178     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p02.png
    179     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p04.png
    180     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p08.png
    181     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn4a08.png
    182     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn4a16.png
    183     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn6a08.png
    184     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn6a16.png
    185     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g01.png
    186     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g02.png
    187     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g04.png
    188     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn2c16.png
    189     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn3p08.png
    190     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbgn2c16.png
    191     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbgn3p08.png
    192     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbrn2c08.png
    193     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbwn0g16.png
    194     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbwn3p08.png
    195     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbyn3p08.png
    196     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n0g08.png
    197     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n2c08.png
    198     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n3p08.png
    199     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp1n3p08.png
    200   )
    201 endif()
    202 
    203 # Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
    204 IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
    205   SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
    206 ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
    207 
    208 # Set a variable with CMake code which:
    209 # Creates a symlink from src to dest (if possible) or alternatively
    210 # copies if different.
    211 macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
    212   FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
    213   if(WIN32 AND NOT CYGWIN AND NOT MSYS)
    214     ADD_CUSTOM_COMMAND(
    215         OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}   ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
    216         COMMAND ${CMAKE_COMMAND} -E copy_if_different  "${SRC_FILE}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
    217         COMMAND ${CMAKE_COMMAND} -E copy_if_different  "${SRC_FILE}" ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
    218         DEPENDS ${PNG_LIB_TARGETS}
    219         )
    220     ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
    221   else(WIN32 AND NOT CYGWIN AND NOT MSYS)
    222     get_filename_component(LINK_TARGET "${SRC_FILE}" NAME)
    223     execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
    224     execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
    225   endif(WIN32 AND NOT CYGWIN AND NOT MSYS)
    226 endmacro()
    227 
    228 # libpng is a library so default to 'lib'
    229 if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
    230   set(CMAKE_INSTALL_LIBDIR lib)
    231 endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
    232 
    233 # CREATE PKGCONFIG FILES
    234 # we use the same files like ./configure, so we have to set its vars
    235 # Only do this on Windows for Cygwin - the files don't make much sense outside
    236 # a UNIX look alike
    237 if(NOT WIN32 OR CYGWIN OR MINGW)
    238   set(prefix      ${CMAKE_INSTALL_PREFIX})
    239   set(exec_prefix ${CMAKE_INSTALL_PREFIX})
    240   set(libdir      ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
    241   set(includedir  ${CMAKE_INSTALL_PREFIX}/include)
    242   set(LIBS        "-lz -lm")
    243   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
    244     ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
    245   CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
    246 
    247   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
    248     ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
    249   CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
    250 endif(NOT WIN32 OR CYGWIN OR MINGW)
    251 
    252 # SET UP LINKS
    253 if(PNG_SHARED)
    254   set_target_properties(${PNG_LIB_NAME} PROPERTIES
    255 #   VERSION 16.${PNGLIB_RELEASE}.1.6.10
    256     VERSION 16.${PNGLIB_RELEASE}.0
    257     SOVERSION 16
    258     CLEAN_DIRECT_OUTPUT 1)
    259 endif()
    260 if(PNG_STATIC)
    261   # MSVC doesn't use a different file extension for shared vs. static
    262   # libs.  We are able to change OUTPUT_NAME to remove the _static
    263   # for all other platforms.
    264   if(NOT MSVC)
    265     set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
    266       OUTPUT_NAME ${PNG_LIB_NAME}
    267       CLEAN_DIRECT_OUTPUT 1)
    268   endif()
    269 endif()
    270 
    271 # If CMake > 2.4.x, we set a variable used below to export
    272 # targets to an export file.
    273 # TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
    274 if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)
    275   set(PNG_EXPORT_RULE EXPORT libpng)
    276 elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof
    277   set(PNG_EXPORT_RULE EXPORT libpng)
    278 endif()
    279 
    280 # INSTALL
    281 if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
    282   install(TARGETS ${PNG_LIB_TARGETS}
    283       ${PNG_EXPORT_RULE}
    284       RUNTIME DESTINATION bin
    285       LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    286       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
    287 
    288   if(PNG_SHARED)
    289     # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
    290     if(CYGWIN OR MINGW)
    291        get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
    292        CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
    293        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
    294          DESTINATION ${CMAKE_INSTALL_LIBDIR})
    295     endif(CYGWIN OR MINGW)
    296 
    297     if(NOT WIN32)
    298       get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
    299       CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
    300       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
    301          DESTINATION ${CMAKE_INSTALL_LIBDIR})
    302     endif(NOT WIN32)
    303   endif(PNG_SHARED)
    304 
    305   if(PNG_STATIC)
    306     if(NOT WIN32 OR CYGWIN OR MINGW)
    307       get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME_STATIC} LOCATION_${CMAKE_BUILD_TYPE})
    308       CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
    309       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
    310          DESTINATION ${CMAKE_INSTALL_LIBDIR})
    311     endif(NOT WIN32 OR CYGWIN OR MINGW)
    312  endif()
    313 endif()
    314 
    315 if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
    316   install(FILES ${libpng_public_hdrs}   DESTINATION include)
    317   install(FILES ${libpng_public_hdrs}   DESTINATION include/${PNGLIB_NAME})
    318 endif()
    319 if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
    320   if(NOT WIN32 OR CYGWIN OR MINGW)
    321     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
    322     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
    323             DESTINATION bin)
    324   endif(NOT WIN32 OR CYGWIN OR MINGW)
    325 endif()
    326 
    327 if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
    328   # Install man pages
    329   if(NOT PNG_MAN_DIR)
    330     set(PNG_MAN_DIR "share/man")
    331   endif()
    332   install(FILES libpng.3 libpngpf.3      DESTINATION ${PNG_MAN_DIR}/man3)
    333   install(FILES png.5                    DESTINATION ${PNG_MAN_DIR}/man5)
    334   # Install pkg-config files
    335   if(NOT WIN32 OR CYGWIN OR MINGW)
    336     install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
    337             DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
    338     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
    339             DESTINATION bin)
    340     install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
    341             DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
    342     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
    343             DESTINATION bin)
    344   endif(NOT WIN32 OR CYGWIN OR MINGW)
    345 endif()
    346 
    347 # On versions of CMake that support it, create an export file CMake
    348 # users can include() to import our targets
    349 if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
    350   install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
    351 endif()
    352 
    353 # what's with libpng-$VER%.txt and all the extra files?
    354 
    355 # UNINSTALL
    356 # do we need this?
    357 
    358 # DIST
    359 # do we need this?
    360 
    361 # to create msvc import lib for mingw compiled shared lib
    362 # pexports libpng.dll > libpng.def
    363 # lib /def:libpng.def /machine:x86
    364 
    365