packaging: depend on the same release
[platform/upstream/libpng.git] / CMakeLists.txt
1 # CMakeLists.txt
2
3 # Copyright (C) 2007-2014 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 set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
13
14 project(libpng C)
15 enable_testing()
16
17 set(PNGLIB_MAJOR 1)
18 set(PNGLIB_MINOR 6)
19 set(PNGLIB_RELEASE 13)
20 set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
21 set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
22
23 # needed packages
24 find_package(ZLIB REQUIRED)
25 include_directories(${ZLIB_INCLUDE_DIR})
26
27 if(NOT WIN32)
28   find_library(M_LIBRARY
29     NAMES m
30     PATHS /usr/lib /usr/local/lib
31   )
32   if(NOT M_LIBRARY)
33     message(STATUS
34       "math library 'libm' not found - floating point support disabled")
35   endif()
36 else()
37   # not needed on windows
38   set(M_LIBRARY "")
39 endif()
40
41 # COMMAND LINE OPTIONS
42 if(DEFINED PNG_SHARED)
43   option(PNG_SHARED "Build shared lib" ${PNG_SHARED})
44 else()
45   option(PNG_SHARED "Build shared lib" ON)
46 endif()
47 if(DEFINED PNG_STATIC)
48   option(PNG_STATIC "Build static lib" ${PNG_STATIC})
49 else()
50   option(PNG_STATIC "Build static lib" ON)
51 endif()
52
53 option(PNG_TESTS  "Build libpng tests" YES)
54
55 # Many more configuration options could be added here
56 option(PNG_DEBUG         "Build with debug output" NO)
57 option(PNGARG            "Disable ANSI-C prototypes" NO)
58
59 # SET LIBNAME
60 set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
61
62 # to distinguish between debug and release lib
63 set(CMAKE_DEBUG_POSTFIX "d")
64
65 # Use the prebuilt pnglibconf.h file from the scripts folder
66 # TODO: fix this by building with awk; without this no cmake build can be
67 # configured directly (to do so indirectly use your local awk to build a
68 # pnglibconf.h in the build directory.)
69 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
70                ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
71 include_directories(${CMAKE_CURRENT_BINARY_DIR})
72
73 # OUR SOURCES
74 set(libpng_public_hdrs
75   png.h
76   pngconf.h
77   ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h
78 )
79 set(libpng_sources
80   ${libpng_public_hdrs}
81   pngdebug.h
82   pnginfo.h
83   pngpriv.h
84   pngstruct.h
85   png.c
86   pngerror.c
87   pngget.c
88   pngmem.c
89   pngpread.c
90   pngread.c
91   pngrio.c
92   pngrtran.c
93   pngrutil.c
94   pngset.c
95   pngtrans.c
96   pngwio.c
97   pngwrite.c
98   pngwtran.c
99   pngwutil.c
100 )
101 set(pngtest_sources
102   pngtest.c
103 )
104 set(pngvalid_sources
105   contrib/libtests/pngvalid.c
106 )
107 set(pngstest_sources
108   contrib/libtests/pngstest.c
109 )
110 # SOME NEEDED DEFINITIONS
111
112 if(MSVC)
113   add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
114 endif(MSVC)
115
116 if(PNG_DEBUG)
117   add_definitions(-DPNG_DEBUG)
118 endif()
119
120 # NOW BUILD OUR TARGET
121 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR})
122
123 unset(PNG_LIB_TARGETS)
124
125 if(PNG_SHARED)
126   add_library(${PNG_LIB_NAME} SHARED ${libpng_sources})
127   set(PNG_LIB_TARGETS ${PNG_LIB_NAME})
128   if(MSVC)
129     # msvc does not append 'lib' - do it here to have consistent name
130     set_target_properties(${PNG_LIB_NAME} PROPERTIES PREFIX "lib")
131     set_target_properties(${PNG_LIB_NAME} PROPERTIES IMPORT_PREFIX "lib")
132   endif()
133   target_link_libraries(${PNG_LIB_NAME} ${ZLIB_LIBRARY} ${M_LIBRARY})
134 endif()
135
136 if(PNG_STATIC)
137 # does not work without changing name
138   set(PNG_LIB_NAME_STATIC ${PNG_LIB_NAME}_static)
139   add_library(${PNG_LIB_NAME_STATIC} STATIC ${libpng_sources})
140   list(APPEND PNG_LIB_TARGETS ${PNG_LIB_NAME_STATIC})
141   if(MSVC)
142     # msvc does not append 'lib' - do it here to have consistent name
143     set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES PREFIX "lib")
144   endif()
145   target_link_libraries(${PNG_LIB_NAME_STATIC} ${ZLIB_LIBRARY} ${M_LIBRARY})
146 endif()
147
148 if(NOT PNG_LIB_TARGETS)
149   message(SEND_ERROR
150     "No library variant selected to build. "
151     "Please enable at least one of the following options: PNG_STATIC, PNG_SHARED")
152 endif()
153
154 if(PNG_SHARED AND WIN32)
155   set_target_properties(${PNG_LIB_NAME} PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL)
156 endif()
157
158 if(PNG_TESTS AND PNG_SHARED)
159   # does not work with msvc due to png_lib_ver issue
160   add_executable(pngtest ${pngtest_sources})
161   target_link_libraries(pngtest ${PNG_LIB_NAME})
162   add_test(pngtest ./pngtest ${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png)
163   #
164   add_executable(pngvalid ${pngvalid_sources})
165   target_link_libraries(pngvalid ${PNG_LIB_NAME})
166   add_test(pngvalid ./pngvalid)
167   add_executable(pngstest ${pngstest_sources})
168   target_link_libraries(pngstest ${PNG_LIB_NAME})
169   add_test(pngstest ./pngstest
170     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g01.png
171     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g02.png
172     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g04.png
173     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g08.png
174     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn0g16.png
175     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn2c08.png
176     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn2c16.png
177     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p01.png
178     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p02.png
179     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p04.png
180     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn3p08.png
181     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn4a08.png
182     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn4a16.png
183     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn6a08.png
184     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/basn6a16.png
185     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g01.png
186     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g02.png
187     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn0g04.png
188     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn2c16.png
189     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbbn3p08.png
190     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbgn2c16.png
191     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbgn3p08.png
192     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbrn2c08.png
193     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbwn0g16.png
194     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbwn3p08.png
195     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftbyn3p08.png
196     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n0g08.png
197     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n2c08.png
198     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp0n3p08.png
199     ${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/ftp1n3p08.png
200   )
201 endif()
202
203 # Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set
204 IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
205   SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")
206 ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
207
208 # Set a variable with CMake code which:
209 # Creates a symlink from src to dest (if possible) or alternatively
210 # copies if different.
211 macro(CREATE_SYMLINK SRC_FILE DEST_FILE)
212   FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
213   if(WIN32 AND NOT CYGWIN AND NOT MSYS)
214     ADD_CUSTOM_COMMAND(
215         OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}   ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
216         COMMAND ${CMAKE_COMMAND} -E copy_if_different  "${SRC_FILE}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}
217         COMMAND ${CMAKE_COMMAND} -E copy_if_different  "${SRC_FILE}" ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}
218         DEPENDS ${PNG_LIB_TARGETS}
219         )
220     ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})
221   else(WIN32 AND NOT CYGWIN AND NOT MSYS)
222     get_filename_component(LINK_TARGET "${SRC_FILE}" NAME)
223     execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
224     execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
225     execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
226   endif(WIN32 AND NOT CYGWIN AND NOT MSYS)
227 endmacro()
228
229 # libpng is a library so default to 'lib'
230 if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
231   set(CMAKE_INSTALL_LIBDIR lib)
232 endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)
233
234 # CREATE PKGCONFIG FILES
235 # we use the same files like ./configure, so we have to set its vars
236 # Only do this on Windows for Cygwin - the files don't make much sense outside
237 # a UNIX look alike
238 if(NOT WIN32 OR CYGWIN OR MINGW)
239   set(prefix      ${CMAKE_INSTALL_PREFIX})
240   set(exec_prefix ${CMAKE_INSTALL_PREFIX})
241   set(libdir      ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
242   set(includedir  ${CMAKE_INSTALL_PREFIX}/include)
243   set(LIBS        "-lz -lm")
244   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
245     ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)
246   CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)
247
248   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
249     ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)
250   CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)
251 endif(NOT WIN32 OR CYGWIN OR MINGW)
252
253 # SET UP LINKS
254 if(PNG_SHARED)
255   set_target_properties(${PNG_LIB_NAME} PROPERTIES
256 #   VERSION 16.${PNGLIB_RELEASE}.1.6.13
257     VERSION 16.${PNGLIB_RELEASE}.0
258     SOVERSION 16
259     CLEAN_DIRECT_OUTPUT 1)
260 endif()
261 if(PNG_STATIC)
262   # MSVC doesn't use a different file extension for shared vs. static
263   # libs.  We are able to change OUTPUT_NAME to remove the _static
264   # for all other platforms.
265   if(NOT MSVC)
266     set_target_properties(${PNG_LIB_NAME_STATIC} PROPERTIES
267       OUTPUT_NAME ${PNG_LIB_NAME}
268       CLEAN_DIRECT_OUTPUT 1)
269   endif()
270 endif()
271
272 # If CMake > 2.4.x, we set a variable used below to export
273 # targets to an export file.
274 # TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2
275 if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)
276   set(PNG_EXPORT_RULE EXPORT libpng)
277 elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof
278   set(PNG_EXPORT_RULE EXPORT libpng)
279 endif()
280
281 # INSTALL
282 if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
283   install(TARGETS ${PNG_LIB_TARGETS}
284       ${PNG_EXPORT_RULE}
285       RUNTIME DESTINATION bin
286       LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
287       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
288
289   if(PNG_SHARED)
290     # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
291     if(CYGWIN OR MINGW)
292        get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
293        CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})
294        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
295          DESTINATION ${CMAKE_INSTALL_LIBDIR})
296     endif(CYGWIN OR MINGW)
297
298     if(NOT WIN32)
299       get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME} LOCATION_${CMAKE_BUILD_TYPE})
300       CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})
301       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
302          DESTINATION ${CMAKE_INSTALL_LIBDIR})
303     endif(NOT WIN32)
304   endif(PNG_SHARED)
305
306   if(PNG_STATIC)
307     if(NOT WIN32 OR CYGWIN OR MINGW)
308       get_target_property(BUILD_TARGET_LOCATION ${PNG_LIB_NAME_STATIC} LOCATION_${CMAKE_BUILD_TYPE})
309       CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})
310       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
311          DESTINATION ${CMAKE_INSTALL_LIBDIR})
312     endif(NOT WIN32 OR CYGWIN OR MINGW)
313  endif()
314 endif()
315
316 if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
317   install(FILES ${libpng_public_hdrs}   DESTINATION include)
318   install(FILES ${libpng_public_hdrs}   DESTINATION include/${PNGLIB_NAME})
319 endif()
320 if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )
321   if(NOT WIN32 OR CYGWIN OR MINGW)
322     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)
323     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
324             DESTINATION bin)
325   endif(NOT WIN32 OR CYGWIN OR MINGW)
326 endif()
327
328 if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
329   # Install man pages
330   if(NOT PNG_MAN_DIR)
331     set(PNG_MAN_DIR "share/man")
332   endif()
333   install(FILES libpng.3 libpngpf.3      DESTINATION ${PNG_MAN_DIR}/man3)
334   install(FILES png.5                    DESTINATION ${PNG_MAN_DIR}/man5)
335   # Install pkg-config files
336   if(NOT WIN32 OR CYGWIN OR MINGW)
337     install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
338             DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
339     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
340             DESTINATION bin)
341     install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
342             DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
343     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
344             DESTINATION bin)
345   endif(NOT WIN32 OR CYGWIN OR MINGW)
346 endif()
347
348 # On versions of CMake that support it, create an export file CMake
349 # users can include() to import our targets
350 if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )
351   install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)
352 endif()
353
354 # what's with libpng-manual.txt and all the extra files?
355
356 # UNINSTALL
357 # do we need this?
358
359 # DIST
360 # do we need this?
361
362 # to create msvc import lib for mingw compiled shared lib
363 # pexports libpng.dll > libpng.def
364 # lib /def:libpng.def /machine:x86
365