# CMakeLists.txt\r
\r
-# Copyright (C) 2007,2009-2016 Glenn Randers-Pehrson\r
+# Copyright (C) 2018 Cosmin Truta\r
+# Copyright (C) 2007,2009-2018 Glenn Randers-Pehrson\r
# Written by Christian Ehrlicher, 2007\r
# Revised by Roger Lowman, 2009-2010\r
-# Revised by Clifford Yapp, 2011-2012\r
+# Revised by Clifford Yapp, 2011-2012,2017\r
# Revised by Roger Leigh, 2016\r
+# Revised by Andreas Franek, 2016\r
+# Revised by Sam Serrels, 2017\r
+# Revised by Vadim Barkov, 2017\r
+# Revised by Vicky Pfau, 2018\r
+# Revised by Cameron Cawley, 2018\r
+# Revised by Cosmin Truta, 2018\r
+# Revised by Kyle Bentley, 2018\r
\r
# This code is released under the libpng license.\r
# For conditions of distribution and use, see the disclaimer\r
# and license in png.h\r
\r
-cmake_minimum_required(VERSION 2.8.3)\r
-cmake_policy(VERSION 2.8.3)\r
-\r
-# Set MacOSX @rpath usage globally.\r
-if (POLICY CMP0020)\r
- cmake_policy(SET CMP0020 NEW)\r
-endif(POLICY CMP0020)\r
-if (POLICY CMP0042)\r
- cmake_policy(SET CMP0042 NEW)\r
-endif(POLICY CMP0042)\r
-# Use new variable expansion policy.\r
-if (POLICY CMP0053)\r
- cmake_policy(SET CMP0053 NEW)\r
-endif(POLICY CMP0053)\r
-if (POLICY CMP0054)\r
- cmake_policy(SET CMP0054 NEW)\r
-endif(POLICY CMP0054)\r
-\r
-set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")\r
-\r
-project(libpng C)\r
+cmake_minimum_required(VERSION 3.1)\r
+cmake_policy(VERSION 3.1)\r
+\r
+project(libpng C ASM)\r
enable_testing()\r
\r
set(PNGLIB_MAJOR 1)\r
set(PNGLIB_MINOR 6)\r
-set(PNGLIB_RELEASE 23)\r
+set(PNGLIB_RELEASE 37)\r
set(PNGLIB_NAME libpng${PNGLIB_MAJOR}${PNGLIB_MINOR})\r
set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})\r
\r
+include(GNUInstallDirs)\r
+\r
# needed packages\r
-find_package(ZLIB REQUIRED)\r
-include_directories(${ZLIB_INCLUDE_DIR})\r
-\r
-if(NOT WIN32)\r
- find_library(M_LIBRARY\r
- NAMES m\r
- PATHS /usr/lib /usr/local/lib\r
- )\r
- if(NOT M_LIBRARY)\r
- message(STATUS "math lib 'libm' not found; floating point support disabled")\r
- endif()\r
+\r
+# Allow users to specify location of Zlib.\r
+# Useful if zlib is being built alongside this as a sub-project.\r
+option(PNG_BUILD_ZLIB "Custom zlib Location, else find_package is used" OFF)\r
+\r
+if(NOT PNG_BUILD_ZLIB)\r
+ find_package(ZLIB REQUIRED)\r
+ include_directories(${ZLIB_INCLUDE_DIR})\r
+endif()\r
+\r
+if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU)\r
+ find_library(M_LIBRARY m)\r
else()\r
- # not needed on windows\r
+ # libm is not needed and/or not available\r
set(M_LIBRARY "")\r
endif()\r
\r
\r
# Many more configuration options could be added here\r
option(PNG_FRAMEWORK "Build OS X framework" OFF)\r
-option(PNG_DEBUG "Build with debug output" OFF)\r
-option(PNGARG "Disable ANSI-C prototypes" OFF)\r
+option(PNG_DEBUG "Build with debug output" OFF)\r
+option(PNG_HARDWARE_OPTIMIZATIONS "Enable hardware optimizations" ON)\r
\r
set(PNG_PREFIX "" CACHE STRING "Prefix to add to the API function names")\r
set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings")\r
\r
+if(PNG_HARDWARE_OPTIMIZATIONS)\r
+\r
+# set definitions and sources for arm\r
+if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR\r
+ CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")\r
+ set(PNG_ARM_NEON_POSSIBLE_VALUES check on off)\r
+ set(PNG_ARM_NEON "check" CACHE STRING "Enable ARM NEON optimizations:\r
+ check: (default) use internal checking code;\r
+ off: disable the optimizations;\r
+ on: turn on unconditionally.")\r
+ set_property(CACHE PNG_ARM_NEON PROPERTY STRINGS\r
+ ${PNG_ARM_NEON_POSSIBLE_VALUES})\r
+ list(FIND PNG_ARM_NEON_POSSIBLE_VALUES ${PNG_ARM_NEON} index)\r
+ if(index EQUAL -1)\r
+ message(FATAL_ERROR\r
+ "PNG_ARM_NEON must be one of [${PNG_ARM_NEON_POSSIBLE_VALUES}]")\r
+ elseif(NOT ${PNG_ARM_NEON} STREQUAL "off")\r
+ set(libpng_arm_sources\r
+ arm/arm_init.c\r
+ arm/filter_neon.S\r
+ arm/filter_neon_intrinsics.c\r
+ arm/palette_neon_intrinsics.c)\r
+\r
+ if(${PNG_ARM_NEON} STREQUAL "on")\r
+ add_definitions(-DPNG_ARM_NEON_OPT=2)\r
+ elseif(${PNG_ARM_NEON} STREQUAL "check")\r
+ add_definitions(-DPNG_ARM_NEON_CHECK_SUPPORTED)\r
+ endif()\r
+ else()\r
+ add_definitions(-DPNG_ARM_NEON_OPT=0)\r
+ endif()\r
+endif()\r
+\r
+# set definitions and sources for powerpc\r
+if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR\r
+ CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*")\r
+ set(PNG_POWERPC_VSX_POSSIBLE_VALUES on off)\r
+ set(PNG_POWERPC_VSX "on" CACHE STRING "Enable POWERPC VSX optimizations:\r
+ off: disable the optimizations.")\r
+ set_property(CACHE PNG_POWERPC_VSX PROPERTY STRINGS\r
+ ${PNG_POWERPC_VSX_POSSIBLE_VALUES})\r
+ list(FIND PNG_POWERPC_VSX_POSSIBLE_VALUES ${PNG_POWERPC_VSX} index)\r
+ if(index EQUAL -1)\r
+ message(FATAL_ERROR\r
+ "PNG_POWERPC_VSX must be one of [${PNG_POWERPC_VSX_POSSIBLE_VALUES}]")\r
+ elseif(NOT ${PNG_POWERPC_VSX} STREQUAL "off")\r
+ set(libpng_powerpc_sources\r
+ powerpc/powerpc_init.c\r
+ powerpc/filter_vsx_intrinsics.c)\r
+ if(${PNG_POWERPC_VSX} STREQUAL "on")\r
+ add_definitions(-DPNG_POWERPC_VSX_OPT=2)\r
+ endif()\r
+ else()\r
+ add_definitions(-DPNG_POWERPC_VSX_OPT=0)\r
+ endif()\r
+endif()\r
+\r
+# set definitions and sources for intel\r
+if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR\r
+ CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*")\r
+ set(PNG_INTEL_SSE_POSSIBLE_VALUES on off)\r
+ set(PNG_INTEL_SSE "on" CACHE STRING "Enable INTEL_SSE optimizations:\r
+ off: disable the optimizations")\r
+ set_property(CACHE PNG_INTEL_SSE PROPERTY STRINGS\r
+ ${PNG_INTEL_SSE_POSSIBLE_VALUES})\r
+ list(FIND PNG_INTEL_SSE_POSSIBLE_VALUES ${PNG_INTEL_SSE} index)\r
+ if(index EQUAL -1)\r
+ message(FATAL_ERROR\r
+ "PNG_INTEL_SSE must be one of [${PNG_INTEL_SSE_POSSIBLE_VALUES}]")\r
+ elseif(NOT ${PNG_INTEL_SSE} STREQUAL "off")\r
+ set(libpng_intel_sources\r
+ intel/intel_init.c\r
+ intel/filter_sse2_intrinsics.c)\r
+ if(${PNG_INTEL_SSE} STREQUAL "on")\r
+ add_definitions(-DPNG_INTEL_SSE_OPT=1)\r
+ endif()\r
+ else()\r
+ add_definitions(-DPNG_INTEL_SSE_OPT=0)\r
+ endif()\r
+endif()\r
+\r
+# set definitions and sources for MIPS\r
+if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR\r
+ CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*")\r
+ set(PNG_MIPS_MSA_POSSIBLE_VALUES on off)\r
+ set(PNG_MIPS_MSA "on" CACHE STRING "Enable MIPS_MSA optimizations:\r
+ off: disable the optimizations")\r
+ set_property(CACHE PNG_MIPS_MSA PROPERTY STRINGS\r
+ ${PNG_MIPS_MSA_POSSIBLE_VALUES})\r
+ list(FIND PNG_MIPS_MSA_POSSIBLE_VALUES ${PNG_MIPS_MSA} index)\r
+ if(index EQUAL -1)\r
+ message(FATAL_ERROR\r
+ "PNG_MIPS_MSA must be one of [${PNG_MIPS_MSA_POSSIBLE_VALUES}]")\r
+ elseif(NOT ${PNG_MIPS_MSA} STREQUAL "off")\r
+ set(libpng_mips_sources\r
+ mips/mips_init.c\r
+ mips/filter_msa_intrinsics.c)\r
+ if(${PNG_MIPS_MSA} STREQUAL "on")\r
+ add_definitions(-DPNG_MIPS_MSA_OPT=2)\r
+ endif()\r
+ else()\r
+ add_definitions(-DPNG_MIPS_MSA_OPT=0)\r
+ endif()\r
+endif()\r
+\r
+else(PNG_HARDWARE_OPTIMIZATIONS)\r
+\r
+# set definitions and sources for arm\r
+if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR\r
+ CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")\r
+ add_definitions(-DPNG_ARM_NEON_OPT=0)\r
+endif()\r
+\r
+# set definitions and sources for powerpc\r
+if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR\r
+ CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*")\r
+ add_definitions(-DPNG_POWERPC_VSX_OPT=0)\r
+endif()\r
+\r
+# set definitions and sources for intel\r
+if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR\r
+ CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*")\r
+ add_definitions(-DPNG_INTEL_SSE_OPT=0)\r
+endif()\r
+\r
+# set definitions and sources for MIPS\r
+if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR\r
+ CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*")\r
+ add_definitions(-DPNG_MIPS_MSA_OPT=0)\r
+endif()\r
+\r
+endif(PNG_HARDWARE_OPTIMIZATIONS)\r
+\r
# SET LIBNAME\r
set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})\r
\r
foreach(line ${OUT})\r
string(REGEX MATCH "^PREFIX=" found_match "${line}")\r
if(found_match)\r
- STRING(REGEX REPLACE "^PREFIX=(.*\)" "\\1" prefix "${line}")\r
+ string(REGEX REPLACE "^PREFIX=(.*\)" "\\1" prefix "${line}")\r
string(REGEX MATCH "__USER_LABEL_PREFIX__" found_match "${prefix}")\r
if(found_match)\r
- STRING(REGEX REPLACE "(.*)__USER_LABEL_PREFIX__(.*)" "\\1\\2" prefix "${prefix}")\r
+ string(REGEX REPLACE "(.*)__USER_LABEL_PREFIX__(.*)" "\\1\\2" prefix "${prefix}")\r
endif()\r
set(SYMBOL_PREFIX "${prefix}")\r
endif()\r
endforeach()\r
\r
- message(STATUS "Symbol prefix: ${SYMBOL_PREFIX}")\r
- set(SYMBOL_PREFIX "${SYMBOL_PREFIX}" PARENT_SCOPE)\r
+ message(STATUS "Symbol prefix: ${SYMBOL_PREFIX}")\r
+ set(SYMBOL_PREFIX "${SYMBOL_PREFIX}" PARENT_SCOPE)\r
endfunction()\r
\r
if(UNIX)\r
\r
include_directories(${CMAKE_CURRENT_BINARY_DIR})\r
\r
-if(NOT AWK)\r
+if(NOT AWK OR ANDROID)\r
# No awk available to generate sources; use pre-built pnglibconf.h\r
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt\r
${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)\r
set(oneValueArgs INPUT OUTPUT)\r
set(multiValueArgs DEPENDS)\r
cmake_parse_arguments(_GC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})\r
- if (NOT _GC_INPUT)\r
- message(FATAL_ERROR "Invalid arguments. generate_out requires input.")\r
+ if(NOT _GC_INPUT)\r
+ message(FATAL_ERROR "generate_chk: Missing INPUT argument")\r
endif()\r
- if (NOT _GC_OUTPUT)\r
- message(FATAL_ERROR "Invalid arguments. generate_out requires output.")\r
+ if(NOT _GC_OUTPUT)\r
+ message(FATAL_ERROR "generate_chk: Missing OUTPUT argument")\r
endif()\r
\r
add_custom_command(OUTPUT "${_GC_OUTPUT}"\r
set(oneValueArgs INPUT OUTPUT)\r
set(multiValueArgs DEPENDS)\r
cmake_parse_arguments(_GO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})\r
- if (NOT _GO_INPUT)\r
- message(FATAL_ERROR "Invalid arguments. generate_out requires input.")\r
+ if(NOT _GO_INPUT)\r
+ message(FATAL_ERROR "generate_out: Missing INPUT argument")\r
endif()\r
- if (NOT _GO_OUTPUT)\r
- message(FATAL_ERROR "Invalid arguments. generate_out requires output.")\r
+ if(NOT _GO_OUTPUT)\r
+ message(FATAL_ERROR "generate_out: Missing OUTPUT argument")\r
endif()\r
\r
add_custom_command(OUTPUT "${_GO_OUTPUT}"\r
set(oneValueArgs OUTPUT)\r
set(multiValueArgs DEPENDS)\r
cmake_parse_arguments(_GSO "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})\r
- if (NOT _GSO_OUTPUT)\r
- message(FATAL_ERROR "Invalid arguments. generate_source requires output.")\r
+ if(NOT _GSO_OUTPUT)\r
+ message(FATAL_ERROR "generate_source: Missing OUTPUT argument")\r
endif()\r
\r
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_GSO_OUTPUT}"\r
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")\r
\r
# A single target handles generation of all generated files. If\r
- # they are dependend upon separately by multiple targets, this\r
+ # they are depended upon separately by multiple targets, this\r
# confuses parallel make (it would require a separate top-level\r
# target for each file to track the dependencies properly).\r
add_custom_target(genfiles DEPENDS\r
"${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk"\r
"${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out"\r
"${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out")\r
-endif(NOT AWK)\r
+endif(NOT AWK OR ANDROID)\r
\r
# OUR SOURCES\r
set(libpng_public_hdrs\r
pnginfo.h\r
pngstruct.h\r
)\r
-if(AWK)\r
+if(AWK AND NOT ANDROID)\r
list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h")\r
endif()\r
set(libpng_sources\r
pngwrite.c\r
pngwtran.c\r
pngwutil.c\r
+ ${libpng_arm_sources}\r
+ ${libpng_intel_sources}\r
+ ${libpng_mips_sources}\r
+ ${libpng_powerpc_sources}\r
)\r
set(pngtest_sources\r
pngtest.c\r
\r
if(MSVC)\r
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)\r
-endif(MSVC)\r
+endif()\r
\r
if(PNG_DEBUG)\r
add_definitions(-DPNG_DEBUG)\r
message(SEND_ERROR\r
"No library variant selected to build. "\r
"Please enable at least one of the following options: "\r
- " PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")\r
+ "PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")\r
endif()\r
\r
if(PNG_SHARED AND WIN32)\r
set(multiValueArgs OPTIONS FILES)\r
cmake_parse_arguments(_PAT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})\r
\r
- if (NOT _PAT_NAME)\r
- message(FATAL_ERROR "Invalid arguments. png_add_test requires name.")\r
+ if(NOT _PAT_NAME)\r
+ message(FATAL_ERROR "png_add_test: Missing NAME argument")\r
endif()\r
- if (NOT _PAT_COMMAND)\r
- message(FATAL_ERROR "Invalid arguments. png_add_test requires command.")\r
+ if(NOT _PAT_COMMAND)\r
+ message(FATAL_ERROR "png_add_test: Missing COMMAND argument")\r
endif()\r
\r
set(TEST_OPTIONS "${_PAT_OPTIONS}")\r
\r
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in"\r
"${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake" @ONLY)\r
- if(CMAKE_MAJOR_VERSION GREATER 2) # have generator expressions\r
- add_test(NAME "${_PAT_NAME}"\r
- COMMAND "${CMAKE_COMMAND}"\r
- "-DLIBPNG=$<TARGET_FILE:png>"\r
- "-DTEST_COMMAND=$<TARGET_FILE:${_PAT_COMMAND}>"\r
- -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")\r
- else() # old 2.x add_test; limited and won't work well on Windows\r
- # Note LIBPNG is a dummy value as there are no generator expressions\r
- add_test("${_PAT_NAME}" "${CMAKE_COMMAND}"\r
- "-DLIBPNG=${CMAKE_CURRENT_BINARY_DIR}/libpng.so"\r
- "-DTEST_COMMAND=./${_PAT_COMMAND}"\r
- -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")\r
- endif()\r
+ add_test(NAME "${_PAT_NAME}"\r
+ COMMAND "${CMAKE_COMMAND}"\r
+ "-DLIBPNG=$<TARGET_FILE:png>"\r
+ "-DTEST_COMMAND=$<TARGET_FILE:${_PAT_COMMAND}>"\r
+ -P "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake")\r
endfunction()\r
\r
if(PNG_TESTS AND PNG_SHARED)\r
set(TEST_PNG_VALID TRUE)\r
\r
if(TEST_PNG_ALPHA)\r
- if (NOT "${alpha_type}" STREQUAL "alpha")\r
+ if(NOT "${alpha_type}" STREQUAL "alpha")\r
set(TEST_PNG_VALID FALSE)\r
endif()\r
else()\r
- if ("${alpha_type}" STREQUAL "alpha")\r
+ if("${alpha_type}" STREQUAL "alpha")\r
set(TEST_PNG_VALID FALSE)\r
endif()\r
endif()\r
list(APPEND PNG_BIN_TARGETS png-fix-itxt)\r
endif()\r
\r
-# Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set\r
-IF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)\r
- SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "lib")\r
-ENDIF(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)\r
-\r
# Set a variable with CMake code which:\r
# Creates a symlink from src to dest (if possible) or alternatively\r
# copies if different.\r
-macro(CREATE_SYMLINK SRC_FILE DEST_FILE)\r
- FILE(REMOVE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})\r
- if(WIN32 AND NOT CYGWIN AND NOT MSYS)\r
- ADD_CUSTOM_COMMAND(\r
- OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}\r
- COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE}\r
- COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SRC_FILE}" ${CMAKE_CURRENT_BINARY_DIR}/${DEST_FILE}\r
- DEPENDS ${PNG_LIB_TARGETS}\r
- )\r
- ADD_CUSTOM_TARGET(${DEST_FILE}_COPY ALL DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE})\r
- else(WIN32 AND NOT CYGWIN AND NOT MSYS)\r
- get_filename_component(LINK_TARGET "${SRC_FILE}" NAME)\r
- execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_LIBRARY_OUTPUT_DIRECTORY})\r
- execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})\r
- execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${LINK_TARGET}" ${DEST_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})\r
- endif(WIN32 AND NOT CYGWIN AND NOT MSYS)\r
-endmacro()\r
+include(CMakeParseArguments)\r
+\r
+function(create_symlink DEST_FILE)\r
+\r
+ cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN})\r
+\r
+ if(NOT S_TARGET AND NOT S_FILE)\r
+ message(FATAL_ERROR "create_symlink: Missing TARGET or FILE argument")\r
+ endif()\r
+\r
+ if(S_TARGET AND S_FILE)\r
+ message(FATAL_ERROR "create_symlink: Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; can only have one.")\r
+ endif()\r
+\r
+ if(S_FILE)\r
+ # If we don't need to symlink something that's coming from a build target,\r
+ # we can go ahead and symlink/copy at configure time.\r
+ if(CMAKE_HOST_WIN32 AND NOT CYGWIN)\r
+ execute_process(\r
+ COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${S_FILE} ${DEST_FILE}\r
+ WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")\r
+ else()\r
+ execute_process(\r
+ COMMAND ${CMAKE_COMMAND} -E create_symlink ${S_FILE} ${DEST_FILE}\r
+ WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")\r
+ endif()\r
+ endif()\r
+\r
+ if(S_TARGET)\r
+ # We need to use generator expressions, which can be a bit tricky, so for\r
+ # simplicity make the symlink a POST_BUILD step and use the TARGET\r
+ # signature of add_custom_command.\r
+ if(CMAKE_HOST_WIN32 AND NOT CYGWIN)\r
+ add_custom_command(TARGET ${S_TARGET} POST_BUILD\r
+ COMMAND "${CMAKE_COMMAND}" -E copy_if_different $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})\r
+ else()\r
+ add_custom_command(TARGET ${S_TARGET} POST_BUILD\r
+ COMMAND "${CMAKE_COMMAND}" -E create_symlink $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})\r
+ endif()\r
+ endif()\r
+\r
+endfunction()\r
\r
# Create source generation scripts.\r
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in\r
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in\r
${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake @ONLY)\r
\r
-\r
# libpng is a library so default to 'lib'\r
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)\r
set(CMAKE_INSTALL_LIBDIR lib)\r
-endif(NOT DEFINED CMAKE_INSTALL_LIBDIR)\r
+endif()\r
\r
# CREATE PKGCONFIG FILES\r
-# we use the same files like ./configure, so we have to set its vars\r
+# We use the same files like ./configure, so we have to set its vars.\r
# Only do this on Windows for Cygwin - the files don't make much sense outside\r
-# a UNIX look alike\r
+# of a UNIX look-alike.\r
if(NOT WIN32 OR CYGWIN OR MINGW)\r
set(prefix ${CMAKE_INSTALL_PREFIX})\r
set(exec_prefix ${CMAKE_INSTALL_PREFIX})\r
- set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})\r
- set(includedir ${CMAKE_INSTALL_PREFIX}/include)\r
+ set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})\r
+ set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})\r
set(LIBS "-lz -lm")\r
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in\r
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY)\r
- CREATE_SYMLINK(${PNGLIB_NAME}.pc libpng.pc)\r
+ create_symlink(libpng.pc FILE ${PNGLIB_NAME}.pc)\r
\r
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in\r
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY)\r
- CREATE_SYMLINK(${PNGLIB_NAME}-config libpng-config)\r
-endif(NOT WIN32 OR CYGWIN OR MINGW)\r
+ create_symlink(libpng-config FILE ${PNGLIB_NAME}-config)\r
+endif()\r
\r
# SET UP LINKS\r
if(PNG_SHARED)\r
set_target_properties(png PROPERTIES\r
-# VERSION 16.${PNGLIB_RELEASE}.1.6.23\r
+# VERSION 16.${PNGLIB_RELEASE}.1.6.37\r
VERSION 16.${PNGLIB_RELEASE}.0\r
SOVERSION 16\r
CLEAN_DIRECT_OUTPUT 1)\r
endif()\r
\r
-# If CMake > 2.4.x, we set a variable used below to export\r
-# targets to an export file.\r
-# TODO: Use VERSION_GREATER after our cmake_minimum_required >= 2.6.2\r
-if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 4)\r
- set(PNG_EXPORT_RULE EXPORT libpng)\r
-elseif(CMAKE_MAJOR_VERSION GREATER 2) # future proof\r
- set(PNG_EXPORT_RULE EXPORT libpng)\r
-endif()\r
-\r
# INSTALL\r
-if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )\r
+if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)\r
install(TARGETS ${PNG_LIB_TARGETS}\r
- ${PNG_EXPORT_RULE}\r
- RUNTIME DESTINATION bin\r
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}\r
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}\r
- FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})\r
+ EXPORT libpng\r
+ RUNTIME DESTINATION bin\r
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}\r
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}\r
+ FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR})\r
\r
if(PNG_SHARED)\r
# Create a symlink for libpng.dll.a => libpng16.dll.a on Cygwin\r
if(CYGWIN OR MINGW)\r
- get_target_property(BUILD_TARGET_LOCATION png LOCATION_${CMAKE_BUILD_TYPE})\r
- CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_IMPORT_LIBRARY_SUFFIX})\r
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}\r
- DESTINATION ${CMAKE_INSTALL_LIBDIR})\r
- endif(CYGWIN OR MINGW)\r
+ create_symlink(libpng${CMAKE_IMPORT_LIBRARY_SUFFIX} TARGET png)\r
+ install(FILES $<TARGET_LINKER_FILE_DIR:png>/libpng${CMAKE_IMPORT_LIBRARY_SUFFIX}\r
+ DESTINATION ${CMAKE_INSTALL_LIBDIR})\r
+ endif()\r
\r
if(NOT WIN32)\r
- get_target_property(BUILD_TARGET_LOCATION png LOCATION_${CMAKE_BUILD_TYPE})\r
- CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_SHARED_LIBRARY_SUFFIX})\r
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}\r
- DESTINATION ${CMAKE_INSTALL_LIBDIR})\r
- endif(NOT WIN32)\r
- endif(PNG_SHARED)\r
+ create_symlink(libpng${CMAKE_SHARED_LIBRARY_SUFFIX} TARGET png)\r
+ install(FILES $<TARGET_LINKER_FILE_DIR:png>/libpng${CMAKE_SHARED_LIBRARY_SUFFIX}\r
+ DESTINATION ${CMAKE_INSTALL_LIBDIR})\r
+ endif()\r
+ endif()\r
\r
if(PNG_STATIC)\r
if(NOT WIN32 OR CYGWIN OR MINGW)\r
- get_target_property(BUILD_TARGET_LOCATION png_static LOCATION_${CMAKE_BUILD_TYPE})\r
- CREATE_SYMLINK(${BUILD_TARGET_LOCATION} libpng${CMAKE_STATIC_LIBRARY_SUFFIX})\r
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}\r
- DESTINATION ${CMAKE_INSTALL_LIBDIR})\r
- endif(NOT WIN32 OR CYGWIN OR MINGW)\r
- endif()\r
+ create_symlink(libpng${CMAKE_STATIC_LIBRARY_SUFFIX} TARGET png_static)\r
+ install(FILES $<TARGET_LINKER_FILE_DIR:png_static>/libpng${CMAKE_STATIC_LIBRARY_SUFFIX}\r
+ DESTINATION ${CMAKE_INSTALL_LIBDIR})\r
+ endif()\r
+ endif()\r
endif()\r
\r
-if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )\r
- install(FILES ${libpng_public_hdrs} DESTINATION include)\r
- install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME})\r
+if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)\r
+ install(FILES ${libpng_public_hdrs} DESTINATION include)\r
+ install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME})\r
endif()\r
-if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL )\r
+if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL)\r
if(NOT WIN32 OR CYGWIN OR MINGW)\r
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin)\r
- install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config\r
- DESTINATION bin)\r
- endif(NOT WIN32 OR CYGWIN OR MINGW)\r
+ install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config DESTINATION bin)\r
+ endif()\r
endif()\r
\r
-if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL )\r
+if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL)\r
install(TARGETS ${PNG_BIN_TARGETS}\r
- RUNTIME DESTINATION bin)\r
+ RUNTIME DESTINATION bin)\r
endif()\r
\r
-if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )\r
+if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL)\r
# Install man pages\r
if(NOT PNG_MAN_DIR)\r
set(PNG_MAN_DIR "share/man")\r
endif()\r
- install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)\r
- install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)\r
+ install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3)\r
+ install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5)\r
# Install pkg-config files\r
- if(NOT WIN32 OR CYGWIN OR MINGW)\r
+ if(NOT CMAKE_HOST_WIN32 OR CYGWIN OR MINGW)\r
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc\r
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)\r
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config\r
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)\r
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config\r
DESTINATION bin)\r
- endif(NOT WIN32 OR CYGWIN OR MINGW)\r
+ endif()\r
endif()\r
\r
-# On versions of CMake that support it, create an export file CMake\r
-# users can include() to import our targets\r
-if(PNG_EXPORT_RULE AND NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL )\r
+# Create an export file that CMake users can include() to import our targets.\r
+if(NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL)\r
install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake)\r
endif()\r
\r
# to create msvc import lib for mingw compiled shared lib\r
# pexports libpng.dll > libpng.def\r
# lib /def:libpng.def /machine:x86\r
-\r