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