OLD | NEW |
---|---|
(Empty) | |
1 # CMakeLists.txt | |
msarett
2016/06/02 16:35:33
Just noticing that this file exists...not sure it
| |
2 | |
3 # Copyright (C) 2007,2009-2016 Glenn Randers-Pehrson | |
4 # Written by Christian Ehrlicher, 2007 | |
5 # Revised by Roger Lowman, 2009-2010 | |
6 # Revised by Clifford Yapp, 2011-2012 | |
7 # Revised by Roger Leigh, 2016 | |
8 | |
9 # This code is released under the libpng license. | |
10 # For conditions of distribution and use, see the disclaimer | |
11 # and license in png.h | |
12 | |
13 cmake_minimum_required(VERSION 2.8.3) | |
14 cmake_policy(VERSION 2.8.3) | |
15 | |
16 # Set MacOSX @rpath usage globally. | |
17 if (POLICY CMP0020) | |
18 cmake_policy(SET CMP0020 NEW) | |
19 endif(POLICY CMP0020) | |
20 if (POLICY CMP0042) | |
21 cmake_policy(SET CMP0042 NEW) | |
22 endif(POLICY CMP0042) | |
23 # Use new variable expansion policy. | |
24 if (POLICY CMP0053) | |
25 cmake_policy(SET CMP0053 NEW) | |
26 endif(POLICY CMP0053) | |
27 if (POLICY CMP0054) | |
28 cmake_policy(SET CMP0054 NEW) | |
29 endif(POLICY CMP0054) | |
30 | |
31 set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo") | |
32 | |
33 project(libpng C) | |
34 enable_testing() | |
35 | |
36 set(PNGLIB_MAJOR 1) | |
37 set(PNGLIB_MINOR 6) | |
38 set(PNGLIB_RELEASE 22) | |
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 "math lib 'libm' not found; floating point support disabled") | |
53 endif() | |
54 else() | |
55 # not needed on windows | |
56 set(M_LIBRARY "") | |
57 endif() | |
58 | |
59 # COMMAND LINE OPTIONS | |
60 option(PNG_SHARED "Build shared lib" ON) | |
61 option(PNG_STATIC "Build static lib" ON) | |
62 option(PNG_TESTS "Build libpng tests" ON) | |
63 | |
64 # Many more configuration options could be added here | |
65 option(PNG_FRAMEWORK "Build OS X framework" OFF) | |
66 option(PNG_DEBUG "Build with debug output" OFF) | |
67 option(PNGARG "Disable ANSI-C prototypes" OFF) | |
68 | |
69 set(PNG_PREFIX "" CACHE STRING "Prefix to add to the API function names") | |
70 set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings") | |
71 | |
72 # SET LIBNAME | |
73 set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR}) | |
74 | |
75 # to distinguish between debug and release lib | |
76 set(CMAKE_DEBUG_POSTFIX "d") | |
77 | |
78 include(CheckCSourceCompiles) | |
79 option(ld-version-script "Enable linker version script" ON) | |
80 if(ld-version-script AND NOT APPLE) | |
81 # Check if LD supports linker scripts. | |
82 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" "VERS_1 { | |
83 global: sym; | |
84 local: *; | |
85 }; | |
86 | |
87 VERS_2 { | |
88 global: sym2; | |
89 main; | |
90 } VERS_1; | |
91 ") | |
92 set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) | |
93 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "-Wl,--version-script='${CMAK E_CURRENT_BINARY_DIR}/conftest.map'") | |
94 check_c_source_compiles("void sym(void) {} | |
95 void sym2(void) {} | |
96 int main(void) {return 0;} | |
97 " HAVE_LD_VERSION_SCRIPT) | |
98 if(NOT HAVE_LD_VERSION_SCRIPT) | |
99 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE} "-Wl,-M -Wl,${CMAKE_CU RRENT_BINARY_DIR}/conftest.map") | |
100 check_c_source_compiles("void sym(void) {} | |
101 void sym2(void) {} | |
102 int main(void) {return 0;} | |
103 " HAVE_SOLARIS_LD_VERSION_SCRIPT) | |
104 endif() | |
105 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) | |
106 file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map") | |
107 endif() | |
108 | |
109 # Find symbol prefix. Likely obsolete and unnecessary with recent | |
110 # toolchains (it's not done in many other projects). | |
111 function(symbol_prefix) | |
112 set(SYMBOL_PREFIX) | |
113 | |
114 execute_process(COMMAND "${CMAKE_C_COMPILER}" "-E" "-" | |
115 INPUT_FILE /dev/null | |
116 OUTPUT_VARIABLE OUT | |
117 RESULT_VARIABLE STATUS) | |
118 | |
119 if(CPP_FAIL) | |
120 message(WARNING "Failed to run the C preprocessor") | |
121 endif() | |
122 | |
123 string(REPLACE "\n" ";" OUT "${OUT}") | |
124 foreach(line ${OUT}) | |
125 string(REGEX MATCH "^PREFIX=" found_match "${line}") | |
126 if(found_match) | |
127 STRING(REGEX REPLACE "^PREFIX=(.*\)" "\\1" prefix "${line}") | |
128 string(REGEX MATCH "__USER_LABEL_PREFIX__" found_match "${prefix}") | |
129 if(found_match) | |
130 STRING(REGEX REPLACE "(.*)__USER_LABEL_PREFIX__(.*)" "\\1\\2" prefix "${ prefix}") | |
131 endif() | |
132 set(SYMBOL_PREFIX "${prefix}") | |
133 endif() | |
134 endforeach() | |
135 | |
136 message(STATUS "Symbol prefix: ${SYMBOL_PREFIX}") | |
137 set(SYMBOL_PREFIX "${SYMBOL_PREFIX}" PARENT_SCOPE) | |
138 endfunction() | |
139 | |
140 if(UNIX) | |
141 symbol_prefix() | |
142 endif() | |
143 | |
144 find_program(AWK NAMES gawk awk) | |
145 | |
146 include_directories(${CMAKE_CURRENT_BINARY_DIR}) | |
147 | |
148 if(NOT AWK) | |
149 # No awk available to generate sources; use pre-built pnglibconf.h | |
150 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt | |
151 ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h) | |
152 add_custom_target(genfiles) # Dummy | |
153 else() | |
154 include(CMakeParseArguments) | |
155 # Generate .chk from .out with awk | |
156 # generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]]) | |
157 function(generate_chk) | |
158 set(options) | |
159 set(oneValueArgs INPUT OUTPUT) | |
160 set(multiValueArgs DEPENDS) | |
161 cmake_parse_arguments(_GC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | |
162 if (NOT _GC_INPUT) | |
163 message(FATAL_ERROR "Invalid arguments. generate_out requires input.") | |
164 endif() | |
165 if (NOT _GC_OUTPUT) | |
166 message(FATAL_ERROR "Invalid arguments. generate_out requires output.") | |
167 endif() | |
168 | |
169 add_custom_command(OUTPUT "${_GC_OUTPUT}" | |
170 COMMAND "${CMAKE_COMMAND}" | |
171 "-DINPUT=${_GC_INPUT}" | |
172 "-DOUTPUT=${_GC_OUTPUT}" | |
173 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cm ake" | |
174 DEPENDS "${_GC_INPUT}" ${_GC_DEPENDS} | |
175 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") | |
176 endfunction() | |
177 | |
178 # Generate .out from .c with awk | |
179 # generate_out(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]]) | |
180 function(generate_out) | |
181 set(options) | |
182 set(oneValueArgs INPUT OUTPUT) | |
183 set(multiValueArgs DEPENDS) | |
184 cmake_parse_arguments(_GO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | |
185 if (NOT _GO_INPUT) | |
186 message(FATAL_ERROR "Invalid arguments. generate_out requires input.") | |
187 endif() | |
188 if (NOT _GO_OUTPUT) | |
189 message(FATAL_ERROR "Invalid arguments. generate_out requires output.") | |
190 endif() | |
191 | |
192 add_custom_command(OUTPUT "${_GO_OUTPUT}" | |
193 COMMAND "${CMAKE_COMMAND}" | |
194 "-DINPUT=${_GO_INPUT}" | |
195 "-DOUTPUT=${_GO_OUTPUT}" | |
196 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cm ake" | |
197 DEPENDS "${_GO_INPUT}" ${_GO_DEPENDS} | |
198 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") | |
199 endfunction() | |
200 | |
201 # Generate specific source file with awk | |
202 # generate_source(OUTPUT outputfile [DEPENDS dep1 [dep2...]]) | |
203 function(generate_source) | |
204 set(options) | |
205 set(oneValueArgs OUTPUT) | |
206 set(multiValueArgs DEPENDS) | |
207 cmake_parse_arguments(_GSO "${options}" "${oneValueArgs}" "${multiValueArgs} " ${ARGN}) | |
208 if (NOT _GSO_OUTPUT) | |
209 message(FATAL_ERROR "Invalid arguments. generate_source requires output." ) | |
210 endif() | |
211 | |
212 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_GSO_OUTPUT}" | |
213 COMMAND "${CMAKE_COMMAND}" | |
214 "-DOUTPUT=${_GSO_OUTPUT}" | |
215 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cm ake" | |
216 DEPENDS ${_GSO_DEPENDS} | |
217 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") | |
218 endfunction() | |
219 | |
220 # Copy file | |
221 function(generate_copy source destination) | |
222 add_custom_command(OUTPUT "${destination}" | |
223 COMMAND "${CMAKE_COMMAND}" -E remove "${destination}" | |
224 COMMAND "${CMAKE_COMMAND}" -E copy "${source}" | |
225 "${destination}" | |
226 DEPENDS "${source}") | |
227 endfunction() | |
228 | |
229 # Generate scripts/pnglibconf.h | |
230 generate_source(OUTPUT "scripts/pnglibconf.c" | |
231 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa" | |
232 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk" | |
233 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h") | |
234 | |
235 # Generate pnglibconf.c | |
236 generate_source(OUTPUT "pnglibconf.c" | |
237 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa" | |
238 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk" | |
239 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h") | |
240 | |
241 if(PNG_PREFIX) | |
242 set(PNGLIBCONF_H_EXTRA_DEPENDS | |
243 "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out" | |
244 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/macro.lst") | |
245 set(PNGPREFIX_H_EXTRA_DEPENDS | |
246 "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out") | |
247 endif() | |
248 | |
249 generate_out(INPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c" | |
250 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out") | |
251 | |
252 # Generate pnglibconf.h | |
253 generate_source(OUTPUT "pnglibconf.h" | |
254 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out" | |
255 ${PNGLIBCONF_H_EXTRA_DEPENDS}) | |
256 | |
257 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/intprefix.c" | |
258 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out" | |
259 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h") | |
260 | |
261 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/prefix.c" | |
262 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out" | |
263 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h" | |
264 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h" | |
265 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out") | |
266 | |
267 # Generate pngprefix.h | |
268 generate_source(OUTPUT "pngprefix.h" | |
269 DEPENDS ${PNGPREFIX_H_EXTRA_DEPENDS}) | |
270 | |
271 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/sym.c" | |
272 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out" | |
273 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h") | |
274 | |
275 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.c" | |
276 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out" | |
277 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h" | |
278 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h" | |
279 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuil t") | |
280 | |
281 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/vers.c" | |
282 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out" | |
283 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h" | |
284 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h" | |
285 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h") | |
286 | |
287 generate_chk(INPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out" | |
288 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk" | |
289 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk" | |
290 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def") | |
291 | |
292 add_custom_target(symbol-check DEPENDS | |
293 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk") | |
294 | |
295 generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out" | |
296 "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym") | |
297 generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out" | |
298 "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers") | |
299 | |
300 add_custom_target(genvers DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers") | |
301 add_custom_target(gensym DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym") | |
302 | |
303 add_custom_target("genprebuilt" | |
304 COMMAND "${CMAKE_COMMAND}" | |
305 "-DOUTPUT=scripts/pnglibconf.h.prebuilt" | |
306 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake " | |
307 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") | |
308 | |
309 # A single target handles generation of all generated files. If | |
310 # they are dependend upon separately by multiple targets, this | |
311 # confuses parallel make (it would require a separate top-level | |
312 # target for each file to track the dependencies properly). | |
313 add_custom_target(genfiles DEPENDS | |
314 "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym" | |
315 "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers" | |
316 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c" | |
317 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h" | |
318 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out" | |
319 "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h" | |
320 "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out" | |
321 "${CMAKE_CURRENT_BINARY_DIR}/scripts/pnglibconf.c" | |
322 "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out" | |
323 "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out" | |
324 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk" | |
325 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out" | |
326 "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out") | |
327 endif(NOT AWK) | |
328 | |
329 # OUR SOURCES | |
330 set(libpng_public_hdrs | |
331 png.h | |
332 pngconf.h | |
333 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h" | |
334 ) | |
335 set(libpng_private_hdrs | |
336 pngpriv.h | |
337 pngdebug.h | |
338 pnginfo.h | |
339 pngstruct.h | |
340 ) | |
341 if(AWK) | |
342 list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h") | |
343 endif() | |
344 set(libpng_sources | |
345 ${libpng_public_hdrs} | |
346 ${libpng_private_hdrs} | |
347 png.c | |
348 pngerror.c | |
349 pngget.c | |
350 pngmem.c | |
351 pngpread.c | |
352 pngread.c | |
353 pngrio.c | |
354 pngrtran.c | |
355 pngrutil.c | |
356 pngset.c | |
357 pngtrans.c | |
358 pngwio.c | |
359 pngwrite.c | |
360 pngwtran.c | |
361 pngwutil.c | |
362 ) | |
363 set(pngtest_sources | |
364 pngtest.c | |
365 ) | |
366 set(pngvalid_sources | |
367 contrib/libtests/pngvalid.c | |
368 ) | |
369 set(pngstest_sources | |
370 contrib/libtests/pngstest.c | |
371 ) | |
372 set(pngunknown_sources | |
373 contrib/libtests/pngunknown.c | |
374 ) | |
375 set(pngimage_sources | |
376 contrib/libtests/pngimage.c | |
377 ) | |
378 set(pngfix_sources | |
379 contrib/tools/pngfix.c | |
380 ) | |
381 set(png_fix_itxt_sources | |
382 contrib/tools/png-fix-itxt.c | |
383 ) | |
384 | |
385 if(MSVC) | |
386 add_definitions(-D_CRT_SECURE_NO_DEPRECATE) | |
387 endif(MSVC) | |
388 | |
389 if(PNG_DEBUG) | |
390 add_definitions(-DPNG_DEBUG) | |
391 endif() | |
392 | |
393 # NOW BUILD OUR TARGET | |
394 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIR}) | |
395 | |
396 unset(PNG_LIB_TARGETS) | |
397 | |
398 if(PNG_SHARED) | |
399 add_library(png SHARED ${libpng_sources}) | |
400 set(PNG_LIB_TARGETS png) | |
401 set_target_properties(png PROPERTIES OUTPUT_NAME ${PNG_LIB_NAME}) | |
402 add_dependencies(png genfiles) | |
403 if(MSVC) | |
404 # msvc does not append 'lib' - do it here to have consistent name | |
405 set_target_properties(png PROPERTIES PREFIX "lib") | |
406 set_target_properties(png PROPERTIES IMPORT_PREFIX "lib") | |
407 endif() | |
408 target_link_libraries(png ${ZLIB_LIBRARY} ${M_LIBRARY}) | |
409 | |
410 if(UNIX AND AWK) | |
411 if(HAVE_LD_VERSION_SCRIPT) | |
412 set_target_properties(png PROPERTIES LINK_FLAGS | |
413 "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'") | |
414 elseif(HAVE_SOLARIS_LD_VERSION_SCRIPT) | |
415 set_target_properties(png PROPERTIES LINK_FLAGS | |
416 "-Wl,-M -Wl,'${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'") | |
417 endif() | |
418 endif() | |
419 endif() | |
420 | |
421 if(PNG_STATIC) | |
422 # does not work without changing name | |
423 set(PNG_LIB_NAME_STATIC png_static) | |
424 add_library(png_static STATIC ${libpng_sources}) | |
425 add_dependencies(png_static genfiles) | |
426 # MSVC doesn't use a different file extension for shared vs. static | |
427 # libs. We are able to change OUTPUT_NAME to remove the _static | |
428 # for all other platforms. | |
429 if(NOT MSVC) | |
430 set_target_properties(png_static PROPERTIES | |
431 OUTPUT_NAME "${PNG_LIB_NAME}" | |
432 CLEAN_DIRECT_OUTPUT 1) | |
433 else() | |
434 set_target_properties(png_static PROPERTIES | |
435 OUTPUT_NAME "${PNG_LIB_NAME}_static" | |
436 CLEAN_DIRECT_OUTPUT 1) | |
437 endif() | |
438 list(APPEND PNG_LIB_TARGETS png_static) | |
439 if(MSVC) | |
440 # msvc does not append 'lib' - do it here to have consistent name | |
441 set_target_properties(png_static PROPERTIES PREFIX "lib") | |
442 endif() | |
443 target_link_libraries(png_static ${ZLIB_LIBRARY} ${M_LIBRARY}) | |
444 endif() | |
445 | |
446 if(PNG_FRAMEWORK) | |
447 set(PNG_LIB_NAME_FRAMEWORK png_framework) | |
448 add_library(png_framework SHARED ${libpng_sources}) | |
449 add_dependencies(png_framework genfiles) | |
450 list(APPEND PNG_LIB_TARGETS png_framework) | |
451 set_target_properties(png_framework PROPERTIES | |
452 FRAMEWORK TRUE | |
453 FRAMEWORK_VERSION ${PNGLIB_VERSION} | |
454 MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PNGLIB_MAJOR}.${PNGLIB_MINOR} | |
455 MACOSX_FRAMEWORK_BUNDLE_VERSION ${PNGLIB_VERSION} | |
456 MACOSX_FRAMEWORK_IDENTIFIER org.libpng.libpng | |
457 XCODE_ATTRIBUTE_INSTALL_PATH "@rpath" | |
458 PUBLIC_HEADER "${libpng_public_hdrs}" | |
459 OUTPUT_NAME png) | |
460 target_link_libraries(png_framework ${ZLIB_LIBRARY} ${M_LIBRARY}) | |
461 endif() | |
462 | |
463 if(NOT PNG_LIB_TARGETS) | |
464 message(SEND_ERROR | |
465 "No library variant selected to build. " | |
466 "Please enable at least one of the following options: " | |
467 " PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK") | |
468 endif() | |
469 | |
470 if(PNG_SHARED AND WIN32) | |
471 set_target_properties(png PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL) | |
472 endif() | |
473 | |
474 function(png_add_test) | |
475 set(options) | |
476 set(oneValueArgs NAME COMMAND) | |
477 set(multiValueArgs OPTIONS FILES) | |
478 cmake_parse_arguments(_PAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | |
479 | |
480 if (NOT _PAT_NAME) | |
481 message(FATAL_ERROR "Invalid arguments. png_add_test requires name.") | |
482 endif() | |
483 if (NOT _PAT_COMMAND) | |
484 message(FATAL_ERROR "Invalid arguments. png_add_test requires command.") | |
485 endif() | |
486 | |
487 set(TEST_OPTIONS "${_PAT_OPTIONS}") | |
488 set(TEST_FILES "${_PAT_FILES}") | |
489 | |
490 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in" | |
491 "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake" @ONLY) | |
492 if(CMAKE_MAJOR_VERSION GREATER 2) # have generator expressions | |
493 add_test(NAME "${_PAT_NAME}" | |
494 COMMAND "${CMAKE_COMMAND}" | |
495 "-DLIBPNG=$<TARGET_FILE:png>" | |
496 "-DTEST_COMMAND=$<TARGET_FILE:${_PAT_COMMAND}>" | |
497 -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake") | |
498 else() # old 2.x add_test; limited and won't work well on Windows | |
499 # Note LIBPNG is a dummy value as there are no generator expressions | |
500 add_test("${_PAT_NAME}" "${CMAKE_COMMAND}" | |
501 "-DLIBPNG=${CMAKE_CURRENT_BINARY_DIR}/libpng.so" | |
502 "-DTEST_COMMAND=./${_PAT_COMMAND}" | |
503 -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake") | |
504 endif() | |
505 endfunction() | |
506 | |
507 if(PNG_TESTS AND PNG_SHARED) | |
508 # Find test PNG files by globbing, but sort lists to ensure | |
509 # consistency between different filesystems. | |
510 file(GLOB PNGSUITE_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/*.png") | |
511 list(SORT PNGSUITE_PNGS) | |
512 file(GLOB TEST_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/testpngs/*.png") | |
513 list(SORT TEST_PNGS) | |
514 | |
515 set(PNGTEST_PNG "${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png") | |
516 | |
517 add_executable(pngtest ${pngtest_sources}) | |
518 target_link_libraries(pngtest png) | |
519 | |
520 png_add_test(NAME pngtest COMMAND pngtest FILES "${PNGTEST_PNG}") | |
521 | |
522 add_executable(pngvalid ${pngvalid_sources}) | |
523 target_link_libraries(pngvalid png) | |
524 | |
525 png_add_test(NAME pngvalid-gamma-16-to-8 | |
526 COMMAND pngvalid OPTIONS --gamma-16-to-8) | |
527 png_add_test(NAME pngvalid-gamma-alpha-mode | |
528 COMMAND pngvalid OPTIONS --gamma-alpha-mode) | |
529 png_add_test(NAME pngvalid-gamma-background | |
530 COMMAND pngvalid OPTIONS --gamma-background) | |
531 png_add_test(NAME pngvalid-gamma-expand16-alpha-mode | |
532 COMMAND pngvalid OPTIONS --gamma-alpha-mode --expand16) | |
533 png_add_test(NAME pngvalid-gamma-expand16-background | |
534 COMMAND pngvalid OPTIONS --gamma-background --expand16) | |
535 png_add_test(NAME pngvalid-gamma-expand16-transform | |
536 COMMAND pngvalid OPTIONS --gamma-transform --expand16) | |
537 png_add_test(NAME pngvalid-gamma-sbit | |
538 COMMAND pngvalid OPTIONS --gamma-sbit) | |
539 png_add_test(NAME pngvalid-gamma-threshold | |
540 COMMAND pngvalid OPTIONS --gamma-threshold) | |
541 png_add_test(NAME pngvalid-gamma-transform | |
542 COMMAND pngvalid OPTIONS --gamma-transform) | |
543 png_add_test(NAME pngvalid-progressive-interlace-standard | |
544 COMMAND pngvalid OPTIONS --standard --progressive-read --interlac e) | |
545 png_add_test(NAME pngvalid-progressive-size | |
546 COMMAND pngvalid OPTIONS --size --progressive-read) | |
547 png_add_test(NAME pngvalid-progressive-standard | |
548 COMMAND pngvalid OPTIONS --standard --progressive-read) | |
549 png_add_test(NAME pngvalid-standard | |
550 COMMAND pngvalid OPTIONS --standard) | |
551 png_add_test(NAME pngvalid-transform | |
552 COMMAND pngvalid OPTIONS --transform) | |
553 | |
554 add_executable(pngstest ${pngstest_sources}) | |
555 target_link_libraries(pngstest png) | |
556 | |
557 foreach(gamma_type 1.8 linear none sRGB) | |
558 foreach(alpha_type none alpha) | |
559 set(PNGSTEST_FILES) | |
560 foreach(test_png ${TEST_PNGS}) | |
561 string(REGEX MATCH ".*-linear[-.].*" TEST_PNG_LINEAR "${test_png}") | |
562 string(REGEX MATCH ".*-sRGB[-.].*" TEST_PNG_SRGB "${test_png}") | |
563 string(REGEX MATCH ".*-1.8[-.].*" TEST_PNG_G18 "${test_png}") | |
564 string(REGEX MATCH ".*-alpha-.*" TEST_PNG_ALPHA "${test_png}") | |
565 | |
566 set(TEST_PNG_VALID TRUE) | |
567 | |
568 if(TEST_PNG_ALPHA) | |
569 if (NOT "${alpha_type}" STREQUAL "alpha") | |
570 set(TEST_PNG_VALID FALSE) | |
571 endif() | |
572 else() | |
573 if ("${alpha_type}" STREQUAL "alpha") | |
574 set(TEST_PNG_VALID FALSE) | |
575 endif() | |
576 endif() | |
577 | |
578 if(TEST_PNG_LINEAR) | |
579 if(NOT "${gamma_type}" STREQUAL "linear") | |
580 set(TEST_PNG_VALID FALSE) | |
581 endif() | |
582 elseif(TEST_PNG_SRGB) | |
583 if(NOT "${gamma_type}" STREQUAL "sRGB") | |
584 set(TEST_PNG_VALID FALSE) | |
585 endif() | |
586 elseif(TEST_PNG_G18) | |
587 if(NOT "${gamma_type}" STREQUAL "1.8") | |
588 set(TEST_PNG_VALID FALSE) | |
589 endif() | |
590 else() | |
591 if(NOT "${gamma_type}" STREQUAL "none") | |
592 set(TEST_PNG_VALID FALSE) | |
593 endif() | |
594 endif() | |
595 | |
596 if(TEST_PNG_VALID) | |
597 list(APPEND PNGSTEST_FILES "${test_png}") | |
598 endif() | |
599 endforeach() | |
600 # Should already be sorted, but sort anyway to be certain. | |
601 list(SORT PNGSTEST_FILES) | |
602 png_add_test(NAME pngstest-${gamma_type}-${alpha_type} | |
603 COMMAND pngstest | |
604 OPTIONS --tmpfile "${gamma_type}-${alpha_type}-" --log | |
605 FILES ${PNGSTEST_FILES}) | |
606 endforeach() | |
607 endforeach() | |
608 | |
609 add_executable(pngunknown ${pngunknown_sources}) | |
610 target_link_libraries(pngunknown png) | |
611 | |
612 png_add_test(NAME pngunknown-discard COMMAND pngunknown OPTIONS --strict defau lt=discard FILES "${PNGTEST_PNG}") | |
613 png_add_test(NAME pngunknown-IDAT COMMAND pngunknown OPTIONS --strict default= discard IDAT=save FILES "${PNGTEST_PNG}") | |
614 png_add_test(NAME pngunknown-if-safe COMMAND pngunknown OPTIONS --strict defau lt=if-safe FILES "${PNGTEST_PNG}") | |
615 png_add_test(NAME pngunknown-sAPI COMMAND pngunknown OPTIONS --strict bKGD=sav e cHRM=save gAMA=save all=discard iCCP=save sBIT=save sRGB=save FILES "${PNGTEST _PNG}") | |
616 png_add_test(NAME pngunknown-save COMMAND pngunknown OPTIONS --strict default= save FILES "${PNGTEST_PNG}") | |
617 png_add_test(NAME pngunknown-sTER COMMAND pngunknown OPTIONS --strict sTER=if- safe FILES "${PNGTEST_PNG}") | |
618 png_add_test(NAME pngunknown-vpAg COMMAND pngunknown OPTIONS --strict vpAg=if- safe FILES "${PNGTEST_PNG}") | |
619 | |
620 add_executable(pngimage ${pngimage_sources}) | |
621 target_link_libraries(pngimage png) | |
622 | |
623 png_add_test(NAME pngimage-quick COMMAND pngimage OPTIONS --list-combos --log FILES ${PNGSUITE_PNGS}) | |
624 png_add_test(NAME pngimage-full COMMAND pngimage OPTIONS --exhaustive --list-c ombos --log FILES ${PNGSUITE_PNGS}) | |
625 endif() | |
626 | |
627 if(PNG_SHARED) | |
628 add_executable(pngfix ${pngfix_sources}) | |
629 target_link_libraries(pngfix png) | |
630 set(PNG_BIN_TARGETS pngfix) | |
631 | |
632 add_executable(png-fix-itxt ${png_fix_itxt_sources}) | |
633 target_link_libraries(png-fix-itxt ${ZLIB_LIBRARY} ${M_LIBRARY}) | |
634 list(APPEND PNG_BIN_TARGETS png-fix-itxt) | |
635 endif() | |
636 | |
637 # Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set | |
638 IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) | |
639 SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib") | |
640 ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) | |
641 | |
642 # Set a variable with CMake code which: | |
643 # Creates a symlink from src to dest (if possible) or alternatively | |
644 # copies if different. | |
645 macro(CREATE_SYMLINK SRC_FILE DEST_FILE) | |
646 FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}) | |
647 if(WIN32 AND NOT CYGWIN AND NOT MSYS) | |
648 ADD_CUSTOM_COMMAND( | |
649 OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} ${CMAKE_CURRENT_ BINARY_DIR}/${DEST_FILE} | |
650 COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_LIB RARY_OUTPUT_DIRECTORY}/${DEST_FILE} | |
651 COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_CUR RENT_BINARY_DIR}/${DEST_FILE} | |
652 DEPENDS ${PNG_LIB_TARGETS} | |
653 ) | |
654 ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIREC TORY}/${DEST_FILE}) | |
655 else(WIN32 AND NOT CYGWIN AND NOT MSYS) | |
656 get_filename_component(LINK_TARGET "${SRC_FILE}" NAME) | |
657 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_B INARY_DIR}/${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) | |
658 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT _BINARY_DIR}) | |
659 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) | |
660 endif(WIN32 AND NOT CYGWIN AND NOT MSYS) | |
661 endmacro() | |
662 | |
663 # Create source generation scripts. | |
664 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in | |
665 ${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake @ONLY) | |
666 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in | |
667 ${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake @ONLY) | |
668 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in | |
669 ${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake @ONLY) | |
670 | |
671 | |
672 # libpng is a library so default to 'lib' | |
673 if(NOT DEFINED CMAKE_INSTALL_LIBDIR) | |
674 set(CMAKE_INSTALL_LIBDIR lib) | |
675 endif(NOT DEFINED CMAKE_INSTALL_LIBDIR) | |
676 | |
677 # CREATE PKGCONFIG FILES | |
678 # we use the same files like ./configure, so we have to set its vars | |
679 # Only do this on Windows for Cygwin - the files don't make much sense outside | |
680 # a UNIX look alike | |
681 if(NOT WIN32 OR CYGWIN OR MINGW) | |
682 set(prefix ${CMAKE_INSTALL_PREFIX}) | |
683 set(exec_prefix ${CMAKE_INSTALL_PREFIX}) | |
684 set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) | |
685 set(includedir ${CMAKE_INSTALL_PREFIX}/include) | |
686 set(LIBS "-lz -lm") | |
687 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in | |
688 ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY) | |
689 CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc) | |
690 | |
691 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in | |
692 ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY) | |
693 CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config) | |
694 endif(NOT WIN32 OR CYGWIN OR MINGW) | |
695 | |
696 # SET UP LINKS | |
697 if(PNG_SHARED) | |
698 set_target_properties(png PROPERTIES | |
699 # VERSION 16.${PNGLIB_RELEASE}.1.6.22rc01 | |
700 VERSION 16.${PNGLIB_RELEASE}.0 | |
701 SOVERSION 16 | |
702 CLEAN_DIRECT_OUTPUT 1) | |
703 endif() | |
704 | |
705 # If CMake > 2.4.x, we set a variable used below to export | |
706 # targets to an export file. | |
707 # TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2 | |
708 if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4) | |
709 set(PNG_EXPORT_RULE EXPORT libpng) | |
710 elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof | |
711 set(PNG_EXPORT_RULE EXPORT libpng) | |
712 endif() | |
713 | |
714 # INSTALL | |
715 if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) | |
716 install(TARGETS ${PNG_LIB_TARGETS} | |
717 ${PNG_EXPORT_RULE} | |
718 RUNTIME DESTINATION bin | |
719 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | |
720 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | |
721 FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}) | |
722 | |
723 if(PNG_SHARED) | |
724 # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin | |
725 if(CYGWIN OR MINGW) | |
726 get_target_property(BUILD_TARGET_LOCATION png LOCATION_${CMAKE_BUILD_TYPE }) | |
727 CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_IMPORT_LIBRARY_SUFF IX}) | |
728 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SU FFIX} | |
729 DESTINATION ${CMAKE_INSTALL_LIBDIR}) | |
730 endif(CYGWIN OR MINGW) | |
731 | |
732 if(NOT WIN32) | |
733 get_target_property(BUILD_TARGET_LOCATION png LOCATION_${CMAKE_BUILD_TYPE} ) | |
734 CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_SHARED_LIBRARY_SUFFI X}) | |
735 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUF FIX} | |
736 DESTINATION ${CMAKE_INSTALL_LIBDIR}) | |
737 endif(NOT WIN32) | |
738 endif(PNG_SHARED) | |
739 | |
740 if(PNG_STATIC) | |
741 if(NOT WIN32 OR CYGWIN OR MINGW) | |
742 get_target_property(BUILD_TARGET_LOCATION png_static LOCATION_${CMAKE_BUIL D_TYPE}) | |
743 CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_STATIC_LIBRARY_SUFFI X}) | |
744 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUF FIX} | |
745 DESTINATION ${CMAKE_INSTALL_LIBDIR}) | |
746 endif(NOT WIN32 OR CYGWIN OR MINGW) | |
747 endif() | |
748 endif() | |
749 | |
750 if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL ) | |
751 install(FILES ${libpng_public_hdrs} DESTINATION include) | |
752 install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME}) | |
753 endif() | |
754 if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL ) | |
755 if(NOT WIN32 OR CYGWIN OR MINGW) | |
756 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin) | |
757 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config | |
758 DESTINATION bin) | |
759 endif(NOT WIN32 OR CYGWIN OR MINGW) | |
760 endif() | |
761 | |
762 if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL ) | |
763 install(TARGETS ${PNG_BIN_TARGETS} | |
764 RUNTIME DESTINATION bin) | |
765 endif() | |
766 | |
767 if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) | |
768 # Install man pages | |
769 if(NOT PNG_MAN_DIR) | |
770 set(PNG_MAN_DIR "share/man") | |
771 endif() | |
772 install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3) | |
773 install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5) | |
774 # Install pkg-config files | |
775 if(NOT WIN32 OR CYGWIN OR MINGW) | |
776 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc | |
777 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) | |
778 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config | |
779 DESTINATION bin) | |
780 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc | |
781 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) | |
782 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config | |
783 DESTINATION bin) | |
784 endif(NOT WIN32 OR CYGWIN OR MINGW) | |
785 endif() | |
786 | |
787 # On versions of CMake that support it, create an export file CMake | |
788 # users can include() to import our targets | |
789 if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL ) | |
790 install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake) | |
791 endif() | |
792 | |
793 # what's with libpng-manual.txt and all the extra files? | |
794 | |
795 # UNINSTALL | |
796 # do we need this? | |
797 | |
798 # DIST | |
799 # do we need this? | |
800 | |
801 # to create msvc import lib for mingw compiled shared lib | |
802 # pexports libpng.dll > libpng.def | |
803 # lib /def:libpng.def /machine:x86 | |
804 | |
OLD | NEW |