CMakeLists.txt 11.9 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-2011 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
set(PNGLIB_RELEASE 5)
37 38
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
add_definitions(-DPNG_CONFIGURE_LIBPNG)

150
if(MSVC)
151
  add_definitions(-DPNG_NO_MODULEDEF -D_CRT_SECURE_NO_DEPRECATE)
152 153
endif(MSVC)

154
if(PNG_SHARED OR  NOT MSVC)
155 156
  #if building msvc static this has NOT to be defined
  add_definitions(-DZLIB_DLL)
157
endif()
158

159

160
if(PNG_CONSOLE_IO_SUPPORTED)
161
  add_definitions(-DPNG_CONSOLE_IO_SUPPORTED)
162
endif()
163 164

if(PNG_NO_CONSOLE_IO)
165
  add_definitions(-DPNG_NO_CONSOLE_IO)
166
endif()
167 168

if(PNG_NO_STDIO)
169
  add_definitions(-DPNG_NO_STDIO)
170
endif()
171 172

if(PNG_DEBUG)
173
  add_definitions(-DPNG_DEBUG)
174
endif()
175

176
if(NOT M_LIBRARY AND NOT WIN32)
177
  add_definitions(-DPNG_NO_FLOATING_POINT_SUPPORTED)
178
endif()
179 180

# NOW BUILD OUR TARGET
181
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
182 183

if(PNG_SHARED)
184 185 186 187
  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")
188
    set_target_properties(${PNG_LIB_NAME} PROPERTIES IMPORT_PREFIX "lib")
189 190
  endif()
  target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
191 192
endif()

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

204 205

if(PNG_SHARED AND WIN32)
206
  set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
207
endif()
208

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

216 217 218 219 220 221 222 223 224
# Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
	IF(WIN32)
		SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "bin")
	ELSE(WIN32)
		SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
	ENDIF(WIN32)
ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)

225 226 227 228
#
# Set a variable with CMake code which:
# Creates a symlink from src to dest (if possible) or alternatively
# copies if different.
229 230 231 232 233 234 235 236 237 238 239 240 241 242
macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
	FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
	if(WIN32 AND NOT CYGWIN)
		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})
	else(WIN32 AND NOT CYGWIN)
		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})
	endif(WIN32 AND NOT CYGWIN)
243
endmacro()
244

245

246 247
# CREATE PKGCONFIG FILES
# we use the same files like ./configure, so we have to set its vars
248
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
249
  set(CMAKE_INSTALL_LIBDIR lib)
250
endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
251 252
set(prefix      ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
253
set(libdir      ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
254
set(includedir  ${CMAKE_INSTALL_PREFIX}/include)
255 256
set(LIBS        "-lz -lm")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
257
  ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
258
CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
259 260

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
261
  ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
262
CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
263 264

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

283 284 285 286 287 288 289 290 291
# 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()

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

301
    # Create a symlink for libpng.dll.a => libpng15.dll.a on Cygwin
302 303 304 305 306 307 308
	 if(CYGWIN)
		 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})
	 endif(CYGWIN)
309 310

    if(NOT WIN32)
311 312 313 314 315 316 317
		 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})
    endif(NOT WIN32)
  endif(PNG_SHARED)
318

319 320
  if(PNG_STATIC)
    install(TARGETS ${PNG_LIB_NAME_STATIC}
321 322 323 324
        ${PNG_EXPORT_RULE}
            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
    if(NOT WIN32 OR CYGWIN)
325 326 327 328 329 330 331
		 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})
	 endif(NOT WIN32 OR CYGWIN)
 endif()
332 333 334
endif()

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

361 362 363 364 365 366
# 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()

367
# what's with libpng-$VER%.txt and all the extra files?
368 369


370
# UNINSTALL
371 372 373
# do we need this?


374
# DIST
375 376 377 378 379
# 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
380