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