| 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 | |
| 16 | if(NOT ZSTD_BUILD_SHARED AND NOT ZSTD_BUILD_STATIC) |
| 17 | message(SEND_ERROR "You need to build at least one flavor of libzstd") |
| 18 | endif() |
| 19 | |
| 20 | # Define library directory, where sources and header files are located |
| 21 | include_directories(${LIBRARY_DIR} ${LIBRARY_DIR}/common) |
| 22 | |
| 23 | file(GLOB CommonSources ${LIBRARY_DIR}/common/*.c) |
| 24 | file(GLOB CompressSources ${LIBRARY_DIR}/compress/*.c) |
| 25 | if (MSVC) |
| 26 | file(GLOB DecompressSources ${LIBRARY_DIR}/decompress/*.c) |
| 27 | add_compile_options(-DZSTD_DISABLE_ASM) |
| 28 | else () |
| 29 | file(GLOB DecompressSources ${LIBRARY_DIR}/decompress/*.c ${LIBRARY_DIR}/decompress/*.S) |
| 30 | endif () |
| 31 | file(GLOB DictBuilderSources ${LIBRARY_DIR}/dictBuilder/*.c) |
| 32 | |
| 33 | set(Sources |
| 34 | ${CommonSources} |
| 35 | ${CompressSources} |
| 36 | ${DecompressSources} |
| 37 | ${DictBuilderSources}) |
| 38 | |
| 39 | file(GLOB CommonHeaders ${LIBRARY_DIR}/common/*.h) |
| 40 | file(GLOB CompressHeaders ${LIBRARY_DIR}/compress/*.h) |
| 41 | file(GLOB DecompressHeaders ${LIBRARY_DIR}/decompress/*.h) |
| 42 | file(GLOB DictBuilderHeaders ${LIBRARY_DIR}/dictBuilder/*.h) |
| 43 | |
| 44 | set(Headers |
| 45 | ${LIBRARY_DIR}/zstd.h |
| 46 | ${CommonHeaders} |
| 47 | ${CompressHeaders} |
| 48 | ${DecompressHeaders} |
| 49 | ${DictBuilderHeaders}) |
| 50 | |
| 51 | if (ZSTD_LEGACY_SUPPORT) |
| 52 | set(LIBRARY_LEGACY_DIR ${LIBRARY_DIR}/legacy) |
| 53 | include_directories(${LIBRARY_LEGACY_DIR}) |
| 54 | |
| 55 | set(Sources ${Sources} |
| 56 | ${LIBRARY_LEGACY_DIR}/zstd_v01.c |
| 57 | ${LIBRARY_LEGACY_DIR}/zstd_v02.c |
| 58 | ${LIBRARY_LEGACY_DIR}/zstd_v03.c |
| 59 | ${LIBRARY_LEGACY_DIR}/zstd_v04.c |
| 60 | ${LIBRARY_LEGACY_DIR}/zstd_v05.c |
| 61 | ${LIBRARY_LEGACY_DIR}/zstd_v06.c |
| 62 | ${LIBRARY_LEGACY_DIR}/zstd_v07.c) |
| 63 | |
| 64 | set(Headers ${Headers} |
| 65 | ${LIBRARY_LEGACY_DIR}/zstd_legacy.h |
| 66 | ${LIBRARY_LEGACY_DIR}/zstd_v01.h |
| 67 | ${LIBRARY_LEGACY_DIR}/zstd_v02.h |
| 68 | ${LIBRARY_LEGACY_DIR}/zstd_v03.h |
| 69 | ${LIBRARY_LEGACY_DIR}/zstd_v04.h |
| 70 | ${LIBRARY_LEGACY_DIR}/zstd_v05.h |
| 71 | ${LIBRARY_LEGACY_DIR}/zstd_v06.h |
| 72 | ${LIBRARY_LEGACY_DIR}/zstd_v07.h) |
| 73 | endif () |
| 74 | |
| 75 | if (MSVC) |
| 76 | set(MSVC_RESOURCE_DIR ${ZSTD_SOURCE_DIR}/build/VS2010/libzstd-dll) |
| 77 | set(PlatformDependResources ${MSVC_RESOURCE_DIR}/libzstd-dll.rc) |
| 78 | endif () |
| 79 | |
| 80 | # Explicitly set the language to C for all files, including ASM files. |
| 81 | # Our assembly expects to be compiled by a C compiler, and is only enabled for |
| 82 | # __GNUC__ compatible compilers. Otherwise all the ASM code is disabled by |
| 83 | # macros. |
| 84 | set_source_files_properties(${Sources} PROPERTIES LANGUAGE C) |
| 85 | |
| 86 | # Split project to static and shared libraries build |
| 87 | set(library_targets) |
| 88 | if (ZSTD_BUILD_SHARED) |
| 89 | add_library(libzstd_shared SHARED ${Sources} ${Headers} ${PlatformDependResources}) |
| 90 | list(APPEND library_targets libzstd_shared) |
| 91 | if (ZSTD_MULTITHREAD_SUPPORT) |
| 92 | set_property(TARGET libzstd_shared APPEND PROPERTY COMPILE_DEFINITIONS "ZSTD_MULTITHREAD") |
| 93 | if (UNIX) |
| 94 | target_link_libraries(libzstd_shared ${THREADS_LIBS}) |
| 95 | endif () |
| 96 | endif() |
| 97 | endif () |
| 98 | if (ZSTD_BUILD_STATIC) |
| 99 | add_library(libzstd_static STATIC ${Sources} ${Headers}) |
| 100 | list(APPEND library_targets libzstd_static) |
| 101 | if (ZSTD_MULTITHREAD_SUPPORT) |
| 102 | set_property(TARGET libzstd_static APPEND PROPERTY COMPILE_DEFINITIONS "ZSTD_MULTITHREAD") |
| 103 | if (UNIX) |
| 104 | target_link_libraries(libzstd_static ${THREADS_LIBS}) |
| 105 | endif () |
| 106 | endif () |
| 107 | endif () |
| 108 | |
| 109 | # Add specific compile definitions for MSVC project |
| 110 | if (MSVC) |
| 111 | if (ZSTD_BUILD_SHARED) |
| 112 | set_property(TARGET libzstd_shared APPEND PROPERTY COMPILE_DEFINITIONS "ZSTD_DLL_EXPORT=1;ZSTD_HEAPMODE=0;_CONSOLE;_CRT_SECURE_NO_WARNINGS") |
| 113 | endif () |
| 114 | if (ZSTD_BUILD_STATIC) |
| 115 | set_property(TARGET libzstd_static APPEND PROPERTY COMPILE_DEFINITIONS "ZSTD_HEAPMODE=0;_CRT_SECURE_NO_WARNINGS") |
| 116 | endif () |
| 117 | endif () |
| 118 | |
| 119 | # With MSVC static library needs to be renamed to avoid conflict with import library |
| 120 | if (MSVC OR (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT MINGW)) |
| 121 | set(STATIC_LIBRARY_BASE_NAME zstd_static) |
| 122 | else () |
| 123 | set(STATIC_LIBRARY_BASE_NAME zstd) |
| 124 | endif () |
| 125 | |
| 126 | # Define static and shared library names |
| 127 | if (ZSTD_BUILD_SHARED) |
| 128 | set_target_properties( |
| 129 | libzstd_shared |
| 130 | PROPERTIES |
| 131 | OUTPUT_NAME zstd |
| 132 | VERSION ${zstd_VERSION_MAJOR}.${zstd_VERSION_MINOR}.${zstd_VERSION_PATCH} |
| 133 | SOVERSION ${zstd_VERSION_MAJOR}) |
| 134 | endif () |
| 135 | |
| 136 | if (ZSTD_BUILD_STATIC) |
| 137 | set_target_properties( |
| 138 | libzstd_static |
| 139 | PROPERTIES |
| 140 | POSITION_INDEPENDENT_CODE On |
| 141 | OUTPUT_NAME ${STATIC_LIBRARY_BASE_NAME}) |
| 142 | endif () |
| 143 | |
| 144 | # pkg-config |
| 145 | include(JoinPaths) # can be replaced by cmake_path(APPEND) in CMake 3.20 |
| 146 | set(PREFIX "${CMAKE_INSTALL_PREFIX}") |
| 147 | set(EXEC_PREFIX "\${prefix}") |
| 148 | join_paths(LIBDIR "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}") |
| 149 | join_paths(INCLUDEDIR "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") |
| 150 | set(LIBS_PRIVATE "${THREADS_LIBS}") |
| 151 | set(VERSION "${zstd_VERSION}") |
| 152 | |
| 153 | configure_file("${LIBRARY_DIR}/libzstd.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" @ONLY) |
| 154 | install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") |
| 155 | |
| 156 | # install target |
| 157 | install(FILES |
| 158 | "${LIBRARY_DIR}/zstd.h" |
| 159 | "${LIBRARY_DIR}/zdict.h" |
| 160 | "${LIBRARY_DIR}/zstd_errors.h" |
| 161 | DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") |
| 162 | |
| 163 | install(TARGETS ${library_targets} |
| 164 | EXPORT zstdExports |
| 165 | INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" |
| 166 | ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" |
| 167 | LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" |
| 168 | RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" |
| 169 | BUNDLE DESTINATION "${CMAKE_INSTALL_BINDIR}" |
| 170 | ) |
| 171 | |
| 172 | # uninstall target |
| 173 | if (NOT TARGET uninstall) |
| 174 | configure_file( |
| 175 | "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" |
| 176 | "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" |
| 177 | IMMEDIATE @ONLY) |
| 178 | |
| 179 | add_custom_target(uninstall |
| 180 | COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) |
| 181 | endif () |