xref: /aosp_15_r20/external/zstd/build/cmake/CMakeLists.txt (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
1*01826a49SYabin Cui# ################################################################
2*01826a49SYabin Cui# Copyright (c) Meta Platforms, Inc. and affiliates.
3*01826a49SYabin Cui# All rights reserved.
4*01826a49SYabin Cui#
5*01826a49SYabin Cui# This source code is licensed under both the BSD-style license (found in the
6*01826a49SYabin Cui# LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*01826a49SYabin Cui# in the COPYING file in the root directory of this source tree).
8*01826a49SYabin Cui# ################################################################
9*01826a49SYabin Cui
10*01826a49SYabin Cuicmake_minimum_required(VERSION 3.5 FATAL_ERROR)
11*01826a49SYabin Cui
12*01826a49SYabin Cui# As of 2018-12-26 ZSTD has been validated to build with cmake version 3.13.2 new policies.
13*01826a49SYabin Cui# Set and use the newest cmake policies that are validated to work
14*01826a49SYabin Cuiset(ZSTD_MAX_VALIDATED_CMAKE_MAJOR_VERSION "3")
15*01826a49SYabin Cuiset(ZSTD_MAX_VALIDATED_CMAKE_MINOR_VERSION "13") #Policies never changed at PATCH level
16*01826a49SYabin Cuiif("${ZSTD_MAX_VALIDATED_CMAKE_MAJOR_VERSION}" EQUAL "${CMAKE_MAJOR_VERSION}" AND
17*01826a49SYabin Cui       "${ZSTD_MAX_VALIDATED_CMAKE_MINOR_VERSION}" GREATER "${CMAKE_MINOR_VERSION}")
18*01826a49SYabin Cui    set(ZSTD_CMAKE_POLICY_VERSION "${CMAKE_VERSION}")
19*01826a49SYabin Cuielse()
20*01826a49SYabin Cui    set(ZSTD_CMAKE_POLICY_VERSION "${ZSTD_MAX_VALIDATED_CMAKE_MAJOR_VERSION}.${ZSTD_MAX_VALIDATED_CMAKE_MINOR_VERSION}.0")
21*01826a49SYabin Cuiendif()
22*01826a49SYabin Cuicmake_policy(VERSION ${ZSTD_CMAKE_POLICY_VERSION})
23*01826a49SYabin Cui
24*01826a49SYabin Cuiset(CMAKE_BUILD_WITH_INSTALL_RPATH on)
25*01826a49SYabin Cui
26*01826a49SYabin Cuilist(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
27*01826a49SYabin Cuiset(ZSTD_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../..")
28*01826a49SYabin Cuiset(LIBRARY_DIR ${ZSTD_SOURCE_DIR}/lib)
29*01826a49SYabin Cui# Parse version
30*01826a49SYabin Cuiinclude(GetZstdLibraryVersion)
31*01826a49SYabin CuiGetZstdLibraryVersion(${LIBRARY_DIR}/zstd.h zstd_VERSION_MAJOR zstd_VERSION_MINOR zstd_VERSION_PATCH)
32*01826a49SYabin Cui
33*01826a49SYabin Cuiproject(zstd
34*01826a49SYabin Cui  VERSION "${zstd_VERSION_MAJOR}.${zstd_VERSION_MINOR}.${zstd_VERSION_PATCH}"
35*01826a49SYabin Cui  LANGUAGES C   # Main library is in C
36*01826a49SYabin Cui            ASM # And ASM
37*01826a49SYabin Cui            CXX # Testing contributed code also utilizes CXX
38*01826a49SYabin Cui  )
39*01826a49SYabin Cui
40*01826a49SYabin Cuimessage(STATUS "ZSTD VERSION: ${zstd_VERSION}")
41*01826a49SYabin Cuiset(zstd_HOMEPAGE_URL "https://facebook.github.io/zstd")
42*01826a49SYabin Cuiset(zstd_DESCRIPTION  "Zstandard is a real-time compression algorithm, providing high compression ratios.")
43*01826a49SYabin Cui
44*01826a49SYabin Cui# Set a default build type if none was specified
45*01826a49SYabin Cuiif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
46*01826a49SYabin Cui  message(STATUS "Setting build type to 'Release' as none was specified.")
47*01826a49SYabin Cui  set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
48*01826a49SYabin Cui  # Set the possible values of build type for cmake-gui
49*01826a49SYabin Cui  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
50*01826a49SYabin Cuiendif()
51*01826a49SYabin Cui
52*01826a49SYabin Cuiinclude(GNUInstallDirs)
53*01826a49SYabin Cui
54*01826a49SYabin Cui#-----------------------------------------------------------------------------
55*01826a49SYabin Cui# Add extra compilation flags
56*01826a49SYabin Cui#-----------------------------------------------------------------------------
57*01826a49SYabin Cuiinclude(AddZstdCompilationFlags)
58*01826a49SYabin CuiADD_ZSTD_COMPILATION_FLAGS()
59*01826a49SYabin Cui
60*01826a49SYabin Cui# Always hide XXHash symbols
61*01826a49SYabin Cuiadd_definitions(-DXXH_NAMESPACE=ZSTD_)
62*01826a49SYabin Cui
63*01826a49SYabin Cui#-----------------------------------------------------------------------------
64*01826a49SYabin Cui# Installation variables
65*01826a49SYabin Cui#-----------------------------------------------------------------------------
66*01826a49SYabin Cuimessage(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
67*01826a49SYabin Cuimessage(STATUS "CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}")
68*01826a49SYabin Cui
69*01826a49SYabin Cui#-----------------------------------------------------------------------------
70*01826a49SYabin Cui# Options
71*01826a49SYabin Cui#-----------------------------------------------------------------------------
72*01826a49SYabin Cui
73*01826a49SYabin Cui# Legacy support
74*01826a49SYabin Cuioption(ZSTD_LEGACY_SUPPORT "LEGACY SUPPORT" ON)
75*01826a49SYabin Cui
76*01826a49SYabin Cuiif (ZSTD_LEGACY_SUPPORT)
77*01826a49SYabin Cui    message(STATUS "ZSTD_LEGACY_SUPPORT defined!")
78*01826a49SYabin Cui    set(ZSTD_LEGACY_LEVEL 5 CACHE STRING "")
79*01826a49SYabin Cui    add_definitions(-DZSTD_LEGACY_SUPPORT=${ZSTD_LEGACY_LEVEL})
80*01826a49SYabin Cuielse ()
81*01826a49SYabin Cui    message(STATUS "ZSTD_LEGACY_SUPPORT not defined!")
82*01826a49SYabin Cui    add_definitions(-DZSTD_LEGACY_SUPPORT=0)
83*01826a49SYabin Cuiendif ()
84*01826a49SYabin Cui
85*01826a49SYabin Cuiif (ANDROID)
86*01826a49SYabin Cui    set(ZSTD_MULTITHREAD_SUPPORT_DEFAULT OFF)
87*01826a49SYabin Cuielse()
88*01826a49SYabin Cui    set(ZSTD_MULTITHREAD_SUPPORT_DEFAULT ON)
89*01826a49SYabin Cuiendif()
90*01826a49SYabin Cui
91*01826a49SYabin Cui# Multi-threading support
92*01826a49SYabin Cuioption(ZSTD_MULTITHREAD_SUPPORT "MULTITHREADING SUPPORT" ${ZSTD_MULTITHREAD_SUPPORT_DEFAULT})
93*01826a49SYabin Cui
94*01826a49SYabin Cuiif (ZSTD_MULTITHREAD_SUPPORT)
95*01826a49SYabin Cui    message(STATUS "ZSTD_MULTITHREAD_SUPPORT is enabled")
96*01826a49SYabin Cuielse ()
97*01826a49SYabin Cui    message(STATUS "ZSTD_MULTITHREAD_SUPPORT is disabled")
98*01826a49SYabin Cuiendif ()
99*01826a49SYabin Cui
100*01826a49SYabin Cuioption(ZSTD_BUILD_PROGRAMS "BUILD PROGRAMS" ON)
101*01826a49SYabin Cuioption(ZSTD_BUILD_CONTRIB "BUILD CONTRIB" OFF)
102*01826a49SYabin Cui
103*01826a49SYabin Cui# Respect the conventional CMake option for enabling tests if it was specified on the first configure
104*01826a49SYabin Cuiif (BUILD_TESTING)
105*01826a49SYabin Cui    set(ZSTD_BUILD_TESTS_default ON)
106*01826a49SYabin Cuielse()
107*01826a49SYabin Cui    set(ZSTD_BUILD_TESTS_default OFF)
108*01826a49SYabin Cuiendif()
109*01826a49SYabin Cuioption(ZSTD_BUILD_TESTS "BUILD TESTS" ${ZSTD_BUILD_TESTS_default})
110*01826a49SYabin Cuiif (MSVC)
111*01826a49SYabin Cui    option(ZSTD_USE_STATIC_RUNTIME "LINK TO STATIC RUN-TIME LIBRARIES" OFF)
112*01826a49SYabin Cuiendif ()
113*01826a49SYabin Cui
114*01826a49SYabin Cui#-----------------------------------------------------------------------------
115*01826a49SYabin Cui# External dependencies
116*01826a49SYabin Cui#-----------------------------------------------------------------------------
117*01826a49SYabin Cui# Define a function to handle special thread settings for HP-UX
118*01826a49SYabin Cui# See https://github.com/facebook/zstd/pull/3862 for details.
119*01826a49SYabin Cuifunction(setup_hpux_threads)
120*01826a49SYabin Cui    find_package(Threads)
121*01826a49SYabin Cui    if (NOT Threads_FOUND)
122*01826a49SYabin Cui        set(CMAKE_USE_PTHREADS_INIT 1 PARENT_SCOPE)
123*01826a49SYabin Cui        set(CMAKE_THREAD_LIBS_INIT -lpthread PARENT_SCOPE)
124*01826a49SYabin Cui        set(CMAKE_HAVE_THREADS_LIBRARY 1 PARENT_SCOPE)
125*01826a49SYabin Cui        set(Threads_FOUND TRUE PARENT_SCOPE)
126*01826a49SYabin Cui    endif()
127*01826a49SYabin Cuiendfunction()
128*01826a49SYabin Cui
129*01826a49SYabin Cuiif (ZSTD_MULTITHREAD_SUPPORT AND UNIX)
130*01826a49SYabin Cui    if (CMAKE_SYSTEM_NAME MATCHES "HP-UX")
131*01826a49SYabin Cui        setup_hpux_threads()
132*01826a49SYabin Cui    else()
133*01826a49SYabin Cui        set(THREADS_PREFER_PTHREAD_FLAG ON)
134*01826a49SYabin Cui        find_package(Threads REQUIRED)
135*01826a49SYabin Cui    endif()
136*01826a49SYabin Cui    if (CMAKE_USE_PTHREADS_INIT)
137*01826a49SYabin Cui        set(THREADS_LIBS "${CMAKE_THREAD_LIBS_INIT}")
138*01826a49SYabin Cui    else()
139*01826a49SYabin Cui        message(SEND_ERROR "ZSTD currently does not support thread libraries other than pthreads")
140*01826a49SYabin Cui    endif()
141*01826a49SYabin Cuiendif ()
142*01826a49SYabin Cui
143*01826a49SYabin Cui#-----------------------------------------------------------------------------
144*01826a49SYabin Cui# Add source directories
145*01826a49SYabin Cui#-----------------------------------------------------------------------------
146*01826a49SYabin Cuiadd_subdirectory(lib)
147*01826a49SYabin Cui
148*01826a49SYabin Cuioption(ZSTD_PROGRAMS_LINK_SHARED "PROGRAMS LINK SHARED" OFF)
149*01826a49SYabin Cui
150*01826a49SYabin Cuiif (ZSTD_BUILD_PROGRAMS)
151*01826a49SYabin Cui    if (NOT ZSTD_BUILD_STATIC AND NOT ZSTD_PROGRAMS_LINK_SHARED)
152*01826a49SYabin Cui        message(SEND_ERROR "You need to build static library to build zstd CLI")
153*01826a49SYabin Cui    elseif(NOT ZSTD_BUILD_SHARED AND ZSTD_PROGRAMS_LINK_SHARED)
154*01826a49SYabin Cui        message(SEND_ERROR "You need to build shared library to build zstd CLI")
155*01826a49SYabin Cui    endif ()
156*01826a49SYabin Cui
157*01826a49SYabin Cui    add_subdirectory(programs)
158*01826a49SYabin Cuiendif ()
159*01826a49SYabin Cui
160*01826a49SYabin Cuiif (ZSTD_BUILD_TESTS)
161*01826a49SYabin Cui    enable_testing()
162*01826a49SYabin Cui    if (NOT ZSTD_BUILD_STATIC)
163*01826a49SYabin Cui        message(SEND_ERROR "You need to build static library to build tests")
164*01826a49SYabin Cui    endif ()
165*01826a49SYabin Cui
166*01826a49SYabin Cui    add_subdirectory(tests)
167*01826a49SYabin Cuiendif ()
168*01826a49SYabin Cui
169*01826a49SYabin Cuiif (ZSTD_BUILD_CONTRIB)
170*01826a49SYabin Cui    add_subdirectory(contrib)
171*01826a49SYabin Cuiendif ()
172*01826a49SYabin Cui
173*01826a49SYabin Cui#-----------------------------------------------------------------------------
174*01826a49SYabin Cui# Add clean-all target
175*01826a49SYabin Cui#-----------------------------------------------------------------------------
176*01826a49SYabin Cuiadd_custom_target(clean-all
177*01826a49SYabin Cui   COMMAND ${CMAKE_BUILD_TOOL} clean
178*01826a49SYabin Cui   COMMAND rm -rf ${CMAKE_BINARY_DIR}/
179*01826a49SYabin Cui)
180*01826a49SYabin Cui
181*01826a49SYabin Cui#-----------------------------------------------------------------------------
182*01826a49SYabin Cui# Generate Package Config files
183*01826a49SYabin Cui#
184*01826a49SYabin Cui# This section is based on the boiler plate code from:
185*01826a49SYabin Cui# https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#creating-packages
186*01826a49SYabin Cui#-----------------------------------------------------------------------------
187*01826a49SYabin Cuiinclude(CMakePackageConfigHelpers)
188*01826a49SYabin Cuiwrite_basic_package_version_file(
189*01826a49SYabin Cui    "${CMAKE_CURRENT_BINARY_DIR}/zstdConfigVersion.cmake"
190*01826a49SYabin Cui    VERSION ${zstd_VERSION}
191*01826a49SYabin Cui    COMPATIBILITY SameMajorVersion
192*01826a49SYabin Cui    )
193*01826a49SYabin Cui
194*01826a49SYabin Cui# A Package Config file that works from the build directory
195*01826a49SYabin Cuiexport(EXPORT zstdExports
196*01826a49SYabin Cui    FILE "${CMAKE_CURRENT_BINARY_DIR}/zstdTargets.cmake"
197*01826a49SYabin Cui    NAMESPACE zstd::
198*01826a49SYabin Cui    )
199*01826a49SYabin Cui
200*01826a49SYabin Cui# A Package Config file that works from the installation directory
201*01826a49SYabin Cuiset(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/zstd)
202*01826a49SYabin Cuiinstall(EXPORT zstdExports
203*01826a49SYabin Cui    FILE zstdTargets.cmake
204*01826a49SYabin Cui    NAMESPACE zstd::
205*01826a49SYabin Cui    DESTINATION ${ConfigPackageLocation}
206*01826a49SYabin Cui    )
207*01826a49SYabin Cuiconfigure_package_config_file(
208*01826a49SYabin Cui    zstdConfig.cmake.in
209*01826a49SYabin Cui    "${CMAKE_CURRENT_BINARY_DIR}/zstdConfig.cmake"
210*01826a49SYabin Cui    INSTALL_DESTINATION ${ConfigPackageLocation}
211*01826a49SYabin Cui)
212*01826a49SYabin Cuiinstall(FILES
213*01826a49SYabin Cui    "${CMAKE_CURRENT_BINARY_DIR}/zstdConfig.cmake"
214*01826a49SYabin Cui    "${CMAKE_CURRENT_BINARY_DIR}/zstdConfigVersion.cmake"
215*01826a49SYabin Cui    DESTINATION ${ConfigPackageLocation}
216*01826a49SYabin Cui    )
217