cmake: Refactor the install target; reformat

Use standard CMake variables in the install target.
Reformulate comments and error messages.
Move all CMake keywords in front of their arguments.
Fix indentation.
This commit is contained in:
Cosmin Truta 2020-05-24 22:01:40 -04:00
parent 3676fd324a
commit f5d5f5ae0e

View File

@ -11,7 +11,6 @@
# Revised by Vadim Barkov, 2017 # Revised by Vadim Barkov, 2017
# Revised by Vicky Pfau, 2018 # Revised by Vicky Pfau, 2018
# Revised by Cameron Cawley, 2018 # Revised by Cameron Cawley, 2018
# Revised by Cosmin Truta, 2018
# Revised by Kyle Bentley, 2018 # Revised by Kyle Bentley, 2018
# Revised by David Callu, 2020 # Revised by David Callu, 2020
# Revised by Steve Robinson, 2020 # Revised by Steve Robinson, 2020
@ -36,9 +35,7 @@ set(PNGLIB_VERSION ${PNGLIB_MAJOR}.${PNGLIB_MINOR}.${PNGLIB_RELEASE})
include(GNUInstallDirs) include(GNUInstallDirs)
# needed packages # Allow users to specify location of zlib.
# Allow users to specify location of Zlib.
# Useful if zlib is being built alongside this as a sub-project. # Useful if zlib is being built alongside this as a sub-project.
option(PNG_BUILD_ZLIB "Custom zlib Location, else find_package is used" OFF) option(PNG_BUILD_ZLIB "Custom zlib Location, else find_package is used" OFF)
@ -50,17 +47,17 @@ endif()
if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU AND NOT EMSCRIPTEN) if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU AND NOT EMSCRIPTEN)
find_library(M_LIBRARY m) find_library(M_LIBRARY m)
else() else()
# libm is not needed and/or not available # libm is not needed and/or not available.
set(M_LIBRARY "") set(M_LIBRARY "")
endif() endif()
# COMMAND LINE OPTIONS # Public CMake configuration variables.
option(PNG_SHARED "Build shared lib" ON) option(PNG_SHARED "Build shared lib" ON)
option(PNG_STATIC "Build static lib" ON) option(PNG_STATIC "Build static lib" ON)
option(PNG_EXECUTABLES "Build libpng executables" ON) option(PNG_EXECUTABLES "Build libpng executables" ON)
option(PNG_TESTS "Build libpng tests" ON) option(PNG_TESTS "Build libpng tests" ON)
# Many more configuration options could be added here # Many more configuration options could be added here.
option(PNG_FRAMEWORK "Build OS X framework" OFF) option(PNG_FRAMEWORK "Build OS X framework" OFF)
option(PNG_DEBUG "Build with debug output" OFF) option(PNG_DEBUG "Build with debug output" OFF)
option(PNG_HARDWARE_OPTIMIZATIONS "Enable hardware optimizations" ON) option(PNG_HARDWARE_OPTIMIZATIONS "Enable hardware optimizations" ON)
@ -70,27 +67,23 @@ set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings")
if(PNG_HARDWARE_OPTIMIZATIONS) if(PNG_HARDWARE_OPTIMIZATIONS)
# set definitions and sources for arm # Set definitions and sources for ARM.
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR
CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64") CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
set(PNG_ARM_NEON_POSSIBLE_VALUES check on off) set(PNG_ARM_NEON_POSSIBLE_VALUES check on off)
set(PNG_ARM_NEON "check" CACHE STRING "Enable ARM NEON optimizations: set(PNG_ARM_NEON "check"
check: (default) use internal checking code; CACHE STRING "Enable ARM NEON optimizations: check|on|off; check is default")
off: disable the optimizations; set_property(CACHE PNG_ARM_NEON
on: turn on unconditionally.") PROPERTY STRINGS ${PNG_ARM_NEON_POSSIBLE_VALUES})
set_property(CACHE PNG_ARM_NEON PROPERTY STRINGS
${PNG_ARM_NEON_POSSIBLE_VALUES})
list(FIND PNG_ARM_NEON_POSSIBLE_VALUES ${PNG_ARM_NEON} index) list(FIND PNG_ARM_NEON_POSSIBLE_VALUES ${PNG_ARM_NEON} index)
if(index EQUAL -1) if(index EQUAL -1)
message(FATAL_ERROR message(FATAL_ERROR "PNG_ARM_NEON must be one of [${PNG_ARM_NEON_POSSIBLE_VALUES}]")
"PNG_ARM_NEON must be one of [${PNG_ARM_NEON_POSSIBLE_VALUES}]")
elseif(NOT ${PNG_ARM_NEON} STREQUAL "off") elseif(NOT ${PNG_ARM_NEON} STREQUAL "off")
set(libpng_arm_sources set(libpng_arm_sources
arm/arm_init.c arm/arm_init.c
arm/filter_neon.S arm/filter_neon.S
arm/filter_neon_intrinsics.c arm/filter_neon_intrinsics.c
arm/palette_neon_intrinsics.c) arm/palette_neon_intrinsics.c)
if(${PNG_ARM_NEON} STREQUAL "on") if(${PNG_ARM_NEON} STREQUAL "on")
add_definitions(-DPNG_ARM_NEON_OPT=2) add_definitions(-DPNG_ARM_NEON_OPT=2)
elseif(${PNG_ARM_NEON} STREQUAL "check") elseif(${PNG_ARM_NEON} STREQUAL "check")
@ -101,18 +94,17 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR
endif() endif()
endif() endif()
# set definitions and sources for powerpc # Set definitions and sources for PowerPC.
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR
CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*") CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*")
set(PNG_POWERPC_VSX_POSSIBLE_VALUES on off) set(PNG_POWERPC_VSX_POSSIBLE_VALUES on off)
set(PNG_POWERPC_VSX "on" CACHE STRING "Enable POWERPC VSX optimizations: set(PNG_POWERPC_VSX "on"
off: disable the optimizations.") CACHE STRING "Enable POWERPC VSX optimizations: on|off; on is default")
set_property(CACHE PNG_POWERPC_VSX PROPERTY STRINGS set_property(CACHE PNG_POWERPC_VSX
${PNG_POWERPC_VSX_POSSIBLE_VALUES}) PROPERTY STRINGS ${PNG_POWERPC_VSX_POSSIBLE_VALUES})
list(FIND PNG_POWERPC_VSX_POSSIBLE_VALUES ${PNG_POWERPC_VSX} index) list(FIND PNG_POWERPC_VSX_POSSIBLE_VALUES ${PNG_POWERPC_VSX} index)
if(index EQUAL -1) if(index EQUAL -1)
message(FATAL_ERROR message(FATAL_ERROR "PNG_POWERPC_VSX must be one of [${PNG_POWERPC_VSX_POSSIBLE_VALUES}]")
"PNG_POWERPC_VSX must be one of [${PNG_POWERPC_VSX_POSSIBLE_VALUES}]")
elseif(NOT ${PNG_POWERPC_VSX} STREQUAL "off") elseif(NOT ${PNG_POWERPC_VSX} STREQUAL "off")
set(libpng_powerpc_sources set(libpng_powerpc_sources
powerpc/powerpc_init.c powerpc/powerpc_init.c
@ -125,18 +117,17 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR
endif() endif()
endif() endif()
# set definitions and sources for intel # Set definitions and sources for Intel.
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR
CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*") CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*")
set(PNG_INTEL_SSE_POSSIBLE_VALUES on off) set(PNG_INTEL_SSE_POSSIBLE_VALUES on off)
set(PNG_INTEL_SSE "on" CACHE STRING "Enable INTEL_SSE optimizations: set(PNG_INTEL_SSE "on"
off: disable the optimizations") CACHE STRING "Enable INTEL_SSE optimizations: on|off; on is default")
set_property(CACHE PNG_INTEL_SSE PROPERTY STRINGS set_property(CACHE PNG_INTEL_SSE
${PNG_INTEL_SSE_POSSIBLE_VALUES}) PROPERTY STRINGS ${PNG_INTEL_SSE_POSSIBLE_VALUES})
list(FIND PNG_INTEL_SSE_POSSIBLE_VALUES ${PNG_INTEL_SSE} index) list(FIND PNG_INTEL_SSE_POSSIBLE_VALUES ${PNG_INTEL_SSE} index)
if(index EQUAL -1) if(index EQUAL -1)
message(FATAL_ERROR message(FATAL_ERROR "PNG_INTEL_SSE must be one of [${PNG_INTEL_SSE_POSSIBLE_VALUES}]")
"PNG_INTEL_SSE must be one of [${PNG_INTEL_SSE_POSSIBLE_VALUES}]")
elseif(NOT ${PNG_INTEL_SSE} STREQUAL "off") elseif(NOT ${PNG_INTEL_SSE} STREQUAL "off")
set(libpng_intel_sources set(libpng_intel_sources
intel/intel_init.c intel/intel_init.c
@ -149,18 +140,17 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR
endif() endif()
endif() endif()
# set definitions and sources for MIPS # Set definitions and sources for MIPS.
if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR
CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*") CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*")
set(PNG_MIPS_MSA_POSSIBLE_VALUES on off) set(PNG_MIPS_MSA_POSSIBLE_VALUES on off)
set(PNG_MIPS_MSA "on" CACHE STRING "Enable MIPS_MSA optimizations: set(PNG_MIPS_MSA "on"
off: disable the optimizations") CACHE STRING "Enable MIPS_MSA optimizations: on|off; on is default")
set_property(CACHE PNG_MIPS_MSA PROPERTY STRINGS set_property(CACHE PNG_MIPS_MSA
${PNG_MIPS_MSA_POSSIBLE_VALUES}) PROPERTY STRINGS ${PNG_MIPS_MSA_POSSIBLE_VALUES})
list(FIND PNG_MIPS_MSA_POSSIBLE_VALUES ${PNG_MIPS_MSA} index) list(FIND PNG_MIPS_MSA_POSSIBLE_VALUES ${PNG_MIPS_MSA} index)
if(index EQUAL -1) if(index EQUAL -1)
message(FATAL_ERROR message(FATAL_ERROR "PNG_MIPS_MSA must be one of [${PNG_MIPS_MSA_POSSIBLE_VALUES}]")
"PNG_MIPS_MSA must be one of [${PNG_MIPS_MSA_POSSIBLE_VALUES}]")
elseif(NOT ${PNG_MIPS_MSA} STREQUAL "off") elseif(NOT ${PNG_MIPS_MSA} STREQUAL "off")
set(libpng_mips_sources set(libpng_mips_sources
mips/mips_init.c mips/mips_init.c
@ -175,25 +165,25 @@ endif()
else(PNG_HARDWARE_OPTIMIZATIONS) else(PNG_HARDWARE_OPTIMIZATIONS)
# set definitions and sources for arm # Set definitions and sources for ARM.
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR
CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64") CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
add_definitions(-DPNG_ARM_NEON_OPT=0) add_definitions(-DPNG_ARM_NEON_OPT=0)
endif() endif()
# set definitions and sources for powerpc # Set definitions and sources for PowerPC.
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR
CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*") CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*")
add_definitions(-DPNG_POWERPC_VSX_OPT=0) add_definitions(-DPNG_POWERPC_VSX_OPT=0)
endif() endif()
# set definitions and sources for intel # Set definitions and sources for Intel.
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR
CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*") CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*")
add_definitions(-DPNG_INTEL_SSE_OPT=0) add_definitions(-DPNG_INTEL_SSE_OPT=0)
endif() endif()
# set definitions and sources for MIPS # Set definitions and sources for MIPS.
if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR
CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*") CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*")
add_definitions(-DPNG_MIPS_MSA_OPT=0) add_definitions(-DPNG_MIPS_MSA_OPT=0)
@ -201,10 +191,10 @@ endif()
endif(PNG_HARDWARE_OPTIMIZATIONS) endif(PNG_HARDWARE_OPTIMIZATIONS)
# SET LIBNAME # Set PNG_LIB_NAME.
set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR}) set(PNG_LIB_NAME png${PNGLIB_MAJOR}${PNGLIB_MINOR})
# to distinguish between debug and release lib # Distinguish between debug and release builds.
set(CMAKE_DEBUG_POSTFIX "d") set(CMAKE_DEBUG_POSTFIX "d")
include(CheckCSourceCompiles) include(CheckCSourceCompiles)
@ -283,9 +273,9 @@ if(NOT AWK OR ANDROID OR IOS)
${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h) ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
add_custom_target(genfiles) # Dummy add_custom_target(genfiles) # Dummy
else() else()
include(CMakeParseArguments) # Generate .chk from .out with awk:
# Generate .chk from .out with awk
# generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]]) # generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]])
include(CMakeParseArguments)
function(generate_chk) function(generate_chk)
set(options) set(options)
set(oneValueArgs INPUT OUTPUT) set(oneValueArgs INPUT OUTPUT)
@ -352,9 +342,10 @@ else()
# Copy file # Copy file
function(generate_copy source destination) function(generate_copy source destination)
add_custom_command(OUTPUT "${destination}" add_custom_command(OUTPUT "${destination}"
COMMAND "${CMAKE_COMMAND}" -E remove "${destination}" COMMAND "${CMAKE_COMMAND}"
COMMAND "${CMAKE_COMMAND}" -E copy "${source}" -E remove "${destination}"
"${destination}" COMMAND "${CMAKE_COMMAND}"
-E copy "${source}" "${destination}"
DEPENDS "${source}") DEPENDS "${source}")
endfunction() endfunction()
@ -421,16 +412,18 @@ else()
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk" DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk"
"${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def") "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def")
add_custom_target(symbol-check DEPENDS add_custom_target(symbol-check
"${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk") DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk")
generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out" generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out"
"${CMAKE_CURRENT_BINARY_DIR}/libpng.sym") "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out" generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out"
"${CMAKE_CURRENT_BINARY_DIR}/libpng.vers") "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
add_custom_target(genvers DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers") add_custom_target(genvers
add_custom_target(gensym DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym") DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers")
add_custom_target(gensym
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym")
add_custom_target("genprebuilt" add_custom_target("genprebuilt"
COMMAND "${CMAKE_COMMAND}" COMMAND "${CMAKE_COMMAND}"
@ -438,12 +431,12 @@ else()
-P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake" -P "${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
# A single target handles generation of all generated files. If # A single target handles generation of all generated files.
# they are depended upon separately by multiple targets, this # If they are depended upon separately by multiple targets, this
# confuses parallel make (it would require a separate top-level # confuses parallel make (it would require a separate top-level
# target for each file to track the dependencies properly). # target for each file to track the dependencies properly).
add_custom_target(genfiles DEPENDS add_custom_target(genfiles
"${CMAKE_CURRENT_BINARY_DIR}/libpng.sym" DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym"
"${CMAKE_CURRENT_BINARY_DIR}/libpng.vers" "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers"
"${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c" "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.c"
"${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h" "${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h"
@ -458,7 +451,7 @@ else()
"${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out") "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out")
endif(NOT AWK OR ANDROID OR IOS) endif(NOT AWK OR ANDROID OR IOS)
# OUR SOURCES # List the source code files.
set(libpng_public_hdrs set(libpng_public_hdrs
png.h png.h
pngconf.h pngconf.h
@ -526,7 +519,7 @@ if(PNG_DEBUG)
add_definitions(-DPNG_DEBUG) add_definitions(-DPNG_DEBUG)
endif() endif()
# NOW BUILD OUR TARGET # Now build our target.
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${ZLIB_INCLUDE_DIRS})
unset(PNG_LIB_TARGETS) unset(PNG_LIB_TARGETS)
@ -537,7 +530,7 @@ if(PNG_SHARED)
set_target_properties(png PROPERTIES OUTPUT_NAME ${PNG_LIB_NAME}) set_target_properties(png PROPERTIES OUTPUT_NAME ${PNG_LIB_NAME})
add_dependencies(png genfiles) add_dependencies(png genfiles)
if(MSVC) if(MSVC)
# msvc does not append 'lib' - do it here to have consistent name # MVC does not append 'lib'. Do it here, to have consistent name.
set_target_properties(png PROPERTIES PREFIX "lib") set_target_properties(png PROPERTIES PREFIX "lib")
set_target_properties(png PROPERTIES IMPORT_PREFIX "lib") set_target_properties(png PROPERTIES IMPORT_PREFIX "lib")
endif() endif()
@ -545,11 +538,11 @@ if(PNG_SHARED)
if(UNIX AND AWK) if(UNIX AND AWK)
if(HAVE_LD_VERSION_SCRIPT) if(HAVE_LD_VERSION_SCRIPT)
set_target_properties(png PROPERTIES LINK_FLAGS set_target_properties(png PROPERTIES
"-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'") LINK_FLAGS "-Wl,--version-script='${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
elseif(HAVE_SOLARIS_LD_VERSION_SCRIPT) elseif(HAVE_SOLARIS_LD_VERSION_SCRIPT)
set_target_properties(png PROPERTIES LINK_FLAGS set_target_properties(png PROPERTIES
"-Wl,-M -Wl,'${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'") LINK_FLAGS "-Wl,-M -Wl,'${CMAKE_CURRENT_BINARY_DIR}/libpng.vers'")
endif() endif()
endif() endif()
endif() endif()
@ -573,7 +566,7 @@ if(PNG_STATIC)
endif() endif()
list(APPEND PNG_LIB_TARGETS png_static) list(APPEND PNG_LIB_TARGETS png_static)
if(MSVC) if(MSVC)
# msvc does not append 'lib' - do it here to have consistent name # MSVC does not append 'lib'. Do it here, to have consistent name.
set_target_properties(png_static PROPERTIES PREFIX "lib") set_target_properties(png_static PROPERTIES PREFIX "lib")
endif() endif()
target_link_libraries(png_static ${ZLIB_LIBRARIES} ${M_LIBRARY}) target_link_libraries(png_static ${ZLIB_LIBRARIES} ${M_LIBRARY})
@ -597,14 +590,14 @@ if(PNG_FRAMEWORK)
endif() endif()
if(NOT PNG_LIB_TARGETS) if(NOT PNG_LIB_TARGETS)
message(SEND_ERROR message(SEND_ERROR "No library variant selected to build. "
"No library variant selected to build. "
"Please enable at least one of the following options: " "Please enable at least one of the following options: "
"PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK") "PNG_STATIC, PNG_SHARED, PNG_FRAMEWORK")
endif() endif()
if(PNG_SHARED AND WIN32) if(PNG_SHARED AND WIN32)
set_target_properties(png PROPERTIES DEFINE_SYMBOL PNG_BUILD_DLL) set_target_properties(png PROPERTIES
DEFINE_SYMBOL PNG_BUILD_DLL)
endif() endif()
function(png_add_test) function(png_add_test)
@ -624,7 +617,8 @@ function(png_add_test)
set(TEST_FILES "${_PAT_FILES}") set(TEST_FILES "${_PAT_FILES}")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in" configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/test.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake" @ONLY) "${CMAKE_CURRENT_BINARY_DIR}/tests/${_PAT_NAME}.cmake"
@ONLY)
add_test(NAME "${_PAT_NAME}" add_test(NAME "${_PAT_NAME}"
COMMAND "${CMAKE_COMMAND}" COMMAND "${CMAKE_COMMAND}"
"-DLIBPNG=$<TARGET_FILE:png>" "-DLIBPNG=$<TARGET_FILE:png>"
@ -645,39 +639,55 @@ if(PNG_TESTS AND PNG_SHARED)
add_executable(pngtest ${pngtest_sources}) add_executable(pngtest ${pngtest_sources})
target_link_libraries(pngtest png) target_link_libraries(pngtest png)
png_add_test(NAME pngtest COMMAND pngtest FILES "${PNGTEST_PNG}") png_add_test(NAME pngtest
COMMAND pngtest
FILES "${PNGTEST_PNG}")
add_executable(pngvalid ${pngvalid_sources}) add_executable(pngvalid ${pngvalid_sources})
target_link_libraries(pngvalid png) target_link_libraries(pngvalid png)
png_add_test(NAME pngvalid-gamma-16-to-8 png_add_test(NAME pngvalid-gamma-16-to-8
COMMAND pngvalid OPTIONS --gamma-16-to-8) COMMAND pngvalid
OPTIONS --gamma-16-to-8)
png_add_test(NAME pngvalid-gamma-alpha-mode png_add_test(NAME pngvalid-gamma-alpha-mode
COMMAND pngvalid OPTIONS --gamma-alpha-mode) COMMAND pngvalid
OPTIONS --gamma-alpha-mode)
png_add_test(NAME pngvalid-gamma-background png_add_test(NAME pngvalid-gamma-background
COMMAND pngvalid OPTIONS --gamma-background) COMMAND pngvalid
OPTIONS --gamma-background)
png_add_test(NAME pngvalid-gamma-expand16-alpha-mode png_add_test(NAME pngvalid-gamma-expand16-alpha-mode
COMMAND pngvalid OPTIONS --gamma-alpha-mode --expand16) COMMAND pngvalid
OPTIONS --gamma-alpha-mode --expand16)
png_add_test(NAME pngvalid-gamma-expand16-background png_add_test(NAME pngvalid-gamma-expand16-background
COMMAND pngvalid OPTIONS --gamma-background --expand16) COMMAND pngvalid
OPTIONS --gamma-background --expand16)
png_add_test(NAME pngvalid-gamma-expand16-transform png_add_test(NAME pngvalid-gamma-expand16-transform
COMMAND pngvalid OPTIONS --gamma-transform --expand16) COMMAND pngvalid
OPTIONS --gamma-transform --expand16)
png_add_test(NAME pngvalid-gamma-sbit png_add_test(NAME pngvalid-gamma-sbit
COMMAND pngvalid OPTIONS --gamma-sbit) COMMAND pngvalid
OPTIONS --gamma-sbit)
png_add_test(NAME pngvalid-gamma-threshold png_add_test(NAME pngvalid-gamma-threshold
COMMAND pngvalid OPTIONS --gamma-threshold) COMMAND pngvalid
OPTIONS --gamma-threshold)
png_add_test(NAME pngvalid-gamma-transform png_add_test(NAME pngvalid-gamma-transform
COMMAND pngvalid OPTIONS --gamma-transform) COMMAND pngvalid
OPTIONS --gamma-transform)
png_add_test(NAME pngvalid-progressive-interlace-standard png_add_test(NAME pngvalid-progressive-interlace-standard
COMMAND pngvalid OPTIONS --standard --progressive-read --interlace) COMMAND pngvalid
OPTIONS --standard --progressive-read --interlace)
png_add_test(NAME pngvalid-progressive-size png_add_test(NAME pngvalid-progressive-size
COMMAND pngvalid OPTIONS --size --progressive-read) COMMAND pngvalid
OPTIONS --size --progressive-read)
png_add_test(NAME pngvalid-progressive-standard png_add_test(NAME pngvalid-progressive-standard
COMMAND pngvalid OPTIONS --standard --progressive-read) COMMAND pngvalid
OPTIONS --standard --progressive-read)
png_add_test(NAME pngvalid-standard png_add_test(NAME pngvalid-standard
COMMAND pngvalid OPTIONS --standard) COMMAND pngvalid
OPTIONS --standard)
png_add_test(NAME pngvalid-transform png_add_test(NAME pngvalid-transform
COMMAND pngvalid OPTIONS --transform) COMMAND pngvalid
OPTIONS --transform)
add_executable(pngstest ${pngstest_sources}) add_executable(pngstest ${pngstest_sources})
target_link_libraries(pngstest png) target_link_libraries(pngstest png)
@ -737,19 +747,46 @@ if(PNG_TESTS AND PNG_SHARED)
add_executable(pngunknown ${pngunknown_sources}) add_executable(pngunknown ${pngunknown_sources})
target_link_libraries(pngunknown png) target_link_libraries(pngunknown png)
png_add_test(NAME pngunknown-discard COMMAND pngunknown OPTIONS --strict default=discard FILES "${PNGTEST_PNG}") png_add_test(NAME pngunknown-discard
png_add_test(NAME pngunknown-IDAT COMMAND pngunknown OPTIONS --strict default=discard IDAT=save FILES "${PNGTEST_PNG}") COMMAND pngunknown
png_add_test(NAME pngunknown-if-safe COMMAND pngunknown OPTIONS --strict default=if-safe FILES "${PNGTEST_PNG}") OPTIONS --strict default=discard
png_add_test(NAME pngunknown-sAPI COMMAND pngunknown OPTIONS --strict bKGD=save cHRM=save gAMA=save all=discard iCCP=save sBIT=save sRGB=save FILES "${PNGTEST_PNG}") FILES "${PNGTEST_PNG}")
png_add_test(NAME pngunknown-save COMMAND pngunknown OPTIONS --strict default=save FILES "${PNGTEST_PNG}") png_add_test(NAME pngunknown-IDAT
png_add_test(NAME pngunknown-sTER COMMAND pngunknown OPTIONS --strict sTER=if-safe FILES "${PNGTEST_PNG}") COMMAND pngunknown
png_add_test(NAME pngunknown-vpAg COMMAND pngunknown OPTIONS --strict vpAg=if-safe FILES "${PNGTEST_PNG}") OPTIONS --strict default=discard IDAT=save
FILES "${PNGTEST_PNG}")
png_add_test(NAME pngunknown-if-safe
COMMAND pngunknown
OPTIONS --strict default=if-safe
FILES "${PNGTEST_PNG}")
png_add_test(NAME pngunknown-sAPI
COMMAND pngunknown
OPTIONS --strict bKGD=save cHRM=save gAMA=save all=discard iCCP=save sBIT=save sRGB=save
FILES "${PNGTEST_PNG}")
png_add_test(NAME pngunknown-save
COMMAND pngunknown
OPTIONS --strict default=save
FILES "${PNGTEST_PNG}")
png_add_test(NAME pngunknown-sTER
COMMAND pngunknown
OPTIONS --strict sTER=if-safe
FILES "${PNGTEST_PNG}")
png_add_test(NAME pngunknown-vpAg
COMMAND pngunknown
OPTIONS --strict vpAg=if-safe
FILES "${PNGTEST_PNG}")
add_executable(pngimage ${pngimage_sources}) add_executable(pngimage ${pngimage_sources})
target_link_libraries(pngimage png) target_link_libraries(pngimage png)
png_add_test(NAME pngimage-quick COMMAND pngimage OPTIONS --list-combos --log FILES ${PNGSUITE_PNGS}) png_add_test(NAME pngimage-quick
png_add_test(NAME pngimage-full COMMAND pngimage OPTIONS --exhaustive --list-combos --log FILES ${PNGSUITE_PNGS}) COMMAND pngimage
OPTIONS --list-combos --log
FILES ${PNGSUITE_PNGS})
png_add_test(NAME pngimage-full
COMMAND pngimage
OPTIONS --exhaustive --list-combos --log
FILES ${PNGSUITE_PNGS})
endif() endif()
if(PNG_SHARED AND PNG_EXECUTABLES) if(PNG_SHARED AND PNG_EXECUTABLES)
@ -762,13 +799,10 @@ if(PNG_SHARED AND PNG_EXECUTABLES)
list(APPEND PNG_BIN_TARGETS png-fix-itxt) list(APPEND PNG_BIN_TARGETS png-fix-itxt)
endif() endif()
# Set a variable with CMake code which: # Creates a symlink from src to dest (if possible), or, alternatively,
# Creates a symlink from src to dest (if possible) or alternatively # copies src to dest if different.
# copies if different.
include(CMakeParseArguments) include(CMakeParseArguments)
function(create_symlink DEST_FILE) function(create_symlink DEST_FILE)
cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN}) cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN})
if(NOT S_TARGET AND NOT S_FILE) if(NOT S_TARGET AND NOT S_FILE)
@ -776,55 +810,69 @@ function(create_symlink DEST_FILE)
endif() endif()
if(S_TARGET AND S_FILE) if(S_TARGET AND S_FILE)
message(FATAL_ERROR "create_symlink: Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; can only have one.") message(FATAL_ERROR "create_symlink: "
"Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; "
"can only have one")
endif() endif()
if(S_FILE) if(S_FILE)
# If we don't need to symlink something that's coming from a build target, # If we don't need to symlink something that's coming from a build target,
# we can go ahead and symlink/copy at configure time. # we can go ahead and symlink/copy at configure time.
if(CMAKE_HOST_WIN32 AND NOT CYGWIN) if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
execute_process( execute_process(COMMAND "${CMAKE_COMMAND}"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${S_FILE} ${DEST_FILE} -E copy_if_different
${S_FILE} ${DEST_FILE}
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
else() else()
execute_process( execute_process(COMMAND "${CMAKE_COMMAND}"
COMMAND ${CMAKE_COMMAND} -E create_symlink ${S_FILE} ${DEST_FILE} -E create_symlink
${S_FILE} ${DEST_FILE}
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
endif() endif()
endif() endif()
if(S_TARGET) if(S_TARGET)
# We need to use generator expressions, which can be a bit tricky, so for # We need to use generator expressions, which can be a bit tricky.
# simplicity make the symlink a POST_BUILD step and use the TARGET # For simplicity, make the symlink a POST_BUILD step, and use the TARGET
# signature of add_custom_command. # signature of add_custom_command.
if(CMAKE_HOST_WIN32 AND NOT CYGWIN) if(CMAKE_HOST_WIN32 AND NOT CYGWIN)
add_custom_command(TARGET ${S_TARGET} POST_BUILD add_custom_command(TARGET ${S_TARGET}
COMMAND "${CMAKE_COMMAND}" -E copy_if_different $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE}) POST_BUILD
COMMAND "${CMAKE_COMMAND}"
-E copy_if_different
$<TARGET_LINKER_FILE_NAME:${S_TARGET}>
$<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
else() else()
add_custom_command(TARGET ${S_TARGET} POST_BUILD add_custom_command(TARGET ${S_TARGET}
COMMAND "${CMAKE_COMMAND}" -E create_symlink $<TARGET_LINKER_FILE_NAME:${S_TARGET}> $<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE}) POST_BUILD
COMMAND "${CMAKE_COMMAND}"
-E create_symlink
$<TARGET_LINKER_FILE_NAME:${S_TARGET}>
$<TARGET_LINKER_FILE_DIR:${S_TARGET}>/${DEST_FILE})
endif() endif()
endif() endif()
endfunction() endfunction()
# Create source generation scripts. # Create source generation scripts.
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genchk.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake @ONLY) ${CMAKE_CURRENT_BINARY_DIR}/scripts/genchk.cmake
@ONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/genout.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake @ONLY) ${CMAKE_CURRENT_BINARY_DIR}/scripts/genout.cmake
@ONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/gensrc.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake @ONLY) ${CMAKE_CURRENT_BINARY_DIR}/scripts/gensrc.cmake
@ONLY)
# libpng is a library so default to 'lib' # libpng is a library so default to 'lib'
if(NOT DEFINED CMAKE_INSTALL_LIBDIR) if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
set(CMAKE_INSTALL_LIBDIR lib) set(CMAKE_INSTALL_LIBDIR lib)
endif() endif()
# CREATE PKGCONFIG FILES # Create pkgconfig files.
# We use the same files like ./configure, so we have to set its vars. # We use the same files like ./configure, so we have to set its vars.
# Only do this on Windows for Cygwin - the files don't make much sense outside # Only do this on Windows for Cygwin - the files don't make much sense
# of a UNIX look-alike. # outside of a UNIX look-alike.
if(NOT WIN32 OR CYGWIN OR MINGW) if(NOT WIN32 OR CYGWIN OR MINGW)
set(prefix ${CMAKE_INSTALL_PREFIX}) set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX}) set(exec_prefix ${CMAKE_INSTALL_PREFIX})
@ -832,15 +880,16 @@ if(NOT WIN32 OR CYGWIN OR MINGW)
set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
set(LIBS "-lz -lm") set(LIBS "-lz -lm")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng.pc.in
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc @ONLY) ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
@ONLY)
create_symlink(libpng.pc FILE ${PNGLIB_NAME}.pc) create_symlink(libpng.pc FILE ${PNGLIB_NAME}.pc)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpng-config.in
${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config @ONLY) ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
@ONLY)
create_symlink(libpng-config FILE ${PNGLIB_NAME}-config) create_symlink(libpng-config FILE ${PNGLIB_NAME}-config)
endif() endif()
# SET UP LINKS # Set up links.
if(PNG_SHARED) if(PNG_SHARED)
set_target_properties(png PROPERTIES set_target_properties(png PROPERTIES
VERSION 16.${PNGLIB_RELEASE}.git VERSION 16.${PNGLIB_RELEASE}.git
@ -849,7 +898,7 @@ if(PNG_SHARED)
CLEAN_DIRECT_OUTPUT 1) CLEAN_DIRECT_OUTPUT 1)
endif() endif()
# INSTALL # Install.
if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL) if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
install(TARGETS ${PNG_LIB_TARGETS} install(TARGETS ${PNG_LIB_TARGETS}
EXPORT libpng EXPORT libpng
@ -883,13 +932,17 @@ if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
endif() endif()
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL) if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
install(FILES ${libpng_public_hdrs} DESTINATION include) install(FILES ${libpng_public_hdrs}
install(FILES ${libpng_public_hdrs} DESTINATION include/${PNGLIB_NAME}) DESTINATION include)
install(FILES ${libpng_public_hdrs}
DESTINATION include/${PNGLIB_NAME})
endif() endif()
if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL) if(NOT SKIP_INSTALL_EXECUTABLES AND NOT SKIP_INSTALL_ALL)
if(NOT WIN32 OR CYGWIN OR MINGW) if(NOT WIN32 OR CYGWIN OR MINGW)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config DESTINATION bin) install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config DESTINATION bin) DESTINATION bin)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
DESTINATION bin)
endif() endif()
endif() endif()
@ -899,38 +952,31 @@ if(NOT SKIP_INSTALL_PROGRAMS AND NOT SKIP_INSTALL_ALL)
endif() endif()
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL) if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL)
# Install man pages # Install the man pages.
if(NOT PNG_MAN_DIR) install(FILES libpng.3 libpngpf.3
set(PNG_MAN_DIR "share/man") DESTINATION ${CMAKE_INSTALL_MANDIR}/man3)
endif() install(FILES png.5
install(FILES libpng.3 libpngpf.3 DESTINATION ${PNG_MAN_DIR}/man3) DESTINATION ${CMAKE_INSTALL_MANDIR}/man5)
install(FILES png.5 DESTINATION ${PNG_MAN_DIR}/man5) # Install the pkg-config files.
# Install pkg-config files
if(NOT CMAKE_HOST_WIN32 OR CYGWIN OR MINGW) if(NOT CMAKE_HOST_WIN32 OR CYGWIN OR MINGW)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
DESTINATION bin) DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
DESTINATION bin) DESTINATION ${CMAKE_INSTALL_BINDIR})
endif() endif()
endif() endif()
# Create an export file that CMake users can include() to import our targets. # Create an export file that CMake users can include() to import our targets.
if(NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL) if(NOT SKIP_INSTALL_EXPORT AND NOT SKIP_INSTALL_ALL)
install(EXPORT libpng DESTINATION lib/libpng FILE lib${PNG_LIB_NAME}.cmake) install(EXPORT libpng
DESTINATION lib/libpng
FILE lib${PNG_LIB_NAME}.cmake)
endif() endif()
# what's with libpng-manual.txt and all the extra files? # TODO: Create MSVC import lib for MinGW-compiled shared lib.
# UNINSTALL
# do we need this?
# DIST
# do we need this?
# to create msvc import lib for mingw compiled shared lib
# pexports libpng.dll > libpng.def # pexports libpng.dll > libpng.def
# lib /def:libpng.def /machine:x86 # lib /def:libpng.def /machine:x86