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 9cmake_minimum_required(VERSION 2.4.4) 10set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) 11 12set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo") 13 14project(libpng C) 15enable_testing() 16 17set(PNGLIB_MAJOR 1) 18set(PNGLIB_MINOR 6) 19set(PNGLIB_RELEASE 10) 20set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR}) 21set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE}) 22 23# needed packages 24find_package(ZLIB REQUIRED) 25include_directories(${ZLIB_INCLUDE_DIR}) 26 27if(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() 36else() 37 # not needed on windows 38 set(M_LIBRARY "") 39endif() 40 41# COMMAND LINE OPTIONS 42if(DEFINED PNG_SHARED) 43 option(PNG_SHARED "Build shared lib" ${PNG_SHARED}) 44else() 45 option(PNG_SHARED "Build shared lib" ON) 46endif() 47if(DEFINED PNG_STATIC) 48 option(PNG_STATIC "Build static lib" ${PNG_STATIC}) 49else() 50 option(PNG_STATIC "Build static lib" ON) 51endif() 52 53option(PNG_TESTS "Build libpng tests" YES) 54 55# Many more configuration options could be added here 56option(PNG_DEBUG "Build with debug output" NO) 57option(PNGARG "Disable ANSI-C prototypes" NO) 58 59# SET LIBNAME 60set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR}) 61 62# to distinguish between debug and release lib 63set(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.) 69configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt 70 ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h) 71include_directories(${CMAKE_CURRENT_BINARY_DIR}) 72 73# OUR SOURCES 74set(libpng_public_hdrs 75 png.h 76 pngconf.h 77 ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h 78) 79set(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) 101set(pngtest_sources 102 pngtest.c 103) 104set(pngvalid_sources 105 contrib/libtests/pngvalid.c 106) 107set(pngstest_sources 108 contrib/libtests/pngstest.c 109) 110# SOME NEEDED DEFINITIONS 111 112if(MSVC) 113 add_definitions(-D_CRT_SECURE_NO_DEPRECATE) 114endif(MSVC) 115 116if(PNG_DEBUG) 117 add_definitions(-DPNG_DEBUG) 118endif() 119 120# NOW BUILD OUR TARGET 121include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR}) 122 123unset(PNG_LIB_TARGETS) 124 125if(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}) 134endif() 135 136if(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}) 146endif() 147 148if(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") 152endif() 153 154if(PNG_SHARED AND WIN32) 155 set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL) 156endif() 157 158if(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 ) 201endif() 202 203# Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set 204IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) 205 SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib") 206ENDIF(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. 211macro(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) 226endmacro() 227 228# libpng is a library so default to 'lib' 229if(NOT DEFINED CMAKE_INSTALL_LIBDIR) 230 set(CMAKE_INSTALL_LIBDIR lib) 231endif(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 237if(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) 250endif(NOT WIN32 OR CYGWIN OR MINGW) 251 252# SET UP LINKS 253if(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) 259endif() 260if(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() 269endif() 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 274if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4) 275 set(PNG_EXPORT_RULE EXPORT libpng) 276elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof 277 set(PNG_EXPORT_RULE EXPORT libpng) 278endif() 279 280# INSTALL 281if(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() 313endif() 314 315if(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}) 318endif() 319if(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) 325endif() 326 327if(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) 345endif() 346 347# On versions of CMake that support it, create an export file CMake 348# users can include() to import our targets 349if(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) 351endif() 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