CMakeLists.txt 11.4 KB
Newer Older
1 2 3 4 5 6 7 8
# CMakeLists.txt

# Copyright (C) 2007-2011 Glenn Randers-Pehrson

# This code is released under the libpng license.
# For conditions of distribution and use, see the disclaimer
# and license in png.h

9
cmake_minimum_required(VERSION 2.4.4)
10 11
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)

12
if(UNIX AND NOT DEFINED CMAKE_BUILD_TYPE)
13 14
  if(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION EQUAL 4)
    # workaround CMake 2.4.x bug
15 16 17 18 19 20 21
    set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
        "Choose the type of build, options are:
           None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used)
           Debug
           Release
           RelWithDebInfo
           MinSizeRel.")
22 23 24 25 26 27 28 29 30
  else()
    set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
        "Choose the type of build, options are:
           None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used)
           Debug
           Release
           RelWithDebInfo
           MinSizeRel.")
  endif()
31 32
endif()

33
project(libpng C)
34
enable_testing()
35

36
set(PNGLIB_MAJOR 1)
37 38
set(PNGLIB_MINOR 6)
set(PNGLIB_RELEASE 0)
39 40
set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
41 42 43

# needed packages
find_package(ZLIB REQUIRED)
44 45
include_directories(${ZLIB_INCLUDE_DIR})

46
if(NOT WIN32)
47 48 49 50 51 52 53 54
  find_library(M_LIBRARY
    NAMES m
    PATHS /usr/lib /usr/local/lib
  )
  if(NOT M_LIBRARY)
    message(STATUS
      "math library 'libm' not found - floating point support disabled")
  endif()
55
else()
56 57
  # not needed on windows
  set(M_LIBRARY "")
58
endif()
59

60
# COMMAND LINE OPTIONS
61 62 63 64 65 66 67 68 69 70 71
if(DEFINED PNG_SHARED)
  option(PNG_SHARED "Build shared lib" ${PNG_SHARED})
else()
  option(PNG_SHARED "Build shared lib" ON)
endif()
if(DEFINED PNG_STATIC)
  option(PNG_STATIC "Build static lib" ${PNG_STATIC})
else()
  option(PNG_STATIC "Build static lib" ON)
endif()

72
option(PNG_TESTS  "Build libpng tests" YES)
73

74
# Many more configuration options could be added here
75
option(PNG_DEBUG         "Build with debug output" NO)
76
option(PNGARG            "Disable ANSI-C prototypes" NO)
77

78
# SET LIBNAME
79
set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
80 81 82 83

# to distinguish between debug and release lib
set(CMAKE_DEBUG_POSTFIX "d")

84
# Use the prebuilt pnglibconf.h file from the scripts folder
85 86 87
# TODO: fix this by building with awk; without this no cmake build can be
# configured directly (to do so indirectly use your local awk to build a
# pnglibconf.h in the build directory.)
88 89 90
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
               ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
91

92
# OUR SOURCES
93
set(libpng_public_hdrs
94 95
  png.h
  pngconf.h
96 97 98 99
  ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h
)
set(libpng_sources
  ${libpng_public_hdrs}
100 101
  pngdebug.h
  pnginfo.h
102
  pngpriv.h
103
  pngstruct.h
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
  png.c
  pngerror.c
  pngget.c
  pngmem.c
  pngpread.c
  pngread.c
  pngrio.c
  pngrtran.c
  pngrutil.c
  pngset.c
  pngtrans.c
  pngwio.c
  pngwrite.c
  pngwtran.c
  pngwutil.c
119 120
)
set(pngtest_sources
121
  pngtest.c
122
)
123 124 125
set(pngvalid_sources
  pngvalid.c
)
126
# SOME NEEDED DEFINITIONS
127

128 129
add_definitions(-DPNG_CONFIGURE_LIBPNG)

130
if(MSVC)
131
  add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
132 133
endif(MSVC)

134
if(PNG_DEBUG)
135
  add_definitions(-DPNG_DEBUG)
136
endif()
137 138

# NOW BUILD OUR TARGET
139
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
140 141

if(PNG_SHARED)
142 143 144 145
  add_library(${PNG_LIB_NAME} SHARED ${libpng_sources})
  if(MSVC)
    # msvc does not append 'lib' - do it here to have consistent name
    set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
146
    set_target_properties(${PNG_LIB_NAME} PROPERTIES IMPORT_PREFIX "lib")
147 148
  endif()
  target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
149 150
endif()

151 152
if(PNG_STATIC)
# does not work without changing name
153 154 155 156 157 158
  set(PNG_LIB_NAME_STATIC ${PNG_LIB_NAME}_static)
  add_library(${PNG_LIB_NAME_STATIC} STATIC ${libpng_sources})
  if(MSVC)
    # msvc does not append 'lib' - do it here to have consistent name
    set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
  endif()
159
  target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
160 161
endif()

162
if(PNG_SHARED AND WIN32)
163
  set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
164
endif()
165

166
if(PNG_TESTS AND PNG_SHARED)
167 168 169
  # does not work with msvc due to png_lib_ver issue
  add_executable(pngtest ${pngtest_sources})
  target_link_libraries(pngtest ${PNG_LIB_NAME})
170
  add_test(pngtest ./pngtest ${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png)
171 172 173 174
  #
  add_executable(pngvalid ${pngvalid_sources})
  target_link_libraries(pngvalid ${PNG_LIB_NAME})
  add_test(pngvalid ./pngvalid)
175
endif()
176

177 178
# Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
179 180 181 182 183
  IF(WIN32)
    SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "bin")
  ELSE(WIN32)
    SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
  ENDIF(WIN32)
184 185
ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)

186 187 188
# Set a variable with CMake code which:
# Creates a symlink from src to dest (if possible) or alternatively
# copies if different.
189
macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
190
  FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
191
  if(WIN32 AND NOT CYGWIN AND NOT MINGW)
192 193 194 195 196 197 198
    ADD_CUSTOM_COMMAND(
        OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}   ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
        COMMAND ${CMAKE_COMMAND} -E copy        ${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
        COMMAND ${CMAKE_COMMAND} -E copy        ${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
        DEPENDS ${PNG_LIB_NAME} ${PNG_LIB_NAME_STATIC}
        )
    ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
199
  else(WIN32 AND NOT CYGWIN AND NOT MINGW)
200 201
    execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${SRC_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
    execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${SRC_FILE} ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
202
  endif(WIN32 AND NOT CYGWIN AND NOT MINGW)
203
endmacro()
204

205
# libpng is a library so default to 'lib'
206
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
207
  set(CMAKE_INSTALL_LIBDIR lib)
208
endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
209 210 211 212 213

# CREATE PKGCONFIG FILES
# we use the same files like ./configure, so we have to set its vars
# Only do this on Windows for Cygwin - the files don't make much sense outside
# a UNIX look alike
214
if(NOT WIN32 OR CYGWIN OR MINGW) 
215 216
set(prefix      ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
217
set(libdir      ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
218
set(includedir  ${CMAKE_INSTALL_PREFIX}/include)
219 220
set(LIBS        "-lz -lm")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
221
  ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
222
CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
223 224

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
225
  ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
226
CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
227
endif(NOT WIN32 OR CYGWIN OR MINGW)
228 229

# SET UP LINKS
230 231
if(PNG_SHARED)
  set_target_properties(${PNG_LIB_NAME} PROPERTIES
232
#   VERSION 15.${PNGLIB_RELEASE}.1.6.0alpha01
233 234
    VERSION 15.${PNGLIB_RELEASE}.0
    SOVERSION 15
235
    CLEAN_DIRECT_OUTPUT 1)
236
endif()
237
if(PNG_STATIC)
238 239 240 241
  # MSVC doesn't use a different file extension for shared vs. static
  # libs.  We are able to change OUTPUT_NAME to remove the _static
  # for all other platforms.
  if(NOT MSVC)
242
    set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
243 244
      OUTPUT_NAME ${PNG_LIB_NAME}
      CLEAN_DIRECT_OUTPUT 1)
245 246 247
  endif()
endif()

248 249 250 251 252 253 254 255 256
# If CMake > 2.4.x, we set a variable used below to export
# targets to an export file.
# TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)
  set(PNG_EXPORT_RULE EXPORT libpng)
elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof
  set(PNG_EXPORT_RULE EXPORT libpng)
endif()

257 258
# INSTALL
if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
259 260
  if(PNG_SHARED)
    install(TARGETS ${PNG_LIB_NAME}
261 262 263 264 265
        ${PNG_EXPORT_RULE}
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})

266
    # Create a symlink for libpng.dll.a => libpng15.dll.a on Cygwin
267
    if(CYGWIN OR MINGW)
268 269 270 271 272
       get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
       get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
       CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
         DESTINATION ${CMAKE_INSTALL_LIBDIR})
273
    endif(CYGWIN OR MINGW)
274 275

    if(NOT WIN32)
276 277 278 279 280
      get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
      get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
      CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
      install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
         DESTINATION ${CMAKE_INSTALL_LIBDIR})
281 282
    endif(NOT WIN32)
  endif(PNG_SHARED)
283

284 285
  if(PNG_STATIC)
    install(TARGETS ${PNG_LIB_NAME_STATIC}
286
        ${PNG_EXPORT_RULE}
287 288
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
289
    if(NOT WIN32 OR CYGWIN OR MINGW)
290 291 292 293 294
      get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME_STATIC} LOCATION_${CMAKE_BUILD_TYPE})
      get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
      CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
      install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
         DESTINATION ${CMAKE_INSTALL_LIBDIR})
295
    endif(NOT WIN32 OR CYGWIN OR MINGW)
296
 endif()
297 298 299
endif()

if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
300 301
  install(FILES ${libpng_public_hdrs}   DESTINATION include)
  install(FILES ${libpng_public_hdrs}   DESTINATION include/${PNGLIB_NAME})
302 303
endif()
if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
304 305 306
  install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
  install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
          DESTINATION bin)
307 308
endif()
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
309
  # Install man pages
310 311 312 313 314
  if(NOT PNG_MAN_DIR)
    set(PNG_MAN_DIR "share/man")
  endif()
  install(FILES libpng.3 libpngpf.3      DESTINATION ${PNG_MAN_DIR}/man3)
  install(FILES png.5                    DESTINATION ${PNG_MAN_DIR}/man5)
315 316
  # Install pkg-config files
  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
317
          DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
318
  install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
319 320
          DESTINATION bin)
  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
321
          DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
322
  install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
323
          DESTINATION bin)
324
endif()
325

326 327 328 329 330 331
# On versions of CMake that support it, create an export file CMake
# users can include() to import our targets
if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
  install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
endif()

332
# what's with libpng-$VER%.txt and all the extra files?
333

334
# UNINSTALL
335 336
# do we need this?

337
# DIST
338 339 340 341 342
# do we need this?

# to create msvc import lib for mingw compiled shared lib
# pexports libpng.dll > libpng.def
# lib /def:libpng.def /machine:x86
343