blob: 42ff0f902559eadbf5d3d1d9c393f84a129455de [file] [log] [blame]
Chris Craikb50c2172013-07-29 15:28:30 -07001# CMakeLists.txt
Patrick Scott5f6bd842010-06-28 16:55:16 -04002
xNombre232e9ca2020-07-03 22:10:22 +02003# Copyright (c) 2018-2020 Cosmin Truta
xNombred07bb0d2020-03-10 20:17:12 +01004# Copyright (c) 2007,2009-2018 Glenn Randers-Pehrson
Matt Sarett11466862016-02-19 13:41:30 -05005# Written by Christian Ehrlicher, 2007
6# Revised by Roger Lowman, 2009-2010
xNombred07bb0d2020-03-10 20:17:12 +01007# Revised by Clifford Yapp, 2011-2012,2017
Matt Sarett11466862016-02-19 13:41:30 -05008# Revised by Roger Leigh, 2016
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -04009# Revised by Andreas Franek, 2016
xNombred07bb0d2020-03-10 20:17:12 +010010# Revised by Sam Serrels, 2017
11# Revised by Vadim Barkov, 2017
12# Revised by Vicky Pfau, 2018
13# Revised by Cameron Cawley, 2018
xNombred07bb0d2020-03-10 20:17:12 +010014# Revised by Kyle Bentley, 2018
xNombre232e9ca2020-07-03 22:10:22 +020015# Revised by David Callu, 2020
16# Revised by Steve Robinson, 2020
17# Revised by Simon Hausmann, 2020
18# Revised by Alex Gaynor, 2020
Patrick Scott5f6bd842010-06-28 16:55:16 -040019
20# This code is released under the libpng license.
21# For conditions of distribution and use, see the disclaimer
22# and license in png.h
23
xNombred07bb0d2020-03-10 20:17:12 +010024cmake_minimum_required(VERSION 3.1)
25cmake_policy(VERSION 3.1)
Matt Sarett11466862016-02-19 13:41:30 -050026
xNombred07bb0d2020-03-10 20:17:12 +010027project(libpng C ASM)
Chris Craikb50c2172013-07-29 15:28:30 -070028enable_testing()
29
Patrick Scott5f6bd842010-06-28 16:55:16 -040030set(PNGLIB_MAJOR 1)
Chris Craikb50c2172013-07-29 15:28:30 -070031set(PNGLIB_MINOR 6)
xNombred07bb0d2020-03-10 20:17:12 +010032set(PNGLIB_RELEASE 38)
Patrick Scott5f6bd842010-06-28 16:55:16 -040033set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})
34set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
35
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -040036include(GNUInstallDirs)
37
xNombre232e9ca2020-07-03 22:10:22 +020038# Allow users to specify location of zlib.
xNombred07bb0d2020-03-10 20:17:12 +010039# Useful if zlib is being built alongside this as a sub-project.
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -040040option(PNG_BUILD_ZLIB "Custom zlib Location, else find_package is used" OFF)
41
xNombred07bb0d2020-03-10 20:17:12 +010042if(NOT PNG_BUILD_ZLIB)
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -040043 find_package(ZLIB REQUIRED)
xNombre232e9ca2020-07-03 22:10:22 +020044 include_directories(${ZLIB_INCLUDE_DIRS})
xNombred07bb0d2020-03-10 20:17:12 +010045endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -040046
xNombre232e9ca2020-07-03 22:10:22 +020047if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU AND NOT EMSCRIPTEN)
xNombred07bb0d2020-03-10 20:17:12 +010048 find_library(M_LIBRARY m)
Patrick Scott5f6bd842010-06-28 16:55:16 -040049else()
xNombre232e9ca2020-07-03 22:10:22 +020050 # libm is not needed and/or not available.
Patrick Scott5f6bd842010-06-28 16:55:16 -040051 set(M_LIBRARY "")
52endif()
53
xNombre232e9ca2020-07-03 22:10:22 +020054# Public CMake configuration variables.
Matt Sarett9b1fe632015-11-25 10:21:17 -050055option(PNG_SHARED "Build shared lib" ON)
56option(PNG_STATIC "Build static lib" ON)
xNombre232e9ca2020-07-03 22:10:22 +020057option(PNG_EXECUTABLES "Build libpng executables" ON)
58option(PNG_TESTS "Build libpng tests" ON)
Patrick Scott5f6bd842010-06-28 16:55:16 -040059
xNombre232e9ca2020-07-03 22:10:22 +020060# Many more configuration options could be added here.
Matt Sarett9b1fe632015-11-25 10:21:17 -050061option(PNG_FRAMEWORK "Build OS X framework" OFF)
xNombred07bb0d2020-03-10 20:17:12 +010062option(PNG_DEBUG "Build with debug output" OFF)
63option(PNG_HARDWARE_OPTIMIZATIONS "Enable hardware optimizations" ON)
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -040064
Matt Sarett11466862016-02-19 13:41:30 -050065set(PNG_PREFIX "" CACHE STRING "Prefix to add to the API function names")
66set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings")
67
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -040068if(PNG_HARDWARE_OPTIMIZATIONS)
xNombred07bb0d2020-03-10 20:17:12 +010069
xNombre232e9ca2020-07-03 22:10:22 +020070# Set definitions and sources for ARM.
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -040071if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR
72 CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
73 set(PNG_ARM_NEON_POSSIBLE_VALUES check on off)
xNombre232e9ca2020-07-03 22:10:22 +020074 set(PNG_ARM_NEON "check"
75 CACHE STRING "Enable ARM NEON optimizations: check|on|off; check is default")
76 set_property(CACHE PNG_ARM_NEON
77 PROPERTY STRINGS ${PNG_ARM_NEON_POSSIBLE_VALUES})
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -040078 list(FIND PNG_ARM_NEON_POSSIBLE_VALUES ${PNG_ARM_NEON} index)
79 if(index EQUAL -1)
xNombre232e9ca2020-07-03 22:10:22 +020080 message(FATAL_ERROR "PNG_ARM_NEON must be one of [${PNG_ARM_NEON_POSSIBLE_VALUES}]")
xNombred07bb0d2020-03-10 20:17:12 +010081 elseif(NOT ${PNG_ARM_NEON} STREQUAL "off")
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -040082 set(libpng_arm_sources
xNombre232e9ca2020-07-03 22:10:22 +020083 arm/arm_init.c
84 arm/filter_neon.S
85 arm/filter_neon_intrinsics.c
86 arm/palette_neon_intrinsics.c)
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -040087 if(${PNG_ARM_NEON} STREQUAL "on")
88 add_definitions(-DPNG_ARM_NEON_OPT=2)
89 elseif(${PNG_ARM_NEON} STREQUAL "check")
90 add_definitions(-DPNG_ARM_NEON_CHECK_SUPPORTED)
91 endif()
92 else()
93 add_definitions(-DPNG_ARM_NEON_OPT=0)
94 endif()
95endif()
96
xNombre232e9ca2020-07-03 22:10:22 +020097# Set definitions and sources for PowerPC.
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -040098if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR
xNombred07bb0d2020-03-10 20:17:12 +010099 CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*")
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400100 set(PNG_POWERPC_VSX_POSSIBLE_VALUES on off)
xNombre232e9ca2020-07-03 22:10:22 +0200101 set(PNG_POWERPC_VSX "on"
102 CACHE STRING "Enable POWERPC VSX optimizations: on|off; on is default")
103 set_property(CACHE PNG_POWERPC_VSX
104 PROPERTY STRINGS ${PNG_POWERPC_VSX_POSSIBLE_VALUES})
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400105 list(FIND PNG_POWERPC_VSX_POSSIBLE_VALUES ${PNG_POWERPC_VSX} index)
106 if(index EQUAL -1)
xNombre232e9ca2020-07-03 22:10:22 +0200107 message(FATAL_ERROR "PNG_POWERPC_VSX must be one of [${PNG_POWERPC_VSX_POSSIBLE_VALUES}]")
xNombred07bb0d2020-03-10 20:17:12 +0100108 elseif(NOT ${PNG_POWERPC_VSX} STREQUAL "off")
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400109 set(libpng_powerpc_sources
xNombre232e9ca2020-07-03 22:10:22 +0200110 powerpc/powerpc_init.c
111 powerpc/filter_vsx_intrinsics.c)
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400112 if(${PNG_POWERPC_VSX} STREQUAL "on")
113 add_definitions(-DPNG_POWERPC_VSX_OPT=2)
114 endif()
115 else()
116 add_definitions(-DPNG_POWERPC_VSX_OPT=0)
117 endif()
118endif()
119
xNombre232e9ca2020-07-03 22:10:22 +0200120# Set definitions and sources for Intel.
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400121if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR
xNombred07bb0d2020-03-10 20:17:12 +0100122 CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*")
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400123 set(PNG_INTEL_SSE_POSSIBLE_VALUES on off)
xNombre232e9ca2020-07-03 22:10:22 +0200124 set(PNG_INTEL_SSE "on"
125 CACHE STRING "Enable INTEL_SSE optimizations: on|off; on is default")
126 set_property(CACHE PNG_INTEL_SSE
127 PROPERTY STRINGS ${PNG_INTEL_SSE_POSSIBLE_VALUES})
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400128 list(FIND PNG_INTEL_SSE_POSSIBLE_VALUES ${PNG_INTEL_SSE} index)
129 if(index EQUAL -1)
xNombre232e9ca2020-07-03 22:10:22 +0200130 message(FATAL_ERROR "PNG_INTEL_SSE must be one of [${PNG_INTEL_SSE_POSSIBLE_VALUES}]")
xNombred07bb0d2020-03-10 20:17:12 +0100131 elseif(NOT ${PNG_INTEL_SSE} STREQUAL "off")
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400132 set(libpng_intel_sources
xNombre232e9ca2020-07-03 22:10:22 +0200133 intel/intel_init.c
134 intel/filter_sse2_intrinsics.c)
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400135 if(${PNG_INTEL_SSE} STREQUAL "on")
136 add_definitions(-DPNG_INTEL_SSE_OPT=1)
137 endif()
138 else()
139 add_definitions(-DPNG_INTEL_SSE_OPT=0)
140 endif()
141endif()
142
xNombre232e9ca2020-07-03 22:10:22 +0200143# Set definitions and sources for MIPS.
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400144if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR
xNombred07bb0d2020-03-10 20:17:12 +0100145 CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*")
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400146 set(PNG_MIPS_MSA_POSSIBLE_VALUES on off)
xNombre232e9ca2020-07-03 22:10:22 +0200147 set(PNG_MIPS_MSA "on"
148 CACHE STRING "Enable MIPS_MSA optimizations: on|off; on is default")
149 set_property(CACHE PNG_MIPS_MSA
150 PROPERTY STRINGS ${PNG_MIPS_MSA_POSSIBLE_VALUES})
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400151 list(FIND PNG_MIPS_MSA_POSSIBLE_VALUES ${PNG_MIPS_MSA} index)
152 if(index EQUAL -1)
xNombre232e9ca2020-07-03 22:10:22 +0200153 message(FATAL_ERROR "PNG_MIPS_MSA must be one of [${PNG_MIPS_MSA_POSSIBLE_VALUES}]")
xNombred07bb0d2020-03-10 20:17:12 +0100154 elseif(NOT ${PNG_MIPS_MSA} STREQUAL "off")
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400155 set(libpng_mips_sources
xNombre232e9ca2020-07-03 22:10:22 +0200156 mips/mips_init.c
157 mips/filter_msa_intrinsics.c)
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400158 if(${PNG_MIPS_MSA} STREQUAL "on")
159 add_definitions(-DPNG_MIPS_MSA_OPT=2)
160 endif()
161 else()
162 add_definitions(-DPNG_MIPS_MSA_OPT=0)
163 endif()
164endif()
xNombred07bb0d2020-03-10 20:17:12 +0100165
166else(PNG_HARDWARE_OPTIMIZATIONS)
167
xNombre232e9ca2020-07-03 22:10:22 +0200168# Set definitions and sources for ARM.
xNombred07bb0d2020-03-10 20:17:12 +0100169if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR
170 CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
171 add_definitions(-DPNG_ARM_NEON_OPT=0)
172endif()
173
xNombre232e9ca2020-07-03 22:10:22 +0200174# Set definitions and sources for PowerPC.
xNombred07bb0d2020-03-10 20:17:12 +0100175if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR
176 CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*")
177 add_definitions(-DPNG_POWERPC_VSX_OPT=0)
178endif()
179
xNombre232e9ca2020-07-03 22:10:22 +0200180# Set definitions and sources for Intel.
xNombred07bb0d2020-03-10 20:17:12 +0100181if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR
182 CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*")
183 add_definitions(-DPNG_INTEL_SSE_OPT=0)
184endif()
185
xNombre232e9ca2020-07-03 22:10:22 +0200186# Set definitions and sources for MIPS.
xNombred07bb0d2020-03-10 20:17:12 +0100187if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR
188 CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*")
189 add_definitions(-DPNG_MIPS_MSA_OPT=0)
190endif()
191
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400192endif(PNG_HARDWARE_OPTIMIZATIONS)
193
xNombre232e9ca2020-07-03 22:10:22 +0200194# Set PNG_LIB_NAME.
Patrick Scott5f6bd842010-06-28 16:55:16 -0400195set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
196
xNombre232e9ca2020-07-03 22:10:22 +0200197# Distinguish between debug and release builds.
Patrick Scott5f6bd842010-06-28 16:55:16 -0400198set(CMAKE_DEBUG_POSTFIX "d")
199
Matt Sarett11466862016-02-19 13:41:30 -0500200include(CheckCSourceCompiles)
201option(ld-version-script "Enable linker version script" ON)
202if(ld-version-script AND NOT APPLE)
203 # Check if LD supports linker scripts.
204 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" "VERS_1 {
205 global: sym;
206 local: *;
207};
208
209VERS_2 {
210 global: sym2;
211 main;
212} VERS_1;
213")
214 set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
215 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/conftest.map'")
216 check_c_source_compiles("void sym(void) {}
217void sym2(void) {}
218int main(void) {return 0;}
219" HAVE_LD_VERSION_SCRIPT)
220 if(NOT HAVE_LD_VERSION_SCRIPT)
221 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE} "-Wl,-M -Wl,${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
222 check_c_source_compiles("void sym(void) {}
223void sym2(void) {}
224int main(void) {return 0;}
225" HAVE_SOLARIS_LD_VERSION_SCRIPT)
226 endif()
227 set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
228 file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
229endif()
230
231# Find symbol prefix. Likely obsolete and unnecessary with recent
232# toolchains (it's not done in many other projects).
233function(symbol_prefix)
234 set(SYMBOL_PREFIX)
235
236 execute_process(COMMAND "${CMAKE_C_COMPILER}" "-E" "-"
237 INPUT_FILE /dev/null
238 OUTPUT_VARIABLE OUT
239 RESULT_VARIABLE STATUS)
240
241 if(CPP_FAIL)
242 message(WARNING "Failed to run the C preprocessor")
243 endif()
244
245 string(REPLACE "\n" ";" OUT "${OUT}")
246 foreach(line ${OUT})
247 string(REGEX MATCH "^PREFIX=" found_match "${line}")
248 if(found_match)
xNombred07bb0d2020-03-10 20:17:12 +0100249 string(REGEX REPLACE "^PREFIX=(.*\)" "\\1" prefix "${line}")
Matt Sarett11466862016-02-19 13:41:30 -0500250 string(REGEX MATCH "__USER_LABEL_PREFIX__" found_match "${prefix}")
251 if(found_match)
xNombred07bb0d2020-03-10 20:17:12 +0100252 string(REGEX REPLACE "(.*)__USER_LABEL_PREFIX__(.*)" "\\1\\2" prefix "${prefix}")
Matt Sarett11466862016-02-19 13:41:30 -0500253 endif()
254 set(SYMBOL_PREFIX "${prefix}")
255 endif()
256 endforeach()
257
xNombred07bb0d2020-03-10 20:17:12 +0100258 message(STATUS "Symbol prefix: ${SYMBOL_PREFIX}")
259 set(SYMBOL_PREFIX "${SYMBOL_PREFIX}" PARENT_SCOPE)
Matt Sarett11466862016-02-19 13:41:30 -0500260endfunction()
261
262if(UNIX)
263 symbol_prefix()
264endif()
265
266find_program(AWK NAMES gawk awk)
267
Chris Craikb50c2172013-07-29 15:28:30 -0700268include_directories(${CMAKE_CURRENT_BINARY_DIR})
Patrick Scott5f6bd842010-06-28 16:55:16 -0400269
xNombre232e9ca2020-07-03 22:10:22 +0200270if(NOT AWK OR ANDROID OR IOS)
Matt Sarett11466862016-02-19 13:41:30 -0500271 # No awk available to generate sources; use pre-built pnglibconf.h
272 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
273 ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
274 add_custom_target(genfiles) # Dummy
275else()
xNombre232e9ca2020-07-03 22:10:22 +0200276 # Generate .chk from .out with awk:
Matt Sarett11466862016-02-19 13:41:30 -0500277 # generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
xNombre232e9ca2020-07-03 22:10:22 +0200278 include(CMakeParseArguments)
Matt Sarett11466862016-02-19 13:41:30 -0500279 function(generate_chk)
280 set(options)
281 set(oneValueArgs INPUT OUTPUT)
282 set(multiValueArgs DEPENDS)
283 cmake_parse_arguments(_GC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
xNombred07bb0d2020-03-10 20:17:12 +0100284 if(NOT _GC_INPUT)
285 message(FATAL_ERROR "generate_chk: Missing INPUT argument")
Matt Sarett11466862016-02-19 13:41:30 -0500286 endif()
xNombred07bb0d2020-03-10 20:17:12 +0100287 if(NOT _GC_OUTPUT)
288 message(FATAL_ERROR "generate_chk: Missing OUTPUT argument")
Matt Sarett11466862016-02-19 13:41:30 -0500289 endif()
290
291 add_custom_command(OUTPUT "${_GC_OUTPUT}"
292 COMMAND "${CMAKE_COMMAND}"
293 "-DINPUT=${_GC_INPUT}"
294 "-DOUTPUT=${_GC_OUTPUT}"
295 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake"
296 DEPENDS "${_GC_INPUT}" ${_GC_DEPENDS}
297 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
298 endfunction()
299
300 # Generate .out from .c with awk
301 # generate_out(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
302 function(generate_out)
303 set(options)
304 set(oneValueArgs INPUT OUTPUT)
305 set(multiValueArgs DEPENDS)
306 cmake_parse_arguments(_GO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
xNombred07bb0d2020-03-10 20:17:12 +0100307 if(NOT _GO_INPUT)
308 message(FATAL_ERROR "generate_out: Missing INPUT argument")
Matt Sarett11466862016-02-19 13:41:30 -0500309 endif()
xNombred07bb0d2020-03-10 20:17:12 +0100310 if(NOT _GO_OUTPUT)
311 message(FATAL_ERROR "generate_out: Missing OUTPUT argument")
Matt Sarett11466862016-02-19 13:41:30 -0500312 endif()
313
314 add_custom_command(OUTPUT "${_GO_OUTPUT}"
315 COMMAND "${CMAKE_COMMAND}"
316 "-DINPUT=${_GO_INPUT}"
317 "-DOUTPUT=${_GO_OUTPUT}"
318 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake"
319 DEPENDS "${_GO_INPUT}" ${_GO_DEPENDS}
320 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
321 endfunction()
322
323 # Generate specific source file with awk
324 # generate_source(OUTPUT outputfile [DEPENDS dep1 [dep2...]])
325 function(generate_source)
326 set(options)
327 set(oneValueArgs OUTPUT)
328 set(multiValueArgs DEPENDS)
329 cmake_parse_arguments(_GSO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
xNombred07bb0d2020-03-10 20:17:12 +0100330 if(NOT _GSO_OUTPUT)
331 message(FATAL_ERROR "generate_source: Missing OUTPUT argument")
Matt Sarett11466862016-02-19 13:41:30 -0500332 endif()
333
334 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_GSO_OUTPUT}"
335 COMMAND "${CMAKE_COMMAND}"
336 "-DOUTPUT=${_GSO_OUTPUT}"
337 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
338 DEPENDS ${_GSO_DEPENDS}
339 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
340 endfunction()
341
342 # Copy file
343 function(generate_copy source destination)
344 add_custom_command(OUTPUT "${destination}"
xNombre232e9ca2020-07-03 22:10:22 +0200345 COMMAND "${CMAKE_COMMAND}"
346 -E remove "${destination}"
347 COMMAND "${CMAKE_COMMAND}"
348 -E copy "${source}" "${destination}"
Matt Sarett11466862016-02-19 13:41:30 -0500349 DEPENDS "${source}")
350 endfunction()
351
352 # Generate scripts/pnglibconf.h
353 generate_source(OUTPUT "scripts/pnglibconf.c"
354 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa"
355 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk"
356 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h")
357
358 # Generate pnglibconf.c
359 generate_source(OUTPUT "pnglibconf.c"
360 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.dfa"
361 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/options.awk"
362 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h")
363
364 if(PNG_PREFIX)
365 set(PNGLIBCONF_H_EXTRA_DEPENDS
366 "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
367 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/macro.lst")
368 set(PNGPREFIX_H_EXTRA_DEPENDS
369 "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out")
370 endif()
371
372 generate_out(INPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
373 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out")
374
375 # Generate pnglibconf.h
376 generate_source(OUTPUT "pnglibconf.h"
377 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out"
378 ${PNGLIBCONF_H_EXTRA_DEPENDS})
379
380 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/intprefix.c"
381 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out"
382 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
383
384 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/prefix.c"
385 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
386 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
387 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
388 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out")
389
390 # Generate pngprefix.h
391 generate_source(OUTPUT "pngprefix.h"
392 DEPENDS ${PNGPREFIX_H_EXTRA_DEPENDS})
393
394 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/sym.c"
395 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
396 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
397
398 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.c"
399 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
400 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
401 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
402 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt")
403
404 generate_out(INPUT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/vers.c"
405 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
406 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/png.h"
407 "${CMAKE_CURRENT_SOURCE_DIR}/pngconf.h"
408 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h")
409
410 generate_chk(INPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
411 OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"
412 DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk"
413 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def")
414
xNombre232e9ca2020-07-03 22:10:22 +0200415 add_custom_target(symbol-check
416 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk")
Matt Sarett11466862016-02-19 13:41:30 -0500417
418 generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
419 "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
420 generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
421 "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
422
xNombre232e9ca2020-07-03 22:10:22 +0200423 add_custom_target(genvers
424 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
425 add_custom_target(gensym
426 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
Matt Sarett11466862016-02-19 13:41:30 -0500427
428 add_custom_target("genprebuilt"
429 COMMAND "${CMAKE_COMMAND}"
430 "-DOUTPUT=scripts/pnglibconf.h.prebuilt"
431 -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
432 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
433
xNombre232e9ca2020-07-03 22:10:22 +0200434 # A single target handles generation of all generated files.
435 # If they are depended upon separately by multiple targets, this
Matt Sarett11466862016-02-19 13:41:30 -0500436 # confuses parallel make (it would require a separate top-level
437 # target for each file to track the dependencies properly).
xNombre232e9ca2020-07-03 22:10:22 +0200438 add_custom_target(genfiles
439 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym"
440 "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers"
441 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
442 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
443 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.out"
444 "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h"
445 "${CMAKE_CURRENT_BINARY_DIR}/scripts/intprefix.out"
446 "${CMAKE_CURRENT_BINARY_DIR}/scripts/pnglibconf.c"
447 "${CMAKE_CURRENT_BINARY_DIR}/scripts/prefix.out"
448 "${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
449 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"
450 "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"
451 "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out")
452endif(NOT AWK OR ANDROID OR IOS)
Matt Sarett11466862016-02-19 13:41:30 -0500453
xNombre232e9ca2020-07-03 22:10:22 +0200454# List the source code files.
Chris Craikb50c2172013-07-29 15:28:30 -0700455set(libpng_public_hdrs
xNombre232e9ca2020-07-03 22:10:22 +0200456 png.h
457 pngconf.h
458 "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
Chris Craikb50c2172013-07-29 15:28:30 -0700459)
Matt Sarett11466862016-02-19 13:41:30 -0500460set(libpng_private_hdrs
xNombre232e9ca2020-07-03 22:10:22 +0200461 pngpriv.h
462 pngdebug.h
463 pnginfo.h
464 pngstruct.h
Matt Sarett11466862016-02-19 13:41:30 -0500465)
xNombre232e9ca2020-07-03 22:10:22 +0200466if(AWK AND NOT ANDROID AND NOT IOS)
Matt Sarett11466862016-02-19 13:41:30 -0500467 list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h")
468endif()
469set(libpng_sources
xNombre232e9ca2020-07-03 22:10:22 +0200470 ${libpng_public_hdrs}
471 ${libpng_private_hdrs}
472 png.c
473 pngerror.c
474 pngget.c
475 pngmem.c
476 pngpread.c
477 pngread.c
478 pngrio.c
479 pngrtran.c
480 pngrutil.c
481 pngset.c
482 pngtrans.c
483 pngwio.c
484 pngwrite.c
485 pngwtran.c
486 pngwutil.c
487 ${libpng_arm_sources}
488 ${libpng_intel_sources}
489 ${libpng_mips_sources}
490 ${libpng_powerpc_sources}
Patrick Scott5f6bd842010-06-28 16:55:16 -0400491)
492set(pngtest_sources
xNombre232e9ca2020-07-03 22:10:22 +0200493 pngtest.c
Patrick Scott5f6bd842010-06-28 16:55:16 -0400494)
Chris Craikb50c2172013-07-29 15:28:30 -0700495set(pngvalid_sources
xNombre232e9ca2020-07-03 22:10:22 +0200496 contrib/libtests/pngvalid.c
Chris Craikb50c2172013-07-29 15:28:30 -0700497)
498set(pngstest_sources
xNombre232e9ca2020-07-03 22:10:22 +0200499 contrib/libtests/pngstest.c
Chris Craikb50c2172013-07-29 15:28:30 -0700500)
Matt Sarett11466862016-02-19 13:41:30 -0500501set(pngunknown_sources
xNombre232e9ca2020-07-03 22:10:22 +0200502 contrib/libtests/pngunknown.c
Matt Sarett11466862016-02-19 13:41:30 -0500503)
504set(pngimage_sources
xNombre232e9ca2020-07-03 22:10:22 +0200505 contrib/libtests/pngimage.c
Matt Sarett11466862016-02-19 13:41:30 -0500506)
507set(pngfix_sources
xNombre232e9ca2020-07-03 22:10:22 +0200508 contrib/tools/pngfix.c
Matt Sarett11466862016-02-19 13:41:30 -0500509)
510set(png_fix_itxt_sources
xNombre232e9ca2020-07-03 22:10:22 +0200511 contrib/tools/png-fix-itxt.c
Matt Sarett11466862016-02-19 13:41:30 -0500512)
Patrick Scott5f6bd842010-06-28 16:55:16 -0400513
Patrick Scott5f6bd842010-06-28 16:55:16 -0400514if(MSVC)
Chris Craikb50c2172013-07-29 15:28:30 -0700515 add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
xNombred07bb0d2020-03-10 20:17:12 +0100516endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -0400517
Patrick Scott5f6bd842010-06-28 16:55:16 -0400518if(PNG_DEBUG)
519 add_definitions(-DPNG_DEBUG)
520endif()
521
xNombre232e9ca2020-07-03 22:10:22 +0200522# Now build our target.
523include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIRS})
Patrick Scott5f6bd842010-06-28 16:55:16 -0400524
Chris Craikb50c2172013-07-29 15:28:30 -0700525unset(PNG_LIB_TARGETS)
526
Patrick Scott5f6bd842010-06-28 16:55:16 -0400527if(PNG_SHARED)
Matt Sarett11466862016-02-19 13:41:30 -0500528 add_library(png SHARED ${libpng_sources})
529 set(PNG_LIB_TARGETS png)
530 set_target_properties(png PROPERTIES OUTPUT_NAME ${PNG_LIB_NAME})
531 add_dependencies(png genfiles)
Patrick Scott5f6bd842010-06-28 16:55:16 -0400532 if(MSVC)
xNombre232e9ca2020-07-03 22:10:22 +0200533 # MVC does not append 'lib'. Do it here, to have consistent name.
Matt Sarett11466862016-02-19 13:41:30 -0500534 set_target_properties(png PROPERTIES PREFIX "lib")
535 set_target_properties(png PROPERTIES IMPORT_PREFIX "lib")
Patrick Scott5f6bd842010-06-28 16:55:16 -0400536 endif()
xNombre232e9ca2020-07-03 22:10:22 +0200537 target_link_libraries(png ${ZLIB_LIBRARIES} ${M_LIBRARY})
Matt Sarett11466862016-02-19 13:41:30 -0500538
539 if(UNIX AND AWK)
540 if(HAVE_LD_VERSION_SCRIPT)
xNombre232e9ca2020-07-03 22:10:22 +0200541 set_target_properties(png PROPERTIES
542 LINK_FLAGS "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
Matt Sarett11466862016-02-19 13:41:30 -0500543 elseif(HAVE_SOLARIS_LD_VERSION_SCRIPT)
xNombre232e9ca2020-07-03 22:10:22 +0200544 set_target_properties(png PROPERTIES
545 LINK_FLAGS "-Wl,-M -Wl,'${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
Matt Sarett11466862016-02-19 13:41:30 -0500546 endif()
547 endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -0400548endif()
549
550if(PNG_STATIC)
Matt Sarett9b1fe632015-11-25 10:21:17 -0500551 # does not work without changing name
Matt Sarett11466862016-02-19 13:41:30 -0500552 set(PNG_LIB_NAME_STATIC png_static)
553 add_library(png_static STATIC ${libpng_sources})
554 add_dependencies(png_static genfiles)
555 # MSVC doesn't use a different file extension for shared vs. static
xNombre232e9ca2020-07-03 22:10:22 +0200556 # libs. We are able to change OUTPUT_NAME to remove the _static
Matt Sarett11466862016-02-19 13:41:30 -0500557 # for all other platforms.
558 if(NOT MSVC)
559 set_target_properties(png_static PROPERTIES
xNombre232e9ca2020-07-03 22:10:22 +0200560 OUTPUT_NAME "${PNG_LIB_NAME}"
561 CLEAN_DIRECT_OUTPUT 1)
Matt Sarett11466862016-02-19 13:41:30 -0500562 else()
563 set_target_properties(png_static PROPERTIES
xNombre232e9ca2020-07-03 22:10:22 +0200564 OUTPUT_NAME "${PNG_LIB_NAME}_static"
565 CLEAN_DIRECT_OUTPUT 1)
Matt Sarett11466862016-02-19 13:41:30 -0500566 endif()
567 list(APPEND PNG_LIB_TARGETS png_static)
Patrick Scott5f6bd842010-06-28 16:55:16 -0400568 if(MSVC)
xNombre232e9ca2020-07-03 22:10:22 +0200569 # MSVC does not append 'lib'. Do it here, to have consistent name.
Matt Sarett11466862016-02-19 13:41:30 -0500570 set_target_properties(png_static PROPERTIES PREFIX "lib")
Patrick Scott5f6bd842010-06-28 16:55:16 -0400571 endif()
xNombre232e9ca2020-07-03 22:10:22 +0200572 target_link_libraries(png_static ${ZLIB_LIBRARIES} ${M_LIBRARY})
Patrick Scott5f6bd842010-06-28 16:55:16 -0400573endif()
574
Matt Sarett9b1fe632015-11-25 10:21:17 -0500575if(PNG_FRAMEWORK)
Matt Sarett11466862016-02-19 13:41:30 -0500576 set(PNG_LIB_NAME_FRAMEWORK png_framework)
577 add_library(png_framework SHARED ${libpng_sources})
578 add_dependencies(png_framework genfiles)
579 list(APPEND PNG_LIB_TARGETS png_framework)
580 set_target_properties(png_framework PROPERTIES
xNombre232e9ca2020-07-03 22:10:22 +0200581 FRAMEWORK TRUE
582 FRAMEWORK_VERSION ${PNGLIB_VERSION}
583 MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PNGLIB_MAJOR}.${PNGLIB_MINOR}
584 MACOSX_FRAMEWORK_BUNDLE_VERSION ${PNGLIB_VERSION}
585 MACOSX_FRAMEWORK_IDENTIFIER org.libpng.libpng
586 XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
587 PUBLIC_HEADER "${libpng_public_hdrs}"
588 OUTPUT_NAME png)
589 target_link_libraries(png_framework ${ZLIB_LIBRARIES} ${M_LIBRARY})
Matt Sarett9b1fe632015-11-25 10:21:17 -0500590endif()
591
Chris Craikb50c2172013-07-29 15:28:30 -0700592if(NOT PNG_LIB_TARGETS)
xNombre232e9ca2020-07-03 22:10:22 +0200593 message(SEND_ERROR "No library variant selected to build. "
594 "Please enable at least one of the following options: "
595 "PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")
Chris Craikb50c2172013-07-29 15:28:30 -0700596endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -0400597
598if(PNG_SHARED AND WIN32)
xNombre232e9ca2020-07-03 22:10:22 +0200599 set_target_properties(png PROPERTIES
600 DEFINE_SYMBOL PNG_BUILD_DLL)
Patrick Scott5f6bd842010-06-28 16:55:16 -0400601endif()
602
Matt Sarett11466862016-02-19 13:41:30 -0500603function(png_add_test)
604 set(options)
605 set(oneValueArgs NAME COMMAND)
606 set(multiValueArgs OPTIONS FILES)
607 cmake_parse_arguments(_PAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
608
xNombred07bb0d2020-03-10 20:17:12 +0100609 if(NOT _PAT_NAME)
610 message(FATAL_ERROR "png_add_test: Missing NAME argument")
Matt Sarett11466862016-02-19 13:41:30 -0500611 endif()
xNombred07bb0d2020-03-10 20:17:12 +0100612 if(NOT _PAT_COMMAND)
613 message(FATAL_ERROR "png_add_test: Missing COMMAND argument")
Matt Sarett11466862016-02-19 13:41:30 -0500614 endif()
615
616 set(TEST_OPTIONS "${_PAT_OPTIONS}")
617 set(TEST_FILES "${_PAT_FILES}")
618
619 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in"
xNombre232e9ca2020-07-03 22:10:22 +0200620 "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake"
621 @ONLY)
xNombred07bb0d2020-03-10 20:17:12 +0100622 add_test(NAME "${_PAT_NAME}"
623 COMMAND "${CMAKE_COMMAND}"
xNombre232e9ca2020-07-03 22:10:22 +0200624 "-DLIBPNG=$<TARGET_FILE:png>"
625 "-DTEST_COMMAND=$<TARGET_FILE:${_PAT_COMMAND}>"
626 -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")
Matt Sarett11466862016-02-19 13:41:30 -0500627endfunction()
628
Patrick Scott5f6bd842010-06-28 16:55:16 -0400629if(PNG_TESTS AND PNG_SHARED)
Matt Sarett11466862016-02-19 13:41:30 -0500630 # Find test PNG files by globbing, but sort lists to ensure
631 # consistency between different filesystems.
632 file(GLOB PNGSUITE_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/pngsuite/*.png")
633 list(SORT PNGSUITE_PNGS)
634 file(GLOB TEST_PNGS "${CMAKE_CURRENT_SOURCE_DIR}/contrib/testpngs/*.png")
635 list(SORT TEST_PNGS)
636
637 set(PNGTEST_PNG "${CMAKE_CURRENT_SOURCE_DIR}/pngtest.png")
638
Patrick Scott5f6bd842010-06-28 16:55:16 -0400639 add_executable(pngtest ${pngtest_sources})
Matt Sarett11466862016-02-19 13:41:30 -0500640 target_link_libraries(pngtest png)
641
xNombre232e9ca2020-07-03 22:10:22 +0200642 png_add_test(NAME pngtest
643 COMMAND pngtest
644 FILES "${PNGTEST_PNG}")
Matt Sarett11466862016-02-19 13:41:30 -0500645
Chris Craikb50c2172013-07-29 15:28:30 -0700646 add_executable(pngvalid ${pngvalid_sources})
Matt Sarett11466862016-02-19 13:41:30 -0500647 target_link_libraries(pngvalid png)
648
649 png_add_test(NAME pngvalid-gamma-16-to-8
xNombre232e9ca2020-07-03 22:10:22 +0200650 COMMAND pngvalid
651 OPTIONS --gamma-16-to-8)
Matt Sarett11466862016-02-19 13:41:30 -0500652 png_add_test(NAME pngvalid-gamma-alpha-mode
xNombre232e9ca2020-07-03 22:10:22 +0200653 COMMAND pngvalid
654 OPTIONS --gamma-alpha-mode)
Matt Sarett11466862016-02-19 13:41:30 -0500655 png_add_test(NAME pngvalid-gamma-background
xNombre232e9ca2020-07-03 22:10:22 +0200656 COMMAND pngvalid
657 OPTIONS --gamma-background)
Matt Sarett11466862016-02-19 13:41:30 -0500658 png_add_test(NAME pngvalid-gamma-expand16-alpha-mode
xNombre232e9ca2020-07-03 22:10:22 +0200659 COMMAND pngvalid
660 OPTIONS --gamma-alpha-mode --expand16)
Matt Sarett11466862016-02-19 13:41:30 -0500661 png_add_test(NAME pngvalid-gamma-expand16-background
xNombre232e9ca2020-07-03 22:10:22 +0200662 COMMAND pngvalid
663 OPTIONS --gamma-background --expand16)
Matt Sarett11466862016-02-19 13:41:30 -0500664 png_add_test(NAME pngvalid-gamma-expand16-transform
xNombre232e9ca2020-07-03 22:10:22 +0200665 COMMAND pngvalid
666 OPTIONS --gamma-transform --expand16)
Matt Sarett11466862016-02-19 13:41:30 -0500667 png_add_test(NAME pngvalid-gamma-sbit
xNombre232e9ca2020-07-03 22:10:22 +0200668 COMMAND pngvalid
669 OPTIONS --gamma-sbit)
Matt Sarett11466862016-02-19 13:41:30 -0500670 png_add_test(NAME pngvalid-gamma-threshold
xNombre232e9ca2020-07-03 22:10:22 +0200671 COMMAND pngvalid
672 OPTIONS --gamma-threshold)
Matt Sarett11466862016-02-19 13:41:30 -0500673 png_add_test(NAME pngvalid-gamma-transform
xNombre232e9ca2020-07-03 22:10:22 +0200674 COMMAND pngvalid
675 OPTIONS --gamma-transform)
Matt Sarett11466862016-02-19 13:41:30 -0500676 png_add_test(NAME pngvalid-progressive-interlace-standard
xNombre232e9ca2020-07-03 22:10:22 +0200677 COMMAND pngvalid
678 OPTIONS --standard --progressive-read --interlace)
Matt Sarett11466862016-02-19 13:41:30 -0500679 png_add_test(NAME pngvalid-progressive-size
xNombre232e9ca2020-07-03 22:10:22 +0200680 COMMAND pngvalid
681 OPTIONS --size --progressive-read)
Matt Sarett11466862016-02-19 13:41:30 -0500682 png_add_test(NAME pngvalid-progressive-standard
xNombre232e9ca2020-07-03 22:10:22 +0200683 COMMAND pngvalid
684 OPTIONS --standard --progressive-read)
Matt Sarett11466862016-02-19 13:41:30 -0500685 png_add_test(NAME pngvalid-standard
xNombre232e9ca2020-07-03 22:10:22 +0200686 COMMAND pngvalid
687 OPTIONS --standard)
Matt Sarett11466862016-02-19 13:41:30 -0500688 png_add_test(NAME pngvalid-transform
xNombre232e9ca2020-07-03 22:10:22 +0200689 COMMAND pngvalid
690 OPTIONS --transform)
Matt Sarett11466862016-02-19 13:41:30 -0500691
Chris Craikb50c2172013-07-29 15:28:30 -0700692 add_executable(pngstest ${pngstest_sources})
Matt Sarett11466862016-02-19 13:41:30 -0500693 target_link_libraries(pngstest png)
694
695 foreach(gamma_type 1.8 linear none sRGB)
696 foreach(alpha_type none alpha)
697 set(PNGSTEST_FILES)
698 foreach(test_png ${TEST_PNGS})
699 string(REGEX MATCH ".*-linear[-.].*" TEST_PNG_LINEAR "${test_png}")
700 string(REGEX MATCH ".*-sRGB[-.].*" TEST_PNG_SRGB "${test_png}")
701 string(REGEX MATCH ".*-1.8[-.].*" TEST_PNG_G18 "${test_png}")
702 string(REGEX MATCH ".*-alpha-.*" TEST_PNG_ALPHA "${test_png}")
703
704 set(TEST_PNG_VALID TRUE)
705
706 if(TEST_PNG_ALPHA)
xNombred07bb0d2020-03-10 20:17:12 +0100707 if(NOT "${alpha_type}" STREQUAL "alpha")
Matt Sarett11466862016-02-19 13:41:30 -0500708 set(TEST_PNG_VALID FALSE)
709 endif()
710 else()
xNombred07bb0d2020-03-10 20:17:12 +0100711 if("${alpha_type}" STREQUAL "alpha")
Matt Sarett11466862016-02-19 13:41:30 -0500712 set(TEST_PNG_VALID FALSE)
713 endif()
714 endif()
715
716 if(TEST_PNG_LINEAR)
717 if(NOT "${gamma_type}" STREQUAL "linear")
718 set(TEST_PNG_VALID FALSE)
719 endif()
720 elseif(TEST_PNG_SRGB)
721 if(NOT "${gamma_type}" STREQUAL "sRGB")
722 set(TEST_PNG_VALID FALSE)
723 endif()
724 elseif(TEST_PNG_G18)
725 if(NOT "${gamma_type}" STREQUAL "1.8")
726 set(TEST_PNG_VALID FALSE)
727 endif()
728 else()
729 if(NOT "${gamma_type}" STREQUAL "none")
730 set(TEST_PNG_VALID FALSE)
731 endif()
732 endif()
733
734 if(TEST_PNG_VALID)
735 list(APPEND PNGSTEST_FILES "${test_png}")
736 endif()
737 endforeach()
738 # Should already be sorted, but sort anyway to be certain.
739 list(SORT PNGSTEST_FILES)
740 png_add_test(NAME pngstest-${gamma_type}-${alpha_type}
741 COMMAND pngstest
742 OPTIONS --tmpfile "${gamma_type}-${alpha_type}-" --log
743 FILES ${PNGSTEST_FILES})
744 endforeach()
745 endforeach()
746
747 add_executable(pngunknown ${pngunknown_sources})
748 target_link_libraries(pngunknown png)
749
xNombre232e9ca2020-07-03 22:10:22 +0200750 png_add_test(NAME pngunknown-discard
751 COMMAND pngunknown
752 OPTIONS --strict default=discard
753 FILES "${PNGTEST_PNG}")
754 png_add_test(NAME pngunknown-IDAT
755 COMMAND pngunknown
756 OPTIONS --strict default=discard IDAT=save
757 FILES "${PNGTEST_PNG}")
758 png_add_test(NAME pngunknown-if-safe
759 COMMAND pngunknown
760 OPTIONS --strict default=if-safe
761 FILES "${PNGTEST_PNG}")
762 png_add_test(NAME pngunknown-sAPI
763 COMMAND pngunknown
764 OPTIONS --strict bKGD=save cHRM=save gAMA=save all=discard iCCP=save sBIT=save sRGB=save
765 FILES "${PNGTEST_PNG}")
766 png_add_test(NAME pngunknown-save
767 COMMAND pngunknown
768 OPTIONS --strict default=save
769 FILES "${PNGTEST_PNG}")
770 png_add_test(NAME pngunknown-sTER
771 COMMAND pngunknown
772 OPTIONS --strict sTER=if-safe
773 FILES "${PNGTEST_PNG}")
774 png_add_test(NAME pngunknown-vpAg
775 COMMAND pngunknown
776 OPTIONS --strict vpAg=if-safe
777 FILES "${PNGTEST_PNG}")
Matt Sarett11466862016-02-19 13:41:30 -0500778
779 add_executable(pngimage ${pngimage_sources})
780 target_link_libraries(pngimage png)
781
xNombre232e9ca2020-07-03 22:10:22 +0200782 png_add_test(NAME pngimage-quick
783 COMMAND pngimage
784 OPTIONS --list-combos --log
785 FILES ${PNGSUITE_PNGS})
786 png_add_test(NAME pngimage-full
787 COMMAND pngimage
788 OPTIONS --exhaustive --list-combos --log
789 FILES ${PNGSUITE_PNGS})
Matt Sarett11466862016-02-19 13:41:30 -0500790endif()
791
xNombre232e9ca2020-07-03 22:10:22 +0200792if(PNG_SHARED AND PNG_EXECUTABLES)
Matt Sarett11466862016-02-19 13:41:30 -0500793 add_executable(pngfix ${pngfix_sources})
794 target_link_libraries(pngfix png)
795 set(PNG_BIN_TARGETS pngfix)
796
797 add_executable(png-fix-itxt ${png_fix_itxt_sources})
xNombre232e9ca2020-07-03 22:10:22 +0200798 target_link_libraries(png-fix-itxt ${ZLIB_LIBRARIES} ${M_LIBRARY})
Matt Sarett11466862016-02-19 13:41:30 -0500799 list(APPEND PNG_BIN_TARGETS png-fix-itxt)
Patrick Scott5f6bd842010-06-28 16:55:16 -0400800endif()
801
xNombre232e9ca2020-07-03 22:10:22 +0200802# Creates a symlink from src to dest (if possible), or, alternatively,
803# copies src to dest if different.
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400804include(CMakeParseArguments)
xNombred07bb0d2020-03-10 20:17:12 +0100805function(create_symlink DEST_FILE)
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400806 cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN})
807
808 if(NOT S_TARGET AND NOT S_FILE)
xNombred07bb0d2020-03-10 20:17:12 +0100809 message(FATAL_ERROR "create_symlink: Missing TARGET or FILE argument")
810 endif()
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400811
812 if(S_TARGET AND S_FILE)
xNombre232e9ca2020-07-03 22:10:22 +0200813 message(FATAL_ERROR "create_symlink: "
814 "Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; "
815 "can only have one")
xNombred07bb0d2020-03-10 20:17:12 +0100816 endif()
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400817
818 if(S_FILE)
819 # If we don't need to symlink something that's coming from a build target,
820 # we can go ahead and symlink/copy at configure time.
xNombred07bb0d2020-03-10 20:17:12 +0100821 if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
xNombre232e9ca2020-07-03 22:10:22 +0200822 execute_process(COMMAND "${CMAKE_COMMAND}"
823 -E copy_if_different
824 ${S_FILE} ${DEST_FILE}
825 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
xNombred07bb0d2020-03-10 20:17:12 +0100826 else()
xNombre232e9ca2020-07-03 22:10:22 +0200827 execute_process(COMMAND "${CMAKE_COMMAND}"
828 -E create_symlink
829 ${S_FILE} ${DEST_FILE}
830 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
xNombred07bb0d2020-03-10 20:17:12 +0100831 endif()
832 endif()
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400833
834 if(S_TARGET)
xNombre232e9ca2020-07-03 22:10:22 +0200835 # We need to use generator expressions, which can be a bit tricky.
836 # For simplicity, make the symlink a POST_BUILD step, and use the TARGET
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400837 # signature of add_custom_command.
xNombred07bb0d2020-03-10 20:17:12 +0100838 if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
xNombre232e9ca2020-07-03 22:10:22 +0200839 add_custom_command(TARGET ${S_TARGET}
840 POST_BUILD
841 COMMAND "${CMAKE_COMMAND}"
842 -E copy_if_different
843 $<TARGET_LINKER_FILE_NAME:${S_TARGET}>
844 $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
xNombred07bb0d2020-03-10 20:17:12 +0100845 else()
xNombre232e9ca2020-07-03 22:10:22 +0200846 add_custom_command(TARGET ${S_TARGET}
847 POST_BUILD
848 COMMAND "${CMAKE_COMMAND}"
849 -E create_symlink
850 $<TARGET_LINKER_FILE_NAME:${S_TARGET}>
851 $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
xNombred07bb0d2020-03-10 20:17:12 +0100852 endif()
853 endif()
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400854endfunction()
Chris Craikb50c2172013-07-29 15:28:30 -0700855
Matt Sarett11466862016-02-19 13:41:30 -0500856# Create source generation scripts.
857configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in
xNombre232e9ca2020-07-03 22:10:22 +0200858 ${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake
859 @ONLY)
Matt Sarett11466862016-02-19 13:41:30 -0500860configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in
xNombre232e9ca2020-07-03 22:10:22 +0200861 ${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake
862 @ONLY)
Matt Sarett11466862016-02-19 13:41:30 -0500863configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in
xNombre232e9ca2020-07-03 22:10:22 +0200864 ${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake
865 @ONLY)
Matt Sarett11466862016-02-19 13:41:30 -0500866
Chris Craikb50c2172013-07-29 15:28:30 -0700867# libpng is a library so default to 'lib'
868if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
869 set(CMAKE_INSTALL_LIBDIR lib)
xNombred07bb0d2020-03-10 20:17:12 +0100870endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -0400871
xNombre232e9ca2020-07-03 22:10:22 +0200872# Create pkgconfig files.
xNombred07bb0d2020-03-10 20:17:12 +0100873# We use the same files like ./configure, so we have to set its vars.
xNombre232e9ca2020-07-03 22:10:22 +0200874# Only do this on Windows for Cygwin - the files don't make much sense
875# outside of a UNIX look-alike.
Chris Craikb50c2172013-07-29 15:28:30 -0700876if(NOT WIN32 OR CYGWIN OR MINGW)
877 set(prefix ${CMAKE_INSTALL_PREFIX})
878 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
xNombred07bb0d2020-03-10 20:17:12 +0100879 set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
880 set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
Chris Craikb50c2172013-07-29 15:28:30 -0700881 set(LIBS "-lz -lm")
882 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
xNombre232e9ca2020-07-03 22:10:22 +0200883 ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
884 @ONLY)
xNombred07bb0d2020-03-10 20:17:12 +0100885 create_symlink(libpng.pc FILE ${PNGLIB_NAME}.pc)
Chris Craikb50c2172013-07-29 15:28:30 -0700886 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
xNombre232e9ca2020-07-03 22:10:22 +0200887 ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
888 @ONLY)
xNombred07bb0d2020-03-10 20:17:12 +0100889 create_symlink(libpng-config FILE ${PNGLIB_NAME}-config)
890endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -0400891
xNombre232e9ca2020-07-03 22:10:22 +0200892# Set up links.
Patrick Scott5f6bd842010-06-28 16:55:16 -0400893if(PNG_SHARED)
Matt Sarett11466862016-02-19 13:41:30 -0500894 set_target_properties(png PROPERTIES
xNombred07bb0d2020-03-10 20:17:12 +0100895 VERSION 16.${PNGLIB_RELEASE}.git
896# VERSION 16.${PNGLIB_RELEASE}.0
Chris Craikb50c2172013-07-29 15:28:30 -0700897 SOVERSION 16
Patrick Scott5f6bd842010-06-28 16:55:16 -0400898 CLEAN_DIRECT_OUTPUT 1)
899endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -0400900
xNombre232e9ca2020-07-03 22:10:22 +0200901# Install.
xNombred07bb0d2020-03-10 20:17:12 +0100902if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
Chris Craikb50c2172013-07-29 15:28:30 -0700903 install(TARGETS ${PNG_LIB_TARGETS}
xNombred07bb0d2020-03-10 20:17:12 +0100904 EXPORT libpng
905 RUNTIME DESTINATION bin
906 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
907 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
908 FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})
Chris Craikb50c2172013-07-29 15:28:30 -0700909
Patrick Scott5f6bd842010-06-28 16:55:16 -0400910 if(PNG_SHARED)
Chris Craikb50c2172013-07-29 15:28:30 -0700911 # Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin
912 if(CYGWIN OR MINGW)
xNombred07bb0d2020-03-10 20:17:12 +0100913 create_symlink(libpng${CMAKE_IMPORT_LIBRARY_SUFFIX} TARGET png)
914 install(FILES $<TARGET_LINKER_FILE_DIR:png>/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}
915 DESTINATION ${CMAKE_INSTALL_LIBDIR})
916 endif()
Chris Craikb50c2172013-07-29 15:28:30 -0700917
918 if(NOT WIN32)
xNombred07bb0d2020-03-10 20:17:12 +0100919 create_symlink(libpng${CMAKE_SHARED_LIBRARY_SUFFIX} TARGET png)
920 install(FILES $<TARGET_LINKER_FILE_DIR:png>/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}
921 DESTINATION ${CMAKE_INSTALL_LIBDIR})
922 endif()
923 endif()
Chris Craikb50c2172013-07-29 15:28:30 -0700924
Patrick Scott5f6bd842010-06-28 16:55:16 -0400925 if(PNG_STATIC)
Chris Craikb50c2172013-07-29 15:28:30 -0700926 if(NOT WIN32 OR CYGWIN OR MINGW)
xNombred07bb0d2020-03-10 20:17:12 +0100927 create_symlink(libpng${CMAKE_STATIC_LIBRARY_SUFFIX} TARGET png_static)
928 install(FILES $<TARGET_LINKER_FILE_DIR:png_static>/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}
929 DESTINATION ${CMAKE_INSTALL_LIBDIR})
930 endif()
931 endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -0400932endif()
933
xNombred07bb0d2020-03-10 20:17:12 +0100934if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
xNombre232e9ca2020-07-03 22:10:22 +0200935 install(FILES ${libpng_public_hdrs}
936 DESTINATION include)
937 install(FILES ${libpng_public_hdrs}
938 DESTINATION include/${PNGLIB_NAME})
Patrick Scott5f6bd842010-06-28 16:55:16 -0400939endif()
xNombred07bb0d2020-03-10 20:17:12 +0100940if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL)
Chris Craikb50c2172013-07-29 15:28:30 -0700941 if(NOT WIN32 OR CYGWIN OR MINGW)
xNombre232e9ca2020-07-03 22:10:22 +0200942 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
943 DESTINATION bin)
944 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
945 DESTINATION bin)
xNombred07bb0d2020-03-10 20:17:12 +0100946 endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -0400947endif()
Chris Craikb50c2172013-07-29 15:28:30 -0700948
xNombred07bb0d2020-03-10 20:17:12 +0100949if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL)
Matt Sarett11466862016-02-19 13:41:30 -0500950 install(TARGETS ${PNG_BIN_TARGETS}
xNombred07bb0d2020-03-10 20:17:12 +0100951 RUNTIME DESTINATION bin)
Matt Sarett11466862016-02-19 13:41:30 -0500952endif()
953
xNombred07bb0d2020-03-10 20:17:12 +0100954if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL)
xNombre232e9ca2020-07-03 22:10:22 +0200955 # Install the man pages.
956 install(FILES libpng.3 libpngpf.3
957 DESTINATION ${CMAKE_INSTALL_MANDIR}/man3)
958 install(FILES png.5
959 DESTINATION ${CMAKE_INSTALL_MANDIR}/man5)
960 # Install the pkg-config files.
Leon Scroggins III3cc83ac2017-10-06 11:02:56 -0400961 if(NOT CMAKE_HOST_WIN32 OR CYGWIN OR MINGW)
Chris Craikb50c2172013-07-29 15:28:30 -0700962 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
963 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
964 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
xNombre232e9ca2020-07-03 22:10:22 +0200965 DESTINATION ${CMAKE_INSTALL_BINDIR})
Chris Craikb50c2172013-07-29 15:28:30 -0700966 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
967 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
968 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
xNombre232e9ca2020-07-03 22:10:22 +0200969 DESTINATION ${CMAKE_INSTALL_BINDIR})
xNombred07bb0d2020-03-10 20:17:12 +0100970 endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -0400971endif()
972
xNombred07bb0d2020-03-10 20:17:12 +0100973# Create an export file that CMake users can include() to import our targets.
974if(NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL)
xNombre232e9ca2020-07-03 22:10:22 +0200975 install(EXPORT libpng
976 DESTINATION lib/libpng
977 FILE lib${PNG_LIB_NAME}.cmake)
Chris Craikb50c2172013-07-29 15:28:30 -0700978endif()
Patrick Scott5f6bd842010-06-28 16:55:16 -0400979
xNombre232e9ca2020-07-03 22:10:22 +0200980# TODO: Create MSVC import lib for MinGW-compiled shared lib.
Patrick Scott5f6bd842010-06-28 16:55:16 -0400981# pexports libpng.dll > libpng.def
982# lib /def:libpng.def /machine:x86