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