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