merged libpng 1.5.7 to trunk
[wxWidgets.git] / src / png / CMakeLists.txt
1 # CMakeLists.txt
2
3 # Copyright (C) 2007-2011 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 if(UNIX AND NOT DEFINED CMAKE_BUILD_TYPE)
13   if(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION EQUAL 4)
14     # workaround CMake 2.4.x bug
15     set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
16         "Choose the type of build, options are:
17            None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used)
18            Debug
19            Release
20            RelWithDebInfo
21            MinSizeRel.")
22   else()
23     set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
24         "Choose the type of build, options are:
25            None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used)
26            Debug
27            Release
28            RelWithDebInfo
29            MinSizeRel.")
30   endif()
31 endif()
32
33 project(libpng C)
34 enable_testing()
35
36 set(PNGLIB_MAJOR 1)
37 set(PNGLIB_MINOR 5)
38 set(PNGLIB_RELEASE 7)
39 set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
40 set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
41
42 # needed packages
43 find_package(ZLIB REQUIRED)
44 include_directories(${ZLIB_INCLUDE_DIR})
45
46 if(NOT WIN32)
47   find_library(M_LIBRARY
48     NAMES m
49     PATHS /usr/lib /usr/local/lib
50   )
51   if(NOT M_LIBRARY)
52     message(STATUS
53       "math library 'libm' not found - floating point support disabled")
54   endif()
55 else()
56   # not needed on windows
57   set(M_LIBRARY "")
58 endif()
59
60 # COMMAND LINE OPTIONS
61 if(DEFINED PNG_SHARED)
62   option(PNG_SHARED "Build shared lib" ${PNG_SHARED})
63 else()
64   option(PNG_SHARED "Build shared lib" ON)
65 endif()
66 if(DEFINED PNG_STATIC)
67   option(PNG_STATIC "Build static lib" ${PNG_STATIC})
68 else()
69   option(PNG_STATIC "Build static lib" ON)
70 endif()
71
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 # to distinguish between debug and release lib
82 set(CMAKE_DEBUG_POSTFIX "d")
83
84 # Use the prebuilt pnglibconf.h file from the scripts folder
85 # TODO: fix this by building with awk; without this no cmake build can be
86 # configured directly (to do so indirectly use your local awk to build a
87 # pnglibconf.h in the build directory.)
88 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
89                ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
90 include_directories(${CMAKE_CURRENT_BINARY_DIR})
91
92 # OUR SOURCES
93 set(libpng_public_hdrs
94   png.h
95   pngconf.h
96   ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h
97 )
98 set(libpng_sources
99   ${libpng_public_hdrs}
100   pngdebug.h
101   pnginfo.h
102   pngpriv.h
103   pngstruct.h
104   png.c
105   pngerror.c
106   pngget.c
107   pngmem.c
108   pngpread.c
109   pngread.c
110   pngrio.c
111   pngrtran.c
112   pngrutil.c
113   pngset.c
114   pngtrans.c
115   pngwio.c
116   pngwrite.c
117   pngwtran.c
118   pngwutil.c
119 )
120 set(pngtest_sources
121   pngtest.c
122 )
123 set(pngvalid_sources
124   contrib/libtests/pngvalid.c
125 )
126 # SOME NEEDED DEFINITIONS
127
128 add_definitions(-DPNG_CONFIGURE_LIBPNG)
129
130 if(MSVC)
131   add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
132 endif(MSVC)
133
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   add_library(${PNG_LIB_NAME} SHARED ${libpng_sources})
143   if(MSVC)
144     # msvc does not append 'lib' - do it here to have consistent name
145     set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
146     set_target_properties(${PNG_LIB_NAME} PROPERTIES IMPORT_PREFIX "lib")
147   endif()
148   target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
149 endif()
150
151 if(PNG_STATIC)
152 # does not work without changing name
153   set(PNG_LIB_NAME_STATIC ${PNG_LIB_NAME}_static)
154   add_library(${PNG_LIB_NAME_STATIC} STATIC ${libpng_sources})
155   if(MSVC)
156     # msvc does not append 'lib' - do it here to have consistent name
157     set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
158   endif()
159   target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
160 endif()
161
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   # does not work with msvc due to png_lib_ver issue
168   add_executable(pngtest ${pngtest_sources})
169   target_link_libraries(pngtest ${PNG_LIB_NAME})
170   add_test(pngtest ./pngtest ${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png)
171   #
172   add_executable(pngvalid ${pngvalid_sources})
173   target_link_libraries(pngvalid ${PNG_LIB_NAME})
174   add_test(pngvalid ./pngvalid)
175 endif()
176
177 # Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
178 IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
179   IF(WIN32)
180     SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "bin")
181   ELSE(WIN32)
182     SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
183   ENDIF(WIN32)
184 ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
185
186 # Set a variable with CMake code which:
187 # Creates a symlink from src to dest (if possible) or alternatively
188 # 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     ADD_CUSTOM_COMMAND(
193         OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}   ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
194         COMMAND ${CMAKE_COMMAND} -E copy        ${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
195         COMMAND ${CMAKE_COMMAND} -E copy        ${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
196         DEPENDS ${PNG_LIB_NAME} ${PNG_LIB_NAME_STATIC}
197         )
198     ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
199   else(WIN32 AND NOT CYGWIN AND NOT MINGW)
200     execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${SRC_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
201     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 # CREATE PKGCONFIG FILES
211 # we use the same files like ./configure, so we have to set its vars
212 # Only do this on Windows for Cygwin - the files don't make much sense outside
213 # a UNIX look alike
214 if(NOT WIN32 OR CYGWIN OR MINGW) 
215 set(prefix      ${CMAKE_INSTALL_PREFIX})
216 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
217 set(libdir      ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
218 set(includedir  ${CMAKE_INSTALL_PREFIX}/include)
219 set(LIBS        "-lz -lm")
220 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 if(PNG_SHARED)
231   set_target_properties(${PNG_LIB_NAME} PROPERTIES
232 #   VERSION 15.${PNGLIB_RELEASE}.1.5.7
233     VERSION 15.${PNGLIB_RELEASE}.0
234     SOVERSION 15
235     CLEAN_DIRECT_OUTPUT 1)
236 endif()
237 if(PNG_STATIC)
238   # MSVC doesn't use a different file extension for shared vs. static
239   # libs.  We are able to change OUTPUT_NAME to remove the _static
240   # for all other platforms.
241   if(NOT MSVC)
242     set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
243       OUTPUT_NAME ${PNG_LIB_NAME}
244       CLEAN_DIRECT_OUTPUT 1)
245   endif()
246 endif()
247
248 # If CMake > 2.4.x, we set a variable used below to export
249 # targets to an export file.
250 # TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
251 if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)
252   set(PNG_EXPORT_RULE EXPORT libpng)
253 elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof
254   set(PNG_EXPORT_RULE EXPORT libpng)
255 endif()
256
257 # INSTALL
258 if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
259   if(PNG_SHARED)
260     install(TARGETS ${PNG_LIB_NAME}
261         ${PNG_EXPORT_RULE}
262         RUNTIME DESTINATION bin
263         LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
264         ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
265
266     # Create a symlink for libpng.dll.a => libpng15.dll.a on Cygwin
267     if(CYGWIN OR MINGW)
268        get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
269        get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
270        CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
271        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
272          DESTINATION ${CMAKE_INSTALL_LIBDIR})
273     endif(CYGWIN OR MINGW)
274
275     if(NOT WIN32)
276       get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
277       get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
278       CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
279       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
280          DESTINATION ${CMAKE_INSTALL_LIBDIR})
281     endif(NOT WIN32)
282   endif(PNG_SHARED)
283
284   if(PNG_STATIC)
285     install(TARGETS ${PNG_LIB_NAME_STATIC}
286         ${PNG_EXPORT_RULE}
287         LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
288         ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
289     if(NOT WIN32 OR CYGWIN OR MINGW)
290       get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME_STATIC} LOCATION_${CMAKE_BUILD_TYPE})
291       get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
292       CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
293       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
294          DESTINATION ${CMAKE_INSTALL_LIBDIR})
295     endif(NOT WIN32 OR CYGWIN OR MINGW)
296  endif()
297 endif()
298
299 if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
300   install(FILES ${libpng_public_hdrs}   DESTINATION include)
301   install(FILES ${libpng_public_hdrs}   DESTINATION include/${PNGLIB_NAME})
302 endif()
303 if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
304   install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
305   install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
306           DESTINATION bin)
307 endif()
308 if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
309   # Install man pages
310   if(NOT PNG_MAN_DIR)
311     set(PNG_MAN_DIR "share/man")
312   endif()
313   install(FILES libpng.3 libpngpf.3      DESTINATION ${PNG_MAN_DIR}/man3)
314   install(FILES png.5                    DESTINATION ${PNG_MAN_DIR}/man5)
315   # Install pkg-config files
316   install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
317           DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
318   install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
319           DESTINATION bin)
320   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 # On versions of CMake that support it, create an export file CMake
327 # users can include() to import our targets
328 if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
329   install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
330 endif()
331
332 # what's with libpng-$VER%.txt and all the extra files?
333
334 # UNINSTALL
335 # do we need this?
336
337 # DIST
338 # do we need this?
339
340 # to create msvc import lib for mingw compiled shared lib
341 # pexports libpng.dll > libpng.def
342 # lib /def:libpng.def /machine:x86
343