| 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 | |
| 10 | project(libzstd C ASM) |
| 11 | |
| 12 | set(CMAKE_INCLUDE_CURRENT_DIR TRUE) |
| 13 | option(ZSTD_BUILD_STATIC "BUILD STATIC LIBRARIES" ON) |
| 14 | option(ZSTD_BUILD_SHARED "BUILD SHARED LIBRARIES" ON) |
| 15 | option(ZSTD_BUILD_COMPRESSION "BUILD COMPRESSION MODULE" ON) |
| 16 | option(ZSTD_BUILD_DECOMPRESSION "BUILD DECOMPRESSION MODULE" ON) |
| 17 | option(ZSTD_BUILD_DICTBUILDER "BUILD DICTBUILDER MODULE" ON) |
| 18 | option(ZSTD_BUILD_DEPRECATED "BUILD DEPRECATED MODULE" OFF) |
| 19 | |
| 20 | set(ZSTDLIB_VISIBLE "" CACHE STRING "Visibility for ZSTDLIB API") |
| 21 | set(ZSTDERRORLIB_VISIBLE "" CACHE STRING "Visibility for ZSTDERRORLIB_VISIBLE API") |
| 22 | set(ZDICTLIB_VISIBLE "" CACHE STRING "Visibility for ZDICTLIB_VISIBLE API") |
| 23 | set(ZSTDLIB_STATIC_API "" CACHE STRING "Visibility for ZSTDLIB_STATIC_API API") |
| 24 | set(ZDICTLIB_STATIC_API "" CACHE STRING "Visibility for ZDICTLIB_STATIC_API API") |
| 25 | |
| 26 | set_property(CACHE ZSTDLIB_VISIBLE PROPERTY STRINGS "" "hidden" "default" "protected" "internal") |
| 27 | set_property(CACHE ZSTDERRORLIB_VISIBLE PROPERTY STRINGS "" "hidden" "default" "protected" "internal") |
| 28 | set_property(CACHE ZDICTLIB_VISIBLE PROPERTY STRINGS "" "hidden" "default" "protected" "internal") |
| 29 | set_property(CACHE ZSTDLIB_STATIC_API PROPERTY STRINGS "" "hidden" "default" "protected" "internal") |
| 30 | set_property(CACHE ZDICTLIB_STATIC_API PROPERTY STRINGS "" "hidden" "default" "protected" "internal") |
| 31 | |
| 32 | if(NOT ZSTD_BUILD_SHARED AND NOT ZSTD_BUILD_STATIC) |
| 33 | message(SEND_ERROR "You need to build at least one flavor of libzstd") |
| 34 | endif() |
| 35 | |
| 36 | file(GLOB CommonSources ${LIBRARY_DIR}/common/*.c) |
| 37 | file(GLOB CompressSources ${LIBRARY_DIR}/compress/*.c) |
| 38 | file(GLOB DecompressSources ${LIBRARY_DIR}/decompress/*.c) |
| 39 | if (MSVC) |
| 40 | add_compile_options(-DZSTD_DISABLE_ASM) |
| 41 | else () |
| 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() |
| 47 | endif () |
| 48 | file(GLOB DictBuilderSources ${LIBRARY_DIR}/dictBuilder/*.c) |
| 49 | file(GLOB DeprecatedSources ${LIBRARY_DIR}/deprecated/*.c) |
| 50 | |
| 51 | file(GLOB PublicHeaders ${LIBRARY_DIR}/*.h) |
| 52 | file(GLOB CommonHeaders ${LIBRARY_DIR}/common/*.h) |
| 53 | file(GLOB CompressHeaders ${LIBRARY_DIR}/compress/*.h) |
| 54 | file(GLOB DecompressHeaders ${LIBRARY_DIR}/decompress/*.h) |
| 55 | file(GLOB DictBuilderHeaders ${LIBRARY_DIR}/dictBuilder/*.h) |
| 56 | file(GLOB DeprecatedHeaders ${LIBRARY_DIR}/deprecated/*.h) |
| 57 | |
| 58 | set(Sources ${CommonSources}) |
| 59 | set(Headers ${PublicHeaders} ${CommonHeaders}) |
| 60 | if (ZSTD_BUILD_COMPRESSION) |
| 61 | set(Sources ${Sources} ${CompressSources}) |
| 62 | set(Headers ${Headers} ${CompressHeaders}) |
| 63 | endif() |
| 64 | if (ZSTD_BUILD_DECOMPRESSION) |
| 65 | set(Sources ${Sources} ${DecompressSources}) |
| 66 | set(Headers ${Headers} ${DecompressHeaders}) |
| 67 | endif() |
| 68 | if (ZSTD_BUILD_DICTBUILDER) |
| 69 | set(Sources ${Sources} ${DictBuilderSources}) |
| 70 | set(Headers ${Headers} ${DictBuilderHeaders}) |
| 71 | endif() |
| 72 | if (ZSTD_BUILD_DEPRECATED) |
| 73 | set(Sources ${Sources} ${DeprecatedSources}) |
| 74 | set(Headers ${Headers} ${DeprecatedHeaders}) |
| 75 | endif() |
| 76 | |
| 77 | if (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) |
| 98 | endif () |
| 99 | |
| 100 | if (MSVC) |
| 101 | set(MSVC_RESOURCE_DIR ${ZSTD_SOURCE_DIR}/build/VS2010/libzstd-dll) |
| 102 | set(PlatformDependResources ${MSVC_RESOURCE_DIR}/libzstd-dll.rc) |
| 103 | endif () |
| 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. |
| 109 | if(NOT CMAKE_ASM_COMPILER STREQUAL CMAKE_C_COMPILER) |
| 110 | set_source_files_properties(${Sources} PROPERTIES LANGUAGE C) |
| 111 | endif() |
| 112 | |
| 113 | macro (add_definition target var) |
| 114 | if (NOT ("${${var}}" STREQUAL "")) |
| 115 | set_property(TARGET ${target} APPEND PROPERTY COMPILE_DEFINITIONS "${var}=__attribute__((visibility(\"${${var}}\")))") |
| 116 | endif () |
| 117 | endmacro () |
| 118 | |
| 119 | # Define directories containing the library's public headers |
| 120 | set(PUBLIC_INCLUDE_DIRS ${LIBRARY_DIR}) |
| 121 | |
| 122 | # Split project to static and shared libraries build |
| 123 | set(library_targets) |
| 124 | if (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) |
| 137 | endif () |
| 138 | if (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) |
| 153 | endif () |
| 154 | if (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) |
| 161 | endif () |
| 162 | if (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) |
| 169 | endif () |
| 170 | if (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 () |
| 183 | endif () |
| 184 | |
| 185 | # Add specific compile definitions for MSVC project |
| 186 | if (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 () |
| 193 | endif () |
| 194 | |
| 195 | # With MSVC static library needs to be renamed to avoid conflict with import library |
| 196 | if (MSVC OR (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT MINGW)) |
| 197 | set(STATIC_LIBRARY_BASE_NAME zstd_static) |
| 198 | else () |
| 199 | set(STATIC_LIBRARY_BASE_NAME zstd) |
| 200 | endif () |
| 201 | |
| 202 | # Define static and shared library names |
| 203 | if (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}) |
| 210 | endif () |
| 211 | |
| 212 | if (ZSTD_BUILD_STATIC) |
| 213 | set_target_properties( |
| 214 | libzstd_static |
| 215 | PROPERTIES |
| 216 | POSITION_INDEPENDENT_CODE On |
| 217 | OUTPUT_NAME ${STATIC_LIBRARY_BASE_NAME}) |
| 218 | endif () |
| 219 | |
| 220 | # pkg-config |
| 221 | include(JoinPaths) # can be replaced by cmake_path(APPEND) in CMake 3.20 |
| 222 | set(PREFIX "${CMAKE_INSTALL_PREFIX}") |
| 223 | set(EXEC_PREFIX "\${prefix}") |
| 224 | join_paths(LIBDIR "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}") |
| 225 | join_paths(INCLUDEDIR "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") |
| 226 | set(LIBS_PRIVATE "${THREADS_LIBS}") |
| 227 | set(VERSION "${zstd_VERSION}") |
| 228 | |
| 229 | configure_file("${LIBRARY_DIR}/libzstd.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" @ONLY) |
| 230 | install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") |
| 231 | |
| 232 | # install target |
| 233 | install(FILES ${PublicHeaders} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") |
| 234 | |
| 235 | install(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 |
| 245 | if (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) |
| 253 | endif () |