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 10project(libzstd C ASM) 11 12set(CMAKE_INCLUDE_CURRENT_DIR TRUE) 13option(ZSTD_BUILD_STATIC "BUILD STATIC LIBRARIES" ON) 14option(ZSTD_BUILD_SHARED "BUILD SHARED LIBRARIES" ON) 15option(ZSTD_BUILD_COMPRESSION "BUILD COMPRESSION MODULE" ON) 16option(ZSTD_BUILD_DECOMPRESSION "BUILD DECOMPRESSION MODULE" ON) 17option(ZSTD_BUILD_DICTBUILDER "BUILD DICTBUILDER MODULE" ON) 18option(ZSTD_BUILD_DEPRECATED "BUILD DEPRECATED MODULE" OFF) 19 20set(ZSTDLIB_VISIBLE "" CACHE STRING "Visibility for ZSTDLIB API") 21set(ZSTDERRORLIB_VISIBLE "" CACHE STRING "Visibility for ZSTDERRORLIB_VISIBLE API") 22set(ZDICTLIB_VISIBLE "" CACHE STRING "Visibility for ZDICTLIB_VISIBLE API") 23set(ZSTDLIB_STATIC_API "" CACHE STRING "Visibility for ZSTDLIB_STATIC_API API") 24set(ZDICTLIB_STATIC_API "" CACHE STRING "Visibility for ZDICTLIB_STATIC_API API") 25 26set_property(CACHE ZSTDLIB_VISIBLE PROPERTY STRINGS "" "hidden" "default" "protected" "internal") 27set_property(CACHE ZSTDERRORLIB_VISIBLE PROPERTY STRINGS "" "hidden" "default" "protected" "internal") 28set_property(CACHE ZDICTLIB_VISIBLE PROPERTY STRINGS "" "hidden" "default" "protected" "internal") 29set_property(CACHE ZSTDLIB_STATIC_API PROPERTY STRINGS "" "hidden" "default" "protected" "internal") 30set_property(CACHE ZDICTLIB_STATIC_API PROPERTY STRINGS "" "hidden" "default" "protected" "internal") 31 32if(NOT ZSTD_BUILD_SHARED AND NOT ZSTD_BUILD_STATIC) 33 message(SEND_ERROR "You need to build at least one flavor of libzstd") 34endif() 35 36file(GLOB CommonSources ${LIBRARY_DIR}/common/*.c) 37file(GLOB CompressSources ${LIBRARY_DIR}/compress/*.c) 38file(GLOB DecompressSources ${LIBRARY_DIR}/decompress/*.c) 39if (MSVC) 40 add_compile_options(-DZSTD_DISABLE_ASM) 41else () 42 if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|AMD64.*|x86_64.*|X86_64.*") 43 set(DecompressSources ${DecompressSources} ${LIBRARY_DIR}/decompress/huf_decompress_amd64.S) 44 else() 45 add_compile_options(-DZSTD_DISABLE_ASM) 46 endif() 47endif () 48file(GLOB DictBuilderSources ${LIBRARY_DIR}/dictBuilder/*.c) 49file(GLOB DeprecatedSources ${LIBRARY_DIR}/deprecated/*.c) 50 51file(GLOB PublicHeaders ${LIBRARY_DIR}/*.h) 52file(GLOB CommonHeaders ${LIBRARY_DIR}/common/*.h) 53file(GLOB CompressHeaders ${LIBRARY_DIR}/compress/*.h) 54file(GLOB DecompressHeaders ${LIBRARY_DIR}/decompress/*.h) 55file(GLOB DictBuilderHeaders ${LIBRARY_DIR}/dictBuilder/*.h) 56file(GLOB DeprecatedHeaders ${LIBRARY_DIR}/deprecated/*.h) 57 58set(Sources ${CommonSources}) 59set(Headers ${PublicHeaders} ${CommonHeaders}) 60if (ZSTD_BUILD_COMPRESSION) 61 set(Sources ${Sources} ${CompressSources}) 62 set(Headers ${Headers} ${CompressHeaders}) 63endif() 64if (ZSTD_BUILD_DECOMPRESSION) 65 set(Sources ${Sources} ${DecompressSources}) 66 set(Headers ${Headers} ${DecompressHeaders}) 67endif() 68if (ZSTD_BUILD_DICTBUILDER) 69 set(Sources ${Sources} ${DictBuilderSources}) 70 set(Headers ${Headers} ${DictBuilderHeaders}) 71endif() 72if (ZSTD_BUILD_DEPRECATED) 73 set(Sources ${Sources} ${DeprecatedSources}) 74 set(Headers ${Headers} ${DeprecatedHeaders}) 75endif() 76 77if (ZSTD_LEGACY_SUPPORT) 78 set(LIBRARY_LEGACY_DIR ${LIBRARY_DIR}/legacy) 79 80 set(Sources ${Sources} 81 ${LIBRARY_LEGACY_DIR}/zstd_v01.c 82 ${LIBRARY_LEGACY_DIR}/zstd_v02.c 83 ${LIBRARY_LEGACY_DIR}/zstd_v03.c 84 ${LIBRARY_LEGACY_DIR}/zstd_v04.c 85 ${LIBRARY_LEGACY_DIR}/zstd_v05.c 86 ${LIBRARY_LEGACY_DIR}/zstd_v06.c 87 ${LIBRARY_LEGACY_DIR}/zstd_v07.c) 88 89 set(Headers ${Headers} 90 ${LIBRARY_LEGACY_DIR}/zstd_legacy.h 91 ${LIBRARY_LEGACY_DIR}/zstd_v01.h 92 ${LIBRARY_LEGACY_DIR}/zstd_v02.h 93 ${LIBRARY_LEGACY_DIR}/zstd_v03.h 94 ${LIBRARY_LEGACY_DIR}/zstd_v04.h 95 ${LIBRARY_LEGACY_DIR}/zstd_v05.h 96 ${LIBRARY_LEGACY_DIR}/zstd_v06.h 97 ${LIBRARY_LEGACY_DIR}/zstd_v07.h) 98endif () 99 100if (MSVC) 101 set(MSVC_RESOURCE_DIR ${ZSTD_SOURCE_DIR}/build/VS2010/libzstd-dll) 102 set(PlatformDependResources ${MSVC_RESOURCE_DIR}/libzstd-dll.rc) 103endif () 104 105# Explicitly set the language to C for all files, including ASM files. 106# Our assembly expects to be compiled by a C compiler, and is only enabled for 107# __GNUC__ compatible compilers. Otherwise all the ASM code is disabled by 108# macros. 109if(NOT CMAKE_ASM_COMPILER STREQUAL CMAKE_C_COMPILER) 110 set_source_files_properties(${Sources} PROPERTIES LANGUAGE C) 111endif() 112 113macro (add_definition target var) 114 if (NOT ("${${var}}" STREQUAL "")) 115 set_property(TARGET ${target} APPEND PROPERTY COMPILE_DEFINITIONS "${var}=__attribute__((visibility(\"${${var}}\")))") 116 endif () 117endmacro () 118 119# Define directories containing the library's public headers 120set(PUBLIC_INCLUDE_DIRS ${LIBRARY_DIR}) 121 122# Split project to static and shared libraries build 123set(library_targets) 124if (ZSTD_BUILD_SHARED) 125 add_library(libzstd_shared SHARED ${Sources} ${Headers} ${PlatformDependResources}) 126 target_include_directories(libzstd_shared INTERFACE $<BUILD_INTERFACE:${PUBLIC_INCLUDE_DIRS}>) 127 list(APPEND library_targets libzstd_shared) 128 if (ZSTD_MULTITHREAD_SUPPORT) 129 set_property(TARGET libzstd_shared APPEND PROPERTY COMPILE_DEFINITIONS "ZSTD_MULTITHREAD") 130 if (UNIX) 131 target_link_libraries(libzstd_shared ${THREADS_LIBS}) 132 endif () 133 endif () 134 add_definition(libzstd_shared ZSTDLIB_VISIBLE) 135 add_definition(libzstd_shared ZSTDERRORLIB_VISIBLE) 136 add_definition(libzstd_shared ZDICTLIB_VISIBLE) 137endif () 138if (ZSTD_BUILD_STATIC) 139 add_library(libzstd_static STATIC ${Sources} ${Headers}) 140 target_include_directories(libzstd_static INTERFACE $<BUILD_INTERFACE:${PUBLIC_INCLUDE_DIRS}>) 141 list(APPEND library_targets libzstd_static) 142 if (ZSTD_MULTITHREAD_SUPPORT) 143 set_property(TARGET libzstd_static APPEND PROPERTY COMPILE_DEFINITIONS "ZSTD_MULTITHREAD") 144 if (UNIX) 145 target_link_libraries(libzstd_static ${THREADS_LIBS}) 146 endif () 147 endif () 148 add_definition(libzstd_static ZSTDLIB_VISIBLE) 149 add_definition(libzstd_static ZSTDERRORLIB_VISIBLE) 150 add_definition(libzstd_static ZDICTLIB_VISIBLE) 151 add_definition(libzstd_static ZSTDLIB_STATIC_API) 152 add_definition(libzstd_static ZDICTLIB_STATIC_API) 153endif () 154if (ZSTD_BUILD_SHARED AND NOT ZSTD_BUILD_STATIC) 155 if (NOT BUILD_SHARED_LIBS) 156 message(WARNING "BUILD_SHARED_LIBS is OFF, but ZSTD_BUILD_SHARED is ON and ZSTD_BUILD_STATIC is OFF, which takes precedence, so libzstd is a shared library") 157 endif () 158 add_library(libzstd INTERFACE) 159 target_link_libraries(libzstd INTERFACE libzstd_shared) 160 list(APPEND library_targets libzstd) 161endif () 162if (ZSTD_BUILD_STATIC AND NOT ZSTD_BUILD_SHARED) 163 if (BUILD_SHARED_LIBS) 164 message(WARNING "BUILD_SHARED_LIBS is ON, but ZSTD_BUILD_SHARED is OFF and ZSTD_BUILD_STATIC is ON, which takes precedence, is set so libzstd is a static library") 165 endif () 166 add_library(libzstd INTERFACE) 167 target_link_libraries(libzstd INTERFACE libzstd_static) 168 list(APPEND library_targets libzstd) 169endif () 170if (ZSTD_BUILD_SHARED AND ZSTD_BUILD_STATIC) 171 # If both ZSTD_BUILD_SHARED and ZSTD_BUILD_STATIC are set, which is the 172 # default, fallback to using BUILD_SHARED_LIBS to determine whether to 173 # set libzstd to static or shared. 174 if (BUILD_SHARED_LIBS) 175 add_library(libzstd INTERFACE) 176 target_link_libraries(libzstd INTERFACE libzstd_shared) 177 list(APPEND library_targets libzstd) 178 else () 179 add_library(libzstd INTERFACE) 180 target_link_libraries(libzstd INTERFACE libzstd_static) 181 list(APPEND library_targets libzstd) 182 endif () 183endif () 184 185# Add specific compile definitions for MSVC project 186if (MSVC) 187 if (ZSTD_BUILD_SHARED) 188 set_property(TARGET libzstd_shared APPEND PROPERTY COMPILE_DEFINITIONS "ZSTD_DLL_EXPORT=1;ZSTD_HEAPMODE=0;_CONSOLE;_CRT_SECURE_NO_WARNINGS") 189 endif () 190 if (ZSTD_BUILD_STATIC) 191 set_property(TARGET libzstd_static APPEND PROPERTY COMPILE_DEFINITIONS "ZSTD_HEAPMODE=0;_CRT_SECURE_NO_WARNINGS") 192 endif () 193endif () 194 195# With MSVC static library needs to be renamed to avoid conflict with import library 196if (MSVC OR (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT MINGW)) 197 set(STATIC_LIBRARY_BASE_NAME zstd_static) 198else () 199 set(STATIC_LIBRARY_BASE_NAME zstd) 200endif () 201 202# Define static and shared library names 203if (ZSTD_BUILD_SHARED) 204 set_target_properties( 205 libzstd_shared 206 PROPERTIES 207 OUTPUT_NAME zstd 208 VERSION ${zstd_VERSION_MAJOR}.${zstd_VERSION_MINOR}.${zstd_VERSION_PATCH} 209 SOVERSION ${zstd_VERSION_MAJOR}) 210endif () 211 212if (ZSTD_BUILD_STATIC) 213 set_target_properties( 214 libzstd_static 215 PROPERTIES 216 POSITION_INDEPENDENT_CODE On 217 OUTPUT_NAME ${STATIC_LIBRARY_BASE_NAME}) 218endif () 219 220# pkg-config 221include(JoinPaths) # can be replaced by cmake_path(APPEND) in CMake 3.20 222set(PREFIX "${CMAKE_INSTALL_PREFIX}") 223set(EXEC_PREFIX "\${prefix}") 224join_paths(LIBDIR "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}") 225join_paths(INCLUDEDIR "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") 226set(LIBS_PRIVATE "${THREADS_LIBS}") 227set(VERSION "${zstd_VERSION}") 228 229configure_file("${LIBRARY_DIR}/libzstd.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" @ONLY) 230install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") 231 232# install target 233install(FILES ${PublicHeaders} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") 234 235install(TARGETS ${library_targets} 236 EXPORT zstdExports 237 INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" 238 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" 239 LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" 240 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" 241 BUNDLE DESTINATION "${CMAKE_INSTALL_BINDIR}" 242 ) 243 244# uninstall target 245if (NOT TARGET uninstall) 246 configure_file( 247 "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" 248 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" 249 IMMEDIATE @ONLY) 250 251 add_custom_target(uninstall 252 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) 253endif () 254