xref: /aosp_15_r20/external/zopfli/CMakeLists.txt (revision e47783fd9ac7e78d0523d35be12ee382df490d63)
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