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