# Copyright 2013-2018 Axel Huebl
#
# This file is part of PNGwriter.
#
# PNGwriter is free software: you can edistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# PNGwriter is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with PNGwriter.
# If not, see .
# Preamble ####################################################################
#
cmake_minimum_required(VERSION 3.0.1)
project(PNGwriter VERSION 0.7.0 LANGUAGES CXX)
# Options and Variants ########################################################
#
function(pngwriter_option name description default)
set(PNGwriter_USE_${name} ${default} CACHE STRING "${description}")
set_property(CACHE PNGwriter_USE_${name} PROPERTY
STRINGS "ON;TRUE;AUTO;OFF;FALSE"
)
if(PNGwriter_HAVE_${name})
set(PNGwriter_HAVE_${name} TRUE)
else()
set(PNGwriter_HAVE_${name})
endif()
set(PNGwriter_CONFIG_OPTIONS ${PNGwriter_CONFIG_OPTIONS} ${name} PARENT_SCOPE)
endfunction()
pngwriter_option(FREETYPE "Enable support for text via Freetype" AUTO)
set(BUILD_PERFORMANCE OFF CACHE STRING "Build Performance test (requires C++11)")
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING
"Choose the build type, e.g. Debug." FORCE)
endif()
# Dependencies ################################################################
#
# external library: libPNG (mandatory)
find_package(PNG 1.2.9 REQUIRED)
# external library: zlib (mandatory)
find_package(ZLIB REQUIRED)
# external library: FreeType (optional)
if(PNGwriter_USE_FREETYPE STREQUAL AUTO)
find_package(Freetype)
elseif(PNGwriter_USE_FREETYPE)
find_package(Freetype REQUIRED)
endif()
if(FREETYPE_FOUND)
set(PNGwriter_HAVE_FREETYPE TRUE)
endif()
# Targets #####################################################################
#
add_library(PNGwriter
src/pngwriter.cc
src/pngwriter.h
)
target_link_libraries(PNGwriter PUBLIC PNG::PNG)
target_link_libraries(PNGwriter PUBLIC ZLIB::ZLIB)
if(NOT WIN32)
# automatically added on windows
target_link_libraries(PNGwriter PRIVATE m)
endif()
if(PNGwriter_HAVE_FREETYPE)
target_include_directories(PNGwriter SYSTEM PUBLIC ${FREETYPE_INCLUDE_DIRS})
target_link_libraries(PNGwriter PUBLIC ${FREETYPE_LIBRARIES})
target_compile_definitions(PNGwriter PUBLIC "-DUSE_FREETYPE")
target_compile_definitions(PNGwriter PUBLIC ${FREETYPE_FLAGS})
else()
target_compile_definitions(PNGwriter PUBLIC "-DNO_FREETYPE")
endif()
set_target_properties(PNGwriter PROPERTIES PUBLIC_HEADER "src/pngwriter.h")
target_include_directories(PNGwriter PUBLIC
$
$
$
)
# examples & tests
set(PNGwriter_examples lyapunov pngtest)
set(PNGwriter_tests blackwhite diamond readwrite)
if(BUILD_PERFORMANCE)
list(APPEND PNGwriter_tests performance)
endif()
foreach(examplename IN LISTS PNGwriter_examples)
add_executable(${examplename} examples/${examplename}.cc)
target_link_libraries(${examplename} PRIVATE PNGwriter)
endforeach()
foreach(testname IN LISTS PNGwriter_tests)
add_executable(${testname} tests/${testname}.cc)
target_link_libraries(${testname} PRIVATE PNGwriter)
endforeach()
if(BUILD_PERFORMANCE)
set_target_properties(performance PROPERTIES
CXX_STANDARD 11
CXX_STANDARD_REQUIRED ON
)
endif()
# Generate Files with Configuration Options ###################################
#
configure_file(
${PNGwriter_SOURCE_DIR}/PNGwriterConfig.cmake.in
${PNGwriter_BINARY_DIR}/PNGwriterConfig.cmake
@ONLY
)
include(CMakePackageConfigHelpers)
write_basic_package_version_file("PNGwriterConfigVersion.cmake"
VERSION ${PNGwriter_VERSION}
COMPATIBILITY SameMajorVersion # actually: SameMinorVersion
)
# Installs ####################################################################
#
# headers, libraries and exectuables
install(TARGETS PNGwriter EXPORT PNGwriterTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
PUBLIC_HEADER DESTINATION include
INCLUDES DESTINATION include
)
# CMake package file for find_package(PNGwriter::PNGwriter) in depending projects
install(EXPORT PNGwriterTargets
FILE PNGwriterTargets.cmake
NAMESPACE PNGwriter::
DESTINATION lib/cmake/PNGwriter
)
install(
FILES
${PNGwriter_BINARY_DIR}/PNGwriterConfig.cmake
${PNGwriter_BINARY_DIR}/PNGwriterConfigVersion.cmake
DESTINATION lib/cmake/PNGwriter
)
# Tests #######################################################################
#
enable_testing()
set(REFERENCE_PNGS
pngs/burro.png
pngs/bw_16bit_rgba_20x20.png
pngs/bw_8bit_rgba_20x20.png
pngs/bw_16bit_rgb_20x20.png
pngs/bw_8bit_rgb_20x20.png
)
file(COPY ${REFERENCE_PNGS} DESTINATION ${PNGwriter_BINARY_DIR})
foreach(examplename IN LISTS PNGwriter_examples)
add_test(NAME example.${examplename}
COMMAND ${examplename}
)
endforeach()
foreach(testname IN LISTS PNGwriter_tests)
if(testname STREQUAL blackwhite)
add_test(NAME test.${testname}.16bit.rgb
COMMAND ${testname} bw_16bit_rgb_20x20.png
)
add_test(NAME test.${testname}.16bit.rgba
COMMAND ${testname} bw_16bit_rgba_20x20.png
)
add_test(NAME test.${testname}.8bit.rgba
COMMAND ${testname} bw_8bit_rgba_20x20.png
)
add_test(NAME test.${testname}.8bit.rgb
COMMAND ${testname} bw_8bit_rgb_20x20.png
)
else()
add_test(NAME test.${testname}
COMMAND ${testname}
)
endif()
endforeach()
# Status Message for Build Options ############################################
#
message("")
message("PNGwriter build configuration:")
message(" PNGwriter Version: ${PNGwriter_VERSION}")
message(" C++ Compiler : ${CMAKE_CXX_COMPILER_ID} "
"${CMAKE_CXX_COMPILER_VERSION} "
"${CMAKE_CXX_COMPILER_WRAPPER}")
message(" ${CMAKE_CXX_COMPILER}")
message("")
message(" Installation prefix: ${CMAKE_INSTALL_PREFIX}")
message("")
message(" Build Type: ${CMAKE_BUILD_TYPE}")
message(" Build Options:")
foreach(opt IN LISTS PNGwriter_CONFIG_OPTIONS)
if(${PNGwriter_HAVE_${opt}})
message(" ${opt}: ON")
else()
message(" ${opt}: OFF")
endif()
endforeach()
message("")