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) |
f535537f |
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") |
648db22b |
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 | |
648db22b |
36 | file(GLOB CommonSources ${LIBRARY_DIR}/common/*.c) |
37 | file(GLOB CompressSources ${LIBRARY_DIR}/compress/*.c) |
f535537f |
38 | file(GLOB DecompressSources ${LIBRARY_DIR}/decompress/*.c) |
648db22b |
39 | if (MSVC) |
648db22b |
40 | add_compile_options(-DZSTD_DISABLE_ASM) |
41 | else () |
f535537f |
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() |
648db22b |
47 | endif () |
48 | file(GLOB DictBuilderSources ${LIBRARY_DIR}/dictBuilder/*.c) |
f535537f |
49 | file(GLOB DeprecatedSources ${LIBRARY_DIR}/deprecated/*.c) |
648db22b |
50 | |
f535537f |
51 | file(GLOB PublicHeaders ${LIBRARY_DIR}/*.h) |
648db22b |
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) |
f535537f |
56 | file(GLOB DeprecatedHeaders ${LIBRARY_DIR}/deprecated/*.h) |
648db22b |
57 | |
f535537f |
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() |
648db22b |
76 | |
77 | if (ZSTD_LEGACY_SUPPORT) |
78 | set(LIBRARY_LEGACY_DIR ${LIBRARY_DIR}/legacy) |
648db22b |
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. |
f535537f |
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}) |
648db22b |
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}) |
f535537f |
126 | target_include_directories(libzstd_shared INTERFACE $<BUILD_INTERFACE:${PUBLIC_INCLUDE_DIRS}>) |
648db22b |
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 () |
f535537f |
133 | endif () |
134 | add_definition(libzstd_shared ZSTDLIB_VISIBLE) |
135 | add_definition(libzstd_shared ZSTDERRORLIB_VISIBLE) |
136 | add_definition(libzstd_shared ZDICTLIB_VISIBLE) |
648db22b |
137 | endif () |
138 | if (ZSTD_BUILD_STATIC) |
139 | add_library(libzstd_static STATIC ${Sources} ${Headers}) |
f535537f |
140 | target_include_directories(libzstd_static INTERFACE $<BUILD_INTERFACE:${PUBLIC_INCLUDE_DIRS}>) |
648db22b |
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 () |
f535537f |
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 () |
648db22b |
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 |
f535537f |
233 | install(FILES ${PublicHeaders} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") |
648db22b |
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 () |