648db22b |
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 () |