198 lines
5.8 KiB
CMake
198 lines
5.8 KiB
CMake
cmake_minimum_required(VERSION 2.8.11)
|
|
|
|
project(Zopfli)
|
|
|
|
# Check if Zopfli is the top-level project (standalone), or a subproject
|
|
set(zopfli_standalone FALSE)
|
|
get_directory_property(zopfli_parent_directory PARENT_DIRECTORY)
|
|
if(zopfli_parent_directory STREQUAL "")
|
|
set(zopfli_standalone TRUE)
|
|
endif()
|
|
unset(zopfli_parent_directory)
|
|
|
|
#
|
|
# Options
|
|
#
|
|
|
|
# ZOPFLI_BUILD_SHARED controls if Zopfli libraries are built as shared or
|
|
# static
|
|
#
|
|
# It defaults to the value of BUILD_SHARED_LIBS if set, and in most cases
|
|
# that should be used instead. The purpose of ZOPFLI_BUILD_SHARED is to allow
|
|
# overriding it when built as a subproject.
|
|
set(zopfli_shared_default OFF)
|
|
if(DEFINED BUILD_SHARED_LIBS)
|
|
set(zopfli_shared_default ${BUILD_SHARED_LIBS})
|
|
endif()
|
|
option(ZOPFLI_BUILD_SHARED "Build Zopfli with shared libraries" ${zopfli_shared_default})
|
|
unset(zopfli_shared_default)
|
|
|
|
# ZOPFLI_BUILD_INSTALL controls if Zopfli adds an install target to the build
|
|
#
|
|
# When built standalone or as a shared library subproject, the default is ON,
|
|
# and for static library subproject the default is OFF.
|
|
if(zopfli_standalone OR ZOPFLI_BUILD_SHARED)
|
|
option(ZOPFLI_BUILD_INSTALL "Add Zopfli install target" ON)
|
|
else()
|
|
option(ZOPFLI_BUILD_INSTALL "Add Zopfli install target" OFF)
|
|
endif()
|
|
|
|
# ZOPFLI_DEFAULT_RELEASE enables changing empty build type to Release
|
|
#
|
|
# Make based single-configuration generators default to an empty build type,
|
|
# which might be surprising, but could be useful if you want full control over
|
|
# compiler and linker flags. When ZOPFLI_DEFAULT_RELEASE is ON, change an
|
|
# empty default build type to Release.
|
|
option(ZOPFLI_DEFAULT_RELEASE "If CMAKE_BUILD_TYPE is empty, default to Release" ON)
|
|
|
|
if(zopfli_standalone AND ZOPFLI_DEFAULT_RELEASE)
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
message(STATUS "CMAKE_BUILD_TYPE empty, defaulting to Release")
|
|
set(CMAKE_BUILD_TYPE Release)
|
|
endif()
|
|
endif()
|
|
|
|
#
|
|
# Library version
|
|
#
|
|
set(ZOPFLI_VERSION_MAJOR 1)
|
|
set(ZOPFLI_VERSION_MINOR 0)
|
|
set(ZOPFLI_VERSION_PATCH 3)
|
|
set(ZOPFLI_VERSION ${ZOPFLI_VERSION_MAJOR}.${ZOPFLI_VERSION_MINOR}.${ZOPFLI_VERSION_PATCH})
|
|
|
|
if(ZOPFLI_BUILD_SHARED)
|
|
set(zopfli_library_type SHARED)
|
|
else()
|
|
set(zopfli_library_type STATIC)
|
|
endif()
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
#
|
|
# libzopfli
|
|
#
|
|
add_library(libzopfli ${zopfli_library_type}
|
|
src/zopfli/blocksplitter.c
|
|
src/zopfli/cache.c
|
|
src/zopfli/deflate.c
|
|
src/zopfli/gzip_container.c
|
|
src/zopfli/hash.c
|
|
src/zopfli/katajainen.c
|
|
src/zopfli/lz77.c
|
|
src/zopfli/squeeze.c
|
|
src/zopfli/tree.c
|
|
src/zopfli/util.c
|
|
src/zopfli/zlib_container.c
|
|
src/zopfli/zopfli_lib.c
|
|
)
|
|
target_include_directories(libzopfli
|
|
INTERFACE
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/zopfli>
|
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
)
|
|
set_target_properties(libzopfli PROPERTIES
|
|
OUTPUT_NAME zopfli
|
|
VERSION ${ZOPFLI_VERSION}
|
|
SOVERSION ${ZOPFLI_VERSION_MAJOR}
|
|
)
|
|
if(UNIX AND NOT (BEOS OR HAIKU))
|
|
target_link_libraries(libzopfli m)
|
|
endif()
|
|
|
|
#
|
|
# libzopflipng
|
|
#
|
|
add_library(libzopflipng ${zopfli_library_type}
|
|
src/zopflipng/zopflipng_lib.cc
|
|
src/zopflipng/lodepng/lodepng.cpp
|
|
src/zopflipng/lodepng/lodepng_util.cpp
|
|
)
|
|
target_link_libraries(libzopflipng libzopfli)
|
|
target_include_directories(libzopflipng
|
|
INTERFACE
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/zopflipng>
|
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
)
|
|
set_target_properties(libzopflipng PROPERTIES
|
|
OUTPUT_NAME zopflipng
|
|
VERSION ${ZOPFLI_VERSION}
|
|
SOVERSION ${ZOPFLI_VERSION_MAJOR}
|
|
)
|
|
|
|
# MSVC does not export symbols by default when building a DLL, this is a
|
|
# workaround for recent versions of CMake
|
|
if(MSVC AND ZOPFLI_BUILD_SHARED)
|
|
if(CMAKE_VERSION VERSION_LESS 3.4)
|
|
message(WARNING "Automatic export of all symbols to DLL not supported until CMake 3.4")
|
|
else()
|
|
set_target_properties(libzopfli PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
|
set_target_properties(libzopflipng PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
|
endif()
|
|
endif()
|
|
|
|
#
|
|
# zopfli
|
|
#
|
|
add_executable(zopfli src/zopfli/zopfli_bin.c)
|
|
target_link_libraries(zopfli libzopfli)
|
|
if(MSVC)
|
|
target_compile_definitions(zopfli PRIVATE _CRT_SECURE_NO_WARNINGS)
|
|
endif()
|
|
|
|
#
|
|
# zopflipng
|
|
#
|
|
add_executable(zopflipng src/zopflipng/zopflipng_bin.cc)
|
|
target_link_libraries(zopflipng libzopflipng)
|
|
if(MSVC)
|
|
target_compile_definitions(zopflipng PRIVATE _CRT_SECURE_NO_WARNINGS)
|
|
endif()
|
|
|
|
# Create aliases
|
|
#
|
|
# Makes targets available to projects using Zopfli as a subproject using the
|
|
# same names as in the config file package.
|
|
if(NOT CMAKE_VERSION VERSION_LESS 3.0)
|
|
add_library(Zopfli::libzopfli ALIAS libzopfli)
|
|
add_library(Zopfli::libzopflipng ALIAS libzopflipng)
|
|
add_executable(Zopfli::zopfli ALIAS zopfli)
|
|
add_executable(Zopfli::zopflipng ALIAS zopflipng)
|
|
endif()
|
|
|
|
#
|
|
# Install
|
|
#
|
|
if(ZOPFLI_BUILD_INSTALL)
|
|
# Install binaries, libraries, and headers
|
|
install(TARGETS libzopfli libzopflipng zopfli zopflipng
|
|
EXPORT ZopfliTargets
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
)
|
|
install(FILES src/zopfli/zopfli.h src/zopflipng/zopflipng_lib.h
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
)
|
|
|
|
# Install config file package
|
|
#
|
|
# This allows CMake based projects to use the installed libraries with
|
|
# find_package(Zopfli).
|
|
if(NOT CMAKE_VERSION VERSION_LESS 3.0)
|
|
include(CMakePackageConfigHelpers)
|
|
write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/ZopfliConfigVersion.cmake
|
|
VERSION ${ZOPFLI_VERSION}
|
|
COMPATIBILITY SameMajorVersion
|
|
)
|
|
# Since we have no dependencies, use export file directly as config file
|
|
install(EXPORT ZopfliTargets
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Zopfli
|
|
NAMESPACE Zopfli::
|
|
FILE ZopfliConfig.cmake
|
|
)
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ZopfliConfigVersion.cmake
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Zopfli
|
|
)
|
|
endif()
|
|
endif()
|