Bringing libpng-1.5.10 into the main branch
[AROS.git] / workbench / libs / png / CMakeLists.txt
blobb5117891d64555d3b82ab63902803c8fdea59382
1 # CMakeLists.txt
3 # Copyright (C) 2007-2011 Glenn Randers-Pehrson
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
9 cmake_minimum_required(VERSION 2.4.4)
10 set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
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()
33 project(libpng C)
34 enable_testing()
36 set(PNGLIB_MAJOR 1)
37 set(PNGLIB_MINOR 5)
38 set(PNGLIB_RELEASE 10)
39 set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
40 set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
42 # needed packages
43 find_package(ZLIB REQUIRED)
44 include_directories(${ZLIB_INCLUDE_DIR})
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()
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()
72 option(PNG_TESTS  "Build libpng tests" YES)
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)
78 # SET LIBNAME
79 set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
81 # to distinguish between debug and release lib
82 set(CMAKE_DEBUG_POSTFIX "d")
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})
92 # OUR SOURCES
93 set(libpng_public_hdrs
94   png.h
95   pngconf.h
96   ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h
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
120 set(pngtest_sources
121   pngtest.c
123 set(pngvalid_sources
124   contrib/libtests/pngvalid.c
126 # SOME NEEDED DEFINITIONS
128 add_definitions(-DPNG_CONFIGURE_LIBPNG)
130 if(MSVC)
131   add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
132 endif(MSVC)
134 if(PNG_DEBUG)
135   add_definitions(-DPNG_DEBUG)
136 endif()
138 # NOW BUILD OUR TARGET
139 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
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()
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()
162 if(PNG_SHARED AND WIN32)
163   set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
164 endif()
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()
177 # Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
178 IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
179   SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
180 ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
182 # Set a variable with CMake code which:
183 # Creates a symlink from src to dest (if possible) or alternatively
184 # copies if different.
185 macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
186   FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
187   if(WIN32 AND NOT CYGWIN AND NOT MINGW)
188     ADD_CUSTOM_COMMAND(
189         OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}   ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
190         COMMAND ${CMAKE_COMMAND} -E copy        ${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
191         COMMAND ${CMAKE_COMMAND} -E copy        ${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
192         DEPENDS ${PNG_LIB_NAME} ${PNG_LIB_NAME_STATIC}
193         )
194     ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
195   else(WIN32 AND NOT CYGWIN AND NOT MINGW)
196     execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${SRC_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
197     execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${SRC_FILE} ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
198   endif(WIN32 AND NOT CYGWIN AND NOT MINGW)
199 endmacro()
201 # libpng is a library so default to 'lib'
202 if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
203   set(CMAKE_INSTALL_LIBDIR lib)
204 endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
206 # CREATE PKGCONFIG FILES
207 # we use the same files like ./configure, so we have to set its vars
208 # Only do this on Windows for Cygwin - the files don't make much sense outside
209 # a UNIX look alike
210 if(NOT WIN32 OR CYGWIN OR MINGW) 
211   set(prefix      ${CMAKE_INSTALL_PREFIX})
212   set(exec_prefix ${CMAKE_INSTALL_PREFIX})
213   set(libdir      ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
214   set(includedir  ${CMAKE_INSTALL_PREFIX}/include)
215   set(LIBS        "-lz -lm")
216   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
217     ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
218   CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
220   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
221     ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
222   CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
223 endif(NOT WIN32 OR CYGWIN OR MINGW)
225 # SET UP LINKS
226 if(PNG_SHARED)
227   set_target_properties(${PNG_LIB_NAME} PROPERTIES
228 #   VERSION 15.${PNGLIB_RELEASE}.1.5.10
229     VERSION 15.${PNGLIB_RELEASE}.0
230     SOVERSION 15
231     CLEAN_DIRECT_OUTPUT 1)
232 endif()
233 if(PNG_STATIC)
234   # MSVC doesn't use a different file extension for shared vs. static
235   # libs.  We are able to change OUTPUT_NAME to remove the _static
236   # for all other platforms.
237   if(NOT MSVC)
238     set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
239       OUTPUT_NAME ${PNG_LIB_NAME}
240       CLEAN_DIRECT_OUTPUT 1)
241   endif()
242 endif()
244 # If CMake > 2.4.x, we set a variable used below to export
245 # targets to an export file.
246 # TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
247 if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)
248   set(PNG_EXPORT_RULE EXPORT libpng)
249 elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof
250   set(PNG_EXPORT_RULE EXPORT libpng)
251 endif()
253 # INSTALL
254 if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
255   if(PNG_SHARED)
256     install(TARGETS ${PNG_LIB_NAME}
257         ${PNG_EXPORT_RULE}
258         RUNTIME DESTINATION bin
259         LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
260         ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
262     # Create a symlink for libpng.dll.a => libpng15.dll.a on Cygwin
263     if(CYGWIN OR MINGW)
264        get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
265        get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
266        CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
267        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
268          DESTINATION ${CMAKE_INSTALL_LIBDIR})
269     endif(CYGWIN OR MINGW)
271     if(NOT WIN32)
272       get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
273       get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
274       CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
275       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
276          DESTINATION ${CMAKE_INSTALL_LIBDIR})
277     endif(NOT WIN32)
278   endif(PNG_SHARED)
280   if(PNG_STATIC)
281     install(TARGETS ${PNG_LIB_NAME_STATIC}
282         ${PNG_EXPORT_RULE}
283         LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
284         ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
285     if(NOT WIN32 OR CYGWIN OR MINGW)
286       get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME_STATIC} LOCATION_${CMAKE_BUILD_TYPE})
287       get_filename_component(BUILD_TARGET_FILE ${BUILD_TARGET_LOCATION} NAME)
288       CREATE_SYMLINK(${BUILD_TARGET_FILE} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
289       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
290          DESTINATION ${CMAKE_INSTALL_LIBDIR})
291     endif(NOT WIN32 OR CYGWIN OR MINGW)
292  endif()
293 endif()
295 if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
296   install(FILES ${libpng_public_hdrs}   DESTINATION include)
297   install(FILES ${libpng_public_hdrs}   DESTINATION include/${PNGLIB_NAME})
298 endif()
299 if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
300   if(NOT WIN32 OR CYGWIN OR MINGW)
301     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
302     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
303             DESTINATION bin)
304   endif(NOT WIN32 OR CYGWIN OR MINGW)
305 endif()
307 if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
308   # Install man pages
309   if(NOT PNG_MAN_DIR)
310     set(PNG_MAN_DIR "share/man")
311   endif()
312   install(FILES libpng.3 libpngpf.3      DESTINATION ${PNG_MAN_DIR}/man3)
313   install(FILES png.5                    DESTINATION ${PNG_MAN_DIR}/man5)
314   # Install pkg-config files
315   if(NOT WIN32 OR CYGWIN OR MINGW)
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(NOT WIN32 OR CYGWIN OR MINGW)
325 endif()
327 # On versions of CMake that support it, create an export file CMake
328 # users can include() to import our targets
329 if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
330   install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
331 endif()
333 # what's with libpng-$VER%.txt and all the extra files?
335 # UNINSTALL
336 # do we need this?
338 # DIST
339 # do we need this?
341 # to create msvc import lib for mingw compiled shared lib
342 # pexports libpng.dll > libpng.def
343 # lib /def:libpng.def /machine:x86