1*e47783fdSXin Licmake_minimum_required(VERSION 2.8.11) 2*e47783fdSXin Li 3*e47783fdSXin Liproject(Zopfli) 4*e47783fdSXin Li 5*e47783fdSXin Li# Check if Zopfli is the top-level project (standalone), or a subproject 6*e47783fdSXin Liset(zopfli_standalone FALSE) 7*e47783fdSXin Liget_directory_property(zopfli_parent_directory PARENT_DIRECTORY) 8*e47783fdSXin Liif(zopfli_parent_directory STREQUAL "") 9*e47783fdSXin Li set(zopfli_standalone TRUE) 10*e47783fdSXin Liendif() 11*e47783fdSXin Liunset(zopfli_parent_directory) 12*e47783fdSXin Li 13*e47783fdSXin Li# 14*e47783fdSXin Li# Options 15*e47783fdSXin Li# 16*e47783fdSXin Li 17*e47783fdSXin Li# ZOPFLI_BUILD_SHARED controls if Zopfli libraries are built as shared or 18*e47783fdSXin Li# static 19*e47783fdSXin Li# 20*e47783fdSXin Li# It defaults to the value of BUILD_SHARED_LIBS if set, and in most cases 21*e47783fdSXin Li# that should be used instead. The purpose of ZOPFLI_BUILD_SHARED is to allow 22*e47783fdSXin Li# overriding it when built as a subproject. 23*e47783fdSXin Liset(zopfli_shared_default OFF) 24*e47783fdSXin Liif(DEFINED BUILD_SHARED_LIBS) 25*e47783fdSXin Li set(zopfli_shared_default ${BUILD_SHARED_LIBS}) 26*e47783fdSXin Liendif() 27*e47783fdSXin Lioption(ZOPFLI_BUILD_SHARED "Build Zopfli with shared libraries" ${zopfli_shared_default}) 28*e47783fdSXin Liunset(zopfli_shared_default) 29*e47783fdSXin Li 30*e47783fdSXin Li# ZOPFLI_BUILD_INSTALL controls if Zopfli adds an install target to the build 31*e47783fdSXin Li# 32*e47783fdSXin Li# When built standalone or as a shared library subproject, the default is ON, 33*e47783fdSXin Li# and for static library subproject the default is OFF. 34*e47783fdSXin Liif(zopfli_standalone OR ZOPFLI_BUILD_SHARED) 35*e47783fdSXin Li option(ZOPFLI_BUILD_INSTALL "Add Zopfli install target" ON) 36*e47783fdSXin Lielse() 37*e47783fdSXin Li option(ZOPFLI_BUILD_INSTALL "Add Zopfli install target" OFF) 38*e47783fdSXin Liendif() 39*e47783fdSXin Li 40*e47783fdSXin Li# ZOPFLI_DEFAULT_RELEASE enables changing empty build type to Release 41*e47783fdSXin Li# 42*e47783fdSXin Li# Make based single-configuration generators default to an empty build type, 43*e47783fdSXin Li# which might be surprising, but could be useful if you want full control over 44*e47783fdSXin Li# compiler and linker flags. When ZOPFLI_DEFAULT_RELEASE is ON, change an 45*e47783fdSXin Li# empty default build type to Release. 46*e47783fdSXin Lioption(ZOPFLI_DEFAULT_RELEASE "If CMAKE_BUILD_TYPE is empty, default to Release" ON) 47*e47783fdSXin Li 48*e47783fdSXin Liif(zopfli_standalone AND ZOPFLI_DEFAULT_RELEASE) 49*e47783fdSXin Li if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 50*e47783fdSXin Li message(STATUS "CMAKE_BUILD_TYPE empty, defaulting to Release") 51*e47783fdSXin Li set(CMAKE_BUILD_TYPE Release) 52*e47783fdSXin Li endif() 53*e47783fdSXin Liendif() 54*e47783fdSXin Li 55*e47783fdSXin Li# 56*e47783fdSXin Li# Library version 57*e47783fdSXin Li# 58*e47783fdSXin Liset(ZOPFLI_VERSION_MAJOR 1) 59*e47783fdSXin Liset(ZOPFLI_VERSION_MINOR 0) 60*e47783fdSXin Liset(ZOPFLI_VERSION_PATCH 3) 61*e47783fdSXin Liset(ZOPFLI_VERSION ${ZOPFLI_VERSION_MAJOR}.${ZOPFLI_VERSION_MINOR}.${ZOPFLI_VERSION_PATCH}) 62*e47783fdSXin Li 63*e47783fdSXin Liif(ZOPFLI_BUILD_SHARED) 64*e47783fdSXin Li set(zopfli_library_type SHARED) 65*e47783fdSXin Lielse() 66*e47783fdSXin Li set(zopfli_library_type STATIC) 67*e47783fdSXin Liendif() 68*e47783fdSXin Li 69*e47783fdSXin Liinclude(GNUInstallDirs) 70*e47783fdSXin Li 71*e47783fdSXin Li# 72*e47783fdSXin Li# libzopfli 73*e47783fdSXin Li# 74*e47783fdSXin Liadd_library(libzopfli ${zopfli_library_type} 75*e47783fdSXin Li src/zopfli/blocksplitter.c 76*e47783fdSXin Li src/zopfli/cache.c 77*e47783fdSXin Li src/zopfli/deflate.c 78*e47783fdSXin Li src/zopfli/gzip_container.c 79*e47783fdSXin Li src/zopfli/hash.c 80*e47783fdSXin Li src/zopfli/katajainen.c 81*e47783fdSXin Li src/zopfli/lz77.c 82*e47783fdSXin Li src/zopfli/squeeze.c 83*e47783fdSXin Li src/zopfli/tree.c 84*e47783fdSXin Li src/zopfli/util.c 85*e47783fdSXin Li src/zopfli/zlib_container.c 86*e47783fdSXin Li src/zopfli/zopfli_lib.c 87*e47783fdSXin Li) 88*e47783fdSXin Litarget_include_directories(libzopfli 89*e47783fdSXin Li INTERFACE 90*e47783fdSXin Li $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/zopfli> 91*e47783fdSXin Li $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 92*e47783fdSXin Li) 93*e47783fdSXin Liset_target_properties(libzopfli PROPERTIES 94*e47783fdSXin Li OUTPUT_NAME zopfli 95*e47783fdSXin Li VERSION ${ZOPFLI_VERSION} 96*e47783fdSXin Li SOVERSION ${ZOPFLI_VERSION_MAJOR} 97*e47783fdSXin Li) 98*e47783fdSXin Liif(UNIX AND NOT (BEOS OR HAIKU)) 99*e47783fdSXin Li target_link_libraries(libzopfli m) 100*e47783fdSXin Liendif() 101*e47783fdSXin Li 102*e47783fdSXin Li# 103*e47783fdSXin Li# libzopflipng 104*e47783fdSXin Li# 105*e47783fdSXin Liadd_library(libzopflipng ${zopfli_library_type} 106*e47783fdSXin Li src/zopflipng/zopflipng_lib.cc 107*e47783fdSXin Li src/zopflipng/lodepng/lodepng.cpp 108*e47783fdSXin Li src/zopflipng/lodepng/lodepng_util.cpp 109*e47783fdSXin Li) 110*e47783fdSXin Litarget_link_libraries(libzopflipng libzopfli) 111*e47783fdSXin Litarget_include_directories(libzopflipng 112*e47783fdSXin Li INTERFACE 113*e47783fdSXin Li $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/zopflipng> 114*e47783fdSXin Li $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 115*e47783fdSXin Li) 116*e47783fdSXin Liset_target_properties(libzopflipng PROPERTIES 117*e47783fdSXin Li OUTPUT_NAME zopflipng 118*e47783fdSXin Li VERSION ${ZOPFLI_VERSION} 119*e47783fdSXin Li SOVERSION ${ZOPFLI_VERSION_MAJOR} 120*e47783fdSXin Li) 121*e47783fdSXin Li 122*e47783fdSXin Li# MSVC does not export symbols by default when building a DLL, this is a 123*e47783fdSXin Li# workaround for recent versions of CMake 124*e47783fdSXin Liif(MSVC AND ZOPFLI_BUILD_SHARED) 125*e47783fdSXin Li if(CMAKE_VERSION VERSION_LESS 3.4) 126*e47783fdSXin Li message(WARNING "Automatic export of all symbols to DLL not supported until CMake 3.4") 127*e47783fdSXin Li else() 128*e47783fdSXin Li set_target_properties(libzopfli PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) 129*e47783fdSXin Li set_target_properties(libzopflipng PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) 130*e47783fdSXin Li endif() 131*e47783fdSXin Liendif() 132*e47783fdSXin Li 133*e47783fdSXin Li# 134*e47783fdSXin Li# zopfli 135*e47783fdSXin Li# 136*e47783fdSXin Liadd_executable(zopfli src/zopfli/zopfli_bin.c) 137*e47783fdSXin Litarget_link_libraries(zopfli libzopfli) 138*e47783fdSXin Liif(MSVC) 139*e47783fdSXin Li target_compile_definitions(zopfli PRIVATE _CRT_SECURE_NO_WARNINGS) 140*e47783fdSXin Liendif() 141*e47783fdSXin Li 142*e47783fdSXin Li# 143*e47783fdSXin Li# zopflipng 144*e47783fdSXin Li# 145*e47783fdSXin Liadd_executable(zopflipng src/zopflipng/zopflipng_bin.cc) 146*e47783fdSXin Litarget_link_libraries(zopflipng libzopflipng) 147*e47783fdSXin Liif(MSVC) 148*e47783fdSXin Li target_compile_definitions(zopflipng PRIVATE _CRT_SECURE_NO_WARNINGS) 149*e47783fdSXin Liendif() 150*e47783fdSXin Li 151*e47783fdSXin Li# Create aliases 152*e47783fdSXin Li# 153*e47783fdSXin Li# Makes targets available to projects using Zopfli as a subproject using the 154*e47783fdSXin Li# same names as in the config file package. 155*e47783fdSXin Liif(NOT CMAKE_VERSION VERSION_LESS 3.0) 156*e47783fdSXin Li add_library(Zopfli::libzopfli ALIAS libzopfli) 157*e47783fdSXin Li add_library(Zopfli::libzopflipng ALIAS libzopflipng) 158*e47783fdSXin Li add_executable(Zopfli::zopfli ALIAS zopfli) 159*e47783fdSXin Li add_executable(Zopfli::zopflipng ALIAS zopflipng) 160*e47783fdSXin Liendif() 161*e47783fdSXin Li 162*e47783fdSXin Li# 163*e47783fdSXin Li# Install 164*e47783fdSXin Li# 165*e47783fdSXin Liif(ZOPFLI_BUILD_INSTALL) 166*e47783fdSXin Li # Install binaries, libraries, and headers 167*e47783fdSXin Li install(TARGETS libzopfli libzopflipng zopfli zopflipng 168*e47783fdSXin Li EXPORT ZopfliTargets 169*e47783fdSXin Li RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 170*e47783fdSXin Li LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 171*e47783fdSXin Li ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 172*e47783fdSXin Li ) 173*e47783fdSXin Li install(FILES src/zopfli/zopfli.h src/zopflipng/zopflipng_lib.h 174*e47783fdSXin Li DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 175*e47783fdSXin Li ) 176*e47783fdSXin Li 177*e47783fdSXin Li # Install config file package 178*e47783fdSXin Li # 179*e47783fdSXin Li # This allows CMake based projects to use the installed libraries with 180*e47783fdSXin Li # find_package(Zopfli). 181*e47783fdSXin Li if(NOT CMAKE_VERSION VERSION_LESS 3.0) 182*e47783fdSXin Li include(CMakePackageConfigHelpers) 183*e47783fdSXin Li write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/ZopfliConfigVersion.cmake 184*e47783fdSXin Li VERSION ${ZOPFLI_VERSION} 185*e47783fdSXin Li COMPATIBILITY SameMajorVersion 186*e47783fdSXin Li ) 187*e47783fdSXin Li # Since we have no dependencies, use export file directly as config file 188*e47783fdSXin Li install(EXPORT ZopfliTargets 189*e47783fdSXin Li DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Zopfli 190*e47783fdSXin Li NAMESPACE Zopfli:: 191*e47783fdSXin Li FILE ZopfliConfig.cmake 192*e47783fdSXin Li ) 193*e47783fdSXin Li install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ZopfliConfigVersion.cmake 194*e47783fdSXin Li DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Zopfli 195*e47783fdSXin Li ) 196*e47783fdSXin Li endif() 197*e47783fdSXin Liendif() 198