CMakeLists.txt 11.2 KB
Newer Older
1
cmake_minimum_required(VERSION 2.4.4)
2 3
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)

4
if(UNIX AND NOT DEFINED CMAKE_BUILD_TYPE)
5 6
  if(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION EQUAL 4)
    # workaround CMake 2.4.x bug
7 8 9 10 11 12 13
    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.")
14 15 16 17 18 19 20 21 22
  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()
23 24
endif()

25
project(libpng C)
26
enable_testing()
27

28
# Copyright (C) 2007-2010 Glenn Randers-Pehrson
29

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

34
set(PNGLIB_MAJOR 1)
35
set(PNGLIB_MINOR 5)
36 37 38
set(PNGLIB_RELEASE 0)
set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
39 40 41

# needed packages
find_package(ZLIB REQUIRED)
42 43
include_directories(${ZLIB_INCLUDE_DIR})

44
if(NOT WIN32)
45 46 47 48 49 50 51 52
  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()
53
else()
54 55
  # not needed on windows
  set(M_LIBRARY "")
56
endif()
57

58
# COMMAND LINE OPTIONS
59 60 61 62 63 64 65 66 67 68 69
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()

70 71
if(MINGW)
  option(PNG_TESTS  "Build pngtest" NO)
72
else()
73
  option(PNG_TESTS  "Build pngtest" YES)
74
endif()
75

76 77
option(PNG_NO_CONSOLE_IO "FIXME" YES)
option(PNG_NO_STDIO      "FIXME" YES)
78
option(PNG_DEBUG         "Build with debug output" NO)
79
option(PNGARG            "FIXME" YES)
80 81 82
#TODO:
# PNG_CONSOLE_IO_SUPPORTED

83
# maybe needs improving, but currently I don't know when we can enable what :)
84 85
set(png_asm_tmp "OFF")
if(NOT WIN32)
86 87 88 89 90
  find_program(uname_executable NAMES uname PATHS /bin /usr/bin /usr/local/bin)
  if(uname_executable)
    exec_program(${uname_executable}
                 ARGS --machine OUTPUT_VARIABLE uname_output)
    if("uname_output" MATCHES "^.*i[1-9]86.*$")
91
      set(png_asm_tmp "ON")
92
    else("uname_output" MATCHES "^.*i[1-9]86.*$")
93
      set(png_asm_tmp "OFF")
94 95
    endif("uname_output" MATCHES "^.*i[1-9]86.*$")
  endif(uname_executable)
96
else()
97 98 99 100 101
  # this env var is normally only set on win64
  set(TEXT "ProgramFiles(x86)")
  if("$ENV{${TEXT}}" STREQUAL "")
    set(png_asm_tmp "ON")
  endif("$ENV{${TEXT}}" STREQUAL "")
102
endif()
103

104
# SET LIBNAME
105
set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
106 107 108 109

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

110 111 112 113
# Use the prebuilt pnglibconf.h file from the scripts folder
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
               ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
114

115
# OUR SOURCES
116
set(libpng_public_hdrs
117 118
  png.h
  pngconf.h
119 120 121 122
  ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h
)
set(libpng_sources
  ${libpng_public_hdrs}
123 124
  pngdebug.h
  pnginfo.h
125
  pngpriv.h
126
  pngstruct.h
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
  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
142 143
)
set(pngtest_sources
144
  pngtest.c
145
)
146
# SOME NEEDED DEFINITIONS
147

148 149 150 151 152 153
add_definitions(-DPNG_CONFIGURE_LIBPNG)

if(_AIX)
  add_definitions(-D_ALL_SOURCE)
endif(_AIX)

154
if(MSVC)
155
  add_definitions(-DPNG_NO_MODULEDEF -D_CRT_SECURE_NO_DEPRECATE)
156 157
endif(MSVC)

158
if(PNG_SHARED OR  NOT MSVC)
159 160
  #if building msvc static this has NOT to be defined
  add_definitions(-DZLIB_DLL)
161
endif()
162

163

164
if(PNG_CONSOLE_IO_SUPPORTED)
165
  add_definitions(-DPNG_CONSOLE_IO_SUPPORTED)
166
endif()
167 168

if(PNG_NO_CONSOLE_IO)
169
  add_definitions(-DPNG_NO_CONSOLE_IO)
170
endif()
171 172

if(PNG_NO_STDIO)
173
  add_definitions(-DPNG_NO_STDIO)
174
endif()
175 176

if(PNG_DEBUG)
177
  add_definitions(-DPNG_DEBUG)
178
endif()
179

180
if(NOT M_LIBRARY AND NOT WIN32)
181
  add_definitions(-DPNG_NO_FLOATING_POINT_SUPPORTED)
182
endif()
183 184

# NOW BUILD OUR TARGET
185
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
186 187

if(PNG_SHARED)
188 189 190 191
  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")
192
    set_target_properties(${PNG_LIB_NAME} PROPERTIES IMPORT_PREFIX "lib")
193 194
  endif()
  target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
195 196
endif()

197 198
if(PNG_STATIC)
# does not work without changing name
199 200 201 202 203 204
  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()
205
  target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
206 207
endif()

208 209

if(PNG_SHARED AND WIN32)
210
  set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
211
endif()
212

213
if(PNG_TESTS AND PNG_SHARED)
214 215 216
  # does not work with msvc due to png_lib_ver issue
  add_executable(pngtest ${pngtest_sources})
  target_link_libraries(pngtest ${PNG_LIB_NAME})
217
  add_test(pngtest ./pngtest ${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png)
218
endif()
219

220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
#
# Set a variable with CMake code which:
# Creates a symlink from src to dest (if possible) or alternatively
# copies if different.
macro(_png_generate_symlink_code CODE SRC DEST)
  if(WIN32 AND NOT CYGWIN)
    set(_png_gsc_message "Copying ${SRC} to ${DEST} if needed")
    set(_png_gsc_operation "copy_if_different")
  else()
    set(_png_gsc_message "Symlinking ${SRC} to ${DEST}")
    set(_png_gsc_operation "create_symlink")
  endif()

  set(${CODE} "
    message(STATUS \"${_png_gsc_message}\")
    execute_process(COMMAND \${CMAKE_COMMAND} -E ${_png_gsc_operation}
      \"${SRC}\" \"${DEST}\")
    ")
endmacro()
239

240 241
# CREATE PKGCONFIG FILES
# we use the same files like ./configure, so we have to set its vars
242 243 244
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
  set(CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib)
endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
245 246
set(prefix      ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
247
set(libdir      ${CMAKE_INSTALL_LIBDIR})
248
set(includedir  ${CMAKE_INSTALL_PREFIX}/include)
249 250
set(LIBS        "-lz -lm")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
251
  ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
252 253 254 255
_png_generate_symlink_code(PNG_PC_INSTALL_CODE ${PNGLIB_NAME}.pc libpng.pc)
install(CODE ${PNG_PC_INSTALL_CODE})

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
256
  ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
257 258
_png_generate_symlink_code(PNG_CONFIG_INSTALL_CODE ${PNGLIB_NAME}-config
  libpng-config)
259
install(CODE ${PNG_CONFIG_INSTALL_CODE})
260 261

# SET UP LINKS
262 263
if(PNG_SHARED)
  set_target_properties(${PNG_LIB_NAME} PROPERTIES
264
#   VERSION 15.${PNGLIB_RELEASE}.1.5.0rc03
265 266
    VERSION 15.${PNGLIB_RELEASE}.0
    SOVERSION 15
267
    CLEAN_DIRECT_OUTPUT 1)
268
endif()
269
if(PNG_STATIC)
270 271 272 273
  # 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)
274
    set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
275 276
      OUTPUT_NAME ${PNG_LIB_NAME}
      CLEAN_DIRECT_OUTPUT 1)
277 278 279
  endif()
endif()

280 281 282 283 284 285 286 287 288
# 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()

289 290
# INSTALL
if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
291 292
  if(PNG_SHARED)
    install(TARGETS ${PNG_LIB_NAME}
293 294 295 296 297 298 299 300 301 302 303
        ${PNG_EXPORT_RULE}
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})

    # Create a symlink for libpng.dll.a => libpng14.dll.a on Cygwin
    if(CYGWIN)
      _png_generate_symlink_code(PNG_SHARED_IMPLIB_INSTALL_CODE
        ${PNGLIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}
        libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
      install(CODE ${PNG_SHARED_IMPLIB_INSTALL_CODE})
304 305 306
      install(FILES
        ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
        DESTINATION ${CMAKE_INSTALL_LIBDIR})
307 308 309 310 311 312 313
    endif()

    if(NOT WIN32)
      _png_generate_symlink_code(PNG_SHARED_INSTALL_CODE
            ${PNGLIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}
            libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
      install(CODE ${PNG_SHARED_INSTALL_CODE})
314 315 316 317
      install(FILES
        ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
        DESTINATION ${CMAKE_INSTALL_LIBDIR})
    endif()
318
  endif()
319

320 321
  if(PNG_STATIC)
    install(TARGETS ${PNG_LIB_NAME_STATIC}
322 323 324 325 326 327 328 329
        ${PNG_EXPORT_RULE}
            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
    if(NOT WIN32 OR CYGWIN)
      _png_generate_symlink_code(PNG_STATIC_INSTALL_CODE
            ${PNGLIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}
            libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
      install(CODE ${PNG_STATIC_INSTALL_CODE})
330 331 332
      install(FILES
        ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
        DESTINATION ${CMAKE_INSTALL_LIBDIR})
333
    endif()
334
  endif()
335 336 337
endif()

if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
338 339
  install(FILES ${libpng_public_hdrs}   DESTINATION include)
  install(FILES ${libpng_public_hdrs}   DESTINATION include/${PNGLIB_NAME})
340 341
endif()
if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
342 343 344
  install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
  install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
          DESTINATION bin)
345 346
endif()
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
347
  # Install man pages
348 349 350 351 352
  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)
353 354
  # Install pkg-config files
  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
355
          DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
356
  install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
357 358
          DESTINATION bin)
  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
359
          DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
360
  install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
361
          DESTINATION bin)
362
endif()
363

364 365 366 367 368 369
# 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()

370
# what's with libpng-manual.txt and all the extra files?
371 372


373
# UNINSTALL
374 375 376
# do we need this?


377
# DIST
378 379 380 381 382
# 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
383