]> git.lizzy.rs Git - irrlicht.git/blobdiff - source/Irrlicht/libpng/CMakeLists.txt
Merging r6145 through r6171 from trunk to ogl-es branch
[irrlicht.git] / source / Irrlicht / libpng / CMakeLists.txt
index ddc796b84e6e309bfb752d4bd9c74fd0a674e781..73668ccd97fb7658a9ec2e5e78df33c7534e25cb 100644 (file)
@@ -1,58 +1,52 @@
 # 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
@@ -63,12 +57,145 @@ option(PNG_TESTS  "Build libpng tests" ON)
 \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
@@ -124,17 +251,17 @@ function(symbol_prefix)
   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
@@ -145,7 +272,7 @@ find_program(AWK NAMES gawk awk)
 \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
@@ -159,11 +286,11 @@ else()
     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
@@ -182,11 +309,11 @@ else()
     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
@@ -205,8 +332,8 @@ else()
     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
@@ -307,7 +434,7 @@ else()
                     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
@@ -324,7 +451,7 @@ else()
     "${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
@@ -338,7 +465,7 @@ set(libpng_private_hdrs
   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
@@ -359,6 +486,10 @@ set(libpng_sources
   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
@@ -384,7 +515,7 @@ set(png_fix_itxt_sources
 \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
@@ -464,7 +595,7 @@ if(NOT PNG_LIB_TARGETS)
   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
@@ -477,11 +608,11 @@ function(png_add_test)
   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
@@ -489,19 +620,11 @@ function(png_add_test)
 \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
@@ -566,11 +689,11 @@ if(PNG_TESTS AND PNG_SHARED)
         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
@@ -634,31 +757,51 @@ if(PNG_SHARED)
   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
@@ -668,111 +811,97 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in
 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
@@ -781,12 +910,11 @@ if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
             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
@@ -801,4 +929,3 @@ endif()
 # 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