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