]> git.saurik.com Git - wxWidgets.git/blob - src/png/CMakeLists.txt
Fix wxHtmlHelpData::SetTempDir() to behave correctly without trailing slash.
[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 6)
38 set(PNGLIB_RELEASE 2)
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 set(pngstest_sources
127 contrib/libtests/pngstest.c
128 )
129 # SOME NEEDED DEFINITIONS
130
131 if(MSVC)
132 add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
133 endif(MSVC)
134
135 if(PNG_DEBUG)
136 add_definitions(-DPNG_DEBUG)
137 endif()
138
139 # NOW BUILD OUR TARGET
140 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
141
142 unset(PNG_LIB_TARGETS)
143
144 if(PNG_SHARED)
145 add_library(${PNG_LIB_NAME} SHARED ${libpng_sources})
146 set(PNG_LIB_TARGETS ${PNG_LIB_NAME})
147 if(MSVC)
148 # msvc does not append 'lib' - do it here to have consistent name
149 set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
150 set_target_properties(${PNG_LIB_NAME} PROPERTIES IMPORT_PREFIX "lib")
151 endif()
152 target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
153 endif()
154
155 if(PNG_STATIC)
156 # does not work without changing name
157 set(PNG_LIB_NAME_STATIC ${PNG_LIB_NAME}_static)
158 add_library(${PNG_LIB_NAME_STATIC} STATIC ${libpng_sources})
159 list(APPEND PNG_LIB_TARGETS ${PNG_LIB_NAME_STATIC})
160 if(MSVC)
161 # msvc does not append 'lib' - do it here to have consistent name
162 set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
163 endif()
164 target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
165 endif()
166
167 if(NOT PNG_LIB_TARGETS)
168 message(SEND_ERROR
169 "No library variant selected to build. "
170 "Please enable at least one of the following options: PNG_STATIC, PNG_SHARED")
171 endif()
172
173 if(PNG_SHARED AND WIN32)
174 set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
175 endif()
176
177 if(PNG_TESTS AND PNG_SHARED)
178 # does not work with msvc due to png_lib_ver issue
179 add_executable(pngtest ${pngtest_sources})
180 target_link_libraries(pngtest ${PNG_LIB_NAME})
181 add_test(pngtest ./pngtest ${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png)
182 #
183 add_executable(pngvalid ${pngvalid_sources})
184 target_link_libraries(pngvalid ${PNG_LIB_NAME})
185 add_test(pngvalid ./pngvalid)
186 add_executable(pngstest ${pngstest_sources})
187 target_link_libraries(pngstest ${PNG_LIB_NAME})
188 add_test(pngstest ./pngstest
189 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g01.png
190 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g02.png
191 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g04.png
192 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g08.png
193 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g16.png
194 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn2c08.png
195 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn2c16.png
196 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p01.png
197 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p02.png
198 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p04.png
199 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p08.png
200 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn4a08.png
201 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn4a16.png
202 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn6a08.png
203 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn6a16.png
204 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g01.png
205 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g02.png
206 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g04.png
207 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn2c16.png
208 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn3p08.png
209 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbgn2c16.png
210 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbgn3p08.png
211 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbrn2c08.png
212 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbwn0g16.png
213 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbwn3p08.png
214 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbyn3p08.png
215 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n0g08.png
216 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n2c08.png
217 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n3p08.png
218 ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp1n3p08.png
219 )
220 endif()
221
222 # Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
223 IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
224 SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
225 ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
226
227 # Set a variable with CMake code which:
228 # Creates a symlink from src to dest (if possible) or alternatively
229 # copies if different.
230 macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
231 FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
232 if(WIN32 AND NOT CYGWIN AND NOT MSYS)
233 ADD_CUSTOM_COMMAND(
234 OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
235 COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
236 COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
237 DEPENDS ${PNG_LIB_TARGETS}
238 )
239 ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
240 else(WIN32 AND NOT CYGWIN AND NOT MSYS)
241 get_filename_component(LINK_TARGET "${SRC_FILE}" NAME)
242 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
243 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
244 endif(WIN32 AND NOT CYGWIN AND NOT MSYS)
245 endmacro()
246
247 # libpng is a library so default to 'lib'
248 if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
249 set(CMAKE_INSTALL_LIBDIR lib)
250 endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
251
252 # CREATE PKGCONFIG FILES
253 # we use the same files like ./configure, so we have to set its vars
254 # Only do this on Windows for Cygwin - the files don't make much sense outside
255 # a UNIX look alike
256 if(NOT WIN32 OR CYGWIN OR MINGW)
257 set(prefix ${CMAKE_INSTALL_PREFIX})
258 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
259 set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
260 set(includedir ${CMAKE_INSTALL_PREFIX}/include)
261 set(LIBS "-lz -lm")
262 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
263 ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
264 CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
265
266 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
267 ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
268 CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
269 endif(NOT WIN32 OR CYGWIN OR MINGW)
270
271 # SET UP LINKS
272 if(PNG_SHARED)
273 set_target_properties(${PNG_LIB_NAME} PROPERTIES
274 # VERSION 16.${PNGLIB_RELEASE}.1.6.2
275 VERSION 16.${PNGLIB_RELEASE}.0
276 SOVERSION 16
277 CLEAN_DIRECT_OUTPUT 1)
278 endif()
279 if(PNG_STATIC)
280 # MSVC doesn't use a different file extension for shared vs. static
281 # libs. We are able to change OUTPUT_NAME to remove the _static
282 # for all other platforms.
283 if(NOT MSVC)
284 set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
285 OUTPUT_NAME ${PNG_LIB_NAME}
286 CLEAN_DIRECT_OUTPUT 1)
287 endif()
288 endif()
289
290 # If CMake > 2.4.x, we set a variable used below to export
291 # targets to an export file.
292 # TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
293 if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)
294 set(PNG_EXPORT_RULE EXPORT libpng)
295 elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof
296 set(PNG_EXPORT_RULE EXPORT libpng)
297 endif()
298
299 # INSTALL
300 if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
301 install(TARGETS ${PNG_LIB_TARGETS}
302 ${PNG_EXPORT_RULE}
303 RUNTIME DESTINATION bin
304 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
305 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
306
307 if(PNG_SHARED)
308 # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
309 if(CYGWIN OR MINGW)
310 get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
311 CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
312 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
313 DESTINATION ${CMAKE_INSTALL_LIBDIR})
314 endif(CYGWIN OR MINGW)
315
316 if(NOT WIN32)
317 get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
318 CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
319 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
320 DESTINATION ${CMAKE_INSTALL_LIBDIR})
321 endif(NOT WIN32)
322 endif(PNG_SHARED)
323
324 if(PNG_STATIC)
325 if(NOT WIN32 OR CYGWIN OR MINGW)
326 get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME_STATIC} LOCATION_${CMAKE_BUILD_TYPE})
327 CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
328 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
329 DESTINATION ${CMAKE_INSTALL_LIBDIR})
330 endif(NOT WIN32 OR CYGWIN OR MINGW)
331 endif()
332 endif()
333
334 if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
335 install(FILES ${libpng_public_hdrs} DESTINATION include)
336 install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME})
337 endif()
338 if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
339 if(NOT WIN32 OR CYGWIN OR MINGW)
340 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
341 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
342 DESTINATION bin)
343 endif(NOT WIN32 OR CYGWIN OR MINGW)
344 endif()
345
346 if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
347 # Install man pages
348 if(NOT PNG_MAN_DIR)
349 set(PNG_MAN_DIR "share/man")
350 endif()
351 install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)
352 install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)
353 # Install pkg-config files
354 if(NOT WIN32 OR CYGWIN OR MINGW)
355 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
356 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
357 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
358 DESTINATION bin)
359 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
360 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
361 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
362 DESTINATION bin)
363 endif(NOT WIN32 OR CYGWIN OR MINGW)
364 endif()
365
366 # On versions of CMake that support it, create an export file CMake
367 # users can include() to import our targets
368 if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
369 install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
370 endif()
371
372 # what's with libpng-$VER%.txt and all the extra files?
373
374 # UNINSTALL
375 # do we need this?
376
377 # DIST
378 # do we need this?
379
380 # to create msvc import lib for mingw compiled shared lib
381 # pexports libpng.dll > libpng.def
382 # lib /def:libpng.def /machine:x86
383