Skip to content

Commit de18c4d

Browse files
authored
build(deps): Add task-based installation and cmake find module script for LibLZMA dependency. (#1184)
1 parent 8dd1abb commit de18c4d

File tree

4 files changed

+158
-27
lines changed

4 files changed

+158
-27
lines changed

components/core/CMakeLists.txt

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ if(PROJECT_IS_TOP_LEVEL)
123123
# Include dependency settings if the project isn't being included as a subproject.
124124
# NOTE: We mark the file optional since it's not required if the user happens to have the
125125
# dependencies installed already.
126-
include("${CMAKE_SOURCE_DIR}/../../build/deps/core/cmake-settings/all.cmake"
126+
set(CLP_CORE_DEPS_DIR "${CMAKE_SOURCE_DIR}/../../build/deps/core")
127+
include("${CLP_CORE_DEPS_DIR}/cmake-settings/all.cmake"
127128
OPTIONAL
128129
RESULT_VARIABLE CLP_DEPS_SETTINGS_FILE_PATH
129130
)
@@ -308,31 +309,16 @@ if(CLP_NEED_ZSTD)
308309
endif()
309310
endif()
310311

311-
# Find and setup LZMA Library
312-
# TODO: Add a script in ./cmake/Modules to properly import LZMA in find_package()'s module mode
313-
if(CLP_NEED_LZMA)
312+
if(CLP_NEED_LIBLZMA)
314313
if(CLP_USE_STATIC_LIBS)
315-
set(LIBLZMA_USE_STATIC_LIBS ON)
316-
endif()
317-
find_package(LibLZMA REQUIRED)
318-
if(LIBLZMA_FOUND)
319-
message(STATUS "Found Lzma ${LIBLZMA_VERSION_STRING}")
320-
message(STATUS "Lzma library location: ${LIBLZMA_LIBRARIES}")
321-
message(STATUS "Lzma Include Dir: ${LIBLZMA_INCLUDE_DIRS}")
322-
323-
# Version 5.8.1 and above address CVE-2024-3094 and CVE-2025-31115.
324-
set(REQUIRED_LIBLZMA_VERSION "5.8.1")
325-
if(LIBLZMA_VERSION_STRING VERSION_LESS ${REQUIRED_LIBLZMA_VERSION})
326-
message(
327-
FATAL_ERROR
328-
"Detected LibLZMA version ${LIBLZMA_VERSION_STRING} is older than required"
329-
" ${REQUIRED_LIBLZMA_VERSION}"
330-
)
331-
endif()
314+
set(LibLZMA_ROOT ${LibLZMA-static_ROOT})
315+
set(LibLZMA_USE_STATIC_LIBS ON)
332316
else()
333-
message(FATAL_ERROR "Could not find ${CLP_LIBS_STRING} libraries for Lzma")
317+
set(LibLZMA_ROOT ${LibLZMA-shared_ROOT})
334318
endif()
335-
include_directories(${LIBLZMA_INCLUDE_DIRS})
319+
# Version 5.8.1 and above address CVE-2024-3094 and CVE-2025-31115.
320+
find_package(LibLZMA 5.8.1 REQUIRED)
321+
message(STATUS "Found LibLZMA ${LibLZMA_VERSION}")
336322
endif()
337323

338324
# sqlite dependencies
@@ -759,6 +745,7 @@ if(CLP_BUILD_TESTING)
759745
fmt::fmt
760746
log_surgeon::log_surgeon
761747
LibArchive::LibArchive
748+
LibLZMA::LibLZMA
762749
MariaDBClient::MariaDBClient
763750
${MONGOCXX_TARGET}
764751
nlohmann_json::nlohmann_json
@@ -771,7 +758,6 @@ if(CLP_BUILD_TESTING)
771758
clp::string_utils
772759
ystdlib::containers
773760
ystdlib::error_handling
774-
${LIBLZMA_LIBRARIES}
775761
${zstd_TARGET}
776762
)
777763
target_compile_features(unitTest
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# Try to find LibLZMA
2+
# NOTE: The FindLibLZMA.cmake included with CMake has no support for static libraries, so we use our
3+
# own.
4+
#
5+
# Set LibLZMA_USE_STATIC_LIBS=ON to look for static libraries.
6+
#
7+
# Once done, this will define:
8+
# LibLZMA_FOUND - Whether the library was found on the system
9+
# LibLZMA_INCLUDE_DIR - The library include directories
10+
# LibLZMA_LIBRARY - The path to the library file
11+
# LibLZMA_VERSION - The version of the library installed on the system
12+
#
13+
# Conventions:
14+
# - Variables only for use within the script are prefixed with "liblzma_"
15+
# - Variables that should be externally visible are prefixed with "LibLZMA_"
16+
17+
set(liblzma_HEADER "lzma.h")
18+
set(liblzma_LIBNAME "lzma")
19+
set(liblzma_PKGCONFIG_NAME "liblzma")
20+
21+
if(DEFINED CLP_CORE_DEPS_DIR)
22+
set(ENV{liblzma_ORIG_PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}")
23+
set(ENV{PKG_CONFIG_PATH} "${CLP_CORE_DEPS_DIR}:$ENV{PKG_CONFIG_PATH}")
24+
endif()
25+
26+
# Run pkg-config
27+
find_package(PkgConfig)
28+
pkg_check_modules(liblzma_PKGCONF QUIET "${liblzma_PKGCONFIG_NAME}")
29+
30+
# Set include directory
31+
find_path(LibLZMA_INCLUDE_DIR ${liblzma_HEADER}
32+
HINTS ${liblzma_PKGCONF_INCLUDEDIR}
33+
PATH_SUFFIXES include
34+
)
35+
36+
# Handle static libraries
37+
if(LibLZMA_USE_STATIC_LIBS)
38+
set(liblzma_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
39+
set(CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_STATIC_LIBRARY_SUFFIX}")
40+
endif()
41+
42+
# Find library
43+
find_library(LibLZMA_LIBRARY
44+
NAMES "${liblzma_LIBNAME}"
45+
HINTS ${liblzma_PKGCONF_LIBDIR}
46+
PATH_SUFFIXES lib
47+
)
48+
49+
if(LibLZMA_USE_STATIC_LIBS)
50+
# Restore original value of CMAKE_FIND_LIBRARY_SUFFIXES
51+
set(CMAKE_FIND_LIBRARY_SUFFIXES ${liblzma_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
52+
unset(liblzma_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
53+
endif()
54+
55+
# Set version
56+
set(LibLZMA_VERSION ${liblzma_PKGCONF_VERSION})
57+
58+
include(FindPackageHandleStandardArgs)
59+
find_package_handle_standard_args(LibLZMA
60+
REQUIRED_VARS LibLZMA_LIBRARY LibLZMA_INCLUDE_DIR
61+
VERSION_VAR LibLZMA_VERSION
62+
)
63+
64+
if(NOT TARGET LibLZMA::LibLZMA)
65+
# Add library to build
66+
if (LibLZMA_USE_STATIC_LIBS)
67+
add_library(LibLZMA::LibLZMA STATIC IMPORTED)
68+
else()
69+
# NOTE: We use UNKNOWN so that if the user doesn't have the SHARED
70+
# libraries installed, we can still use the STATIC libraries
71+
add_library(LibLZMA::LibLZMA UNKNOWN IMPORTED)
72+
endif()
73+
74+
# Set include directories for library
75+
if(LibLZMA_INCLUDE_DIR)
76+
set_target_properties(LibLZMA::LibLZMA
77+
PROPERTIES
78+
INTERFACE_INCLUDE_DIRECTORIES "${LibLZMA_INCLUDE_DIR}"
79+
)
80+
endif()
81+
82+
# Set location of library
83+
if(EXISTS "${LibLZMA_LIBRARY}")
84+
set_target_properties(LibLZMA::LibLZMA
85+
PROPERTIES
86+
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
87+
IMPORTED_LOCATION "${LibLZMA_LIBRARY}"
88+
)
89+
endif()
90+
endif()
91+
92+
# Restore original value of PKG_CONFIG_PATH
93+
if(DEFINED CLP_CORE_DEPS_DIR)
94+
set(ENV{PKG_CONFIG_PATH} "$ENV{liblzma_ORIG_PKG_CONFIG_PATH}")
95+
unset(ENV{liblzma_ORIG_PKG_CONFIG_PATH})
96+
endif()

components/core/cmake/Options/options.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@ function(set_clp_tests_dependencies)
171171
CLP_NEED_DATE
172172
CLP_NEED_FMT
173173
CLP_NEED_LIBARCHIVE
174+
CLP_NEED_LIBLZMA
174175
CLP_NEED_LOG_SURGEON
175-
CLP_NEED_LZMA
176176
CLP_NEED_MARIADB
177177
CLP_NEED_MONGOCXX
178178
CLP_NEED_NLOHMANN_JSON
@@ -455,9 +455,9 @@ function (convert_clp_dependency_properties_to_variables)
455455
CLP_NEED_CURL
456456
CLP_NEED_DATE
457457
CLP_NEED_FMT
458-
CLP_NEED_LOG_SURGEON
459458
CLP_NEED_LIBARCHIVE
460-
CLP_NEED_LZMA
459+
CLP_NEED_LIBLZMA
460+
CLP_NEED_LOG_SURGEON
461461
CLP_NEED_MARIADB
462462
CLP_NEED_MONGOCXX
463463
CLP_NEED_MSGPACKCXX

taskfiles/deps/main.yaml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ tasks:
6666
- task: "catch2"
6767
- task: "date"
6868
- task: "fmt"
69+
- task: "liblzma"
6970
- task: "log-surgeon"
7071
- task: "lz4"
7172
- task: "microsoft.gsl"
@@ -221,6 +222,54 @@ tasks:
221222
TARBALL_SHA256: "1250e4cc58bf06ee631567523f48848dc4596133e163f02615c97f78bab6c811"
222223
TARBALL_URL: "https://github.com/fmtlib/fmt/archive/refs/tags/10.2.1.tar.gz"
223224

225+
liblzma:
226+
internal: true
227+
vars:
228+
COMMON_CMAKE_GEN_ARGS:
229+
- "-DBUILD_TESTING=OFF"
230+
- "-DCMAKE_BUILD_TYPE=Release"
231+
- "-DCMAKE_INSTALL_MESSAGE=LAZY"
232+
- "-DXZ_DOC=OFF"
233+
- "-DXZ_TOOL_LZMADEC=OFF"
234+
- "-DXZ_TOOL_LZMAINFO=OFF"
235+
- "-DXZ_TOOL_SCRIPTS=OFF"
236+
- "-DXZ_TOOL_SYMLINKS_LZMA=OFF"
237+
- "-DXZ_TOOL_XZ=OFF"
238+
- "-DXZ_TOOL_XZDEC=OFF"
239+
TARBALL_SHA256: "507825b599356c10dca1cd720c9d0d0c9d5400b9de300af00e4d1ea150795543"
240+
TARBALL_URL: "https://github.com/tukaani-project/xz/releases/download/v5.8.1/xz-5.8.1.tar.gz"
241+
run: "once"
242+
deps:
243+
- task: "liblzma-install"
244+
vars:
245+
BUILD_SHARED_LIBS: true
246+
COMMON_CMAKE_GEN_ARGS:
247+
ref: ".COMMON_CMAKE_GEN_ARGS"
248+
TARBALL_SHA256: "{{.TARBALL_SHA256}}"
249+
TARBALL_URL: "{{.TARBALL_URL}}"
250+
- task: "liblzma-install"
251+
vars:
252+
BUILD_SHARED_LIBS: false
253+
COMMON_CMAKE_GEN_ARGS:
254+
ref: ".COMMON_CMAKE_GEN_ARGS"
255+
TARBALL_SHA256: "{{.TARBALL_SHA256}}"
256+
TARBALL_URL: "{{.TARBALL_URL}}"
257+
258+
liblzma-install:
259+
internal: true
260+
requires:
261+
vars: ["BUILD_SHARED_LIBS", "COMMON_CMAKE_GEN_ARGS", "TARBALL_SHA256", "TARBALL_URL"]
262+
cmds:
263+
- task: "utils:install-remote-cmake-lib"
264+
vars:
265+
CMAKE_GEN_ARGS:
266+
- "-DBUILD_SHARED_LIBS={{ if .BUILD_SHARED_LIBS }}ON{{ else }}OFF{{ end }}"
267+
- >-
268+
{{ join " " .COMMON_CMAKE_GEN_ARGS }}
269+
LIB_NAME: "LibLZMA-{{ if .BUILD_SHARED_LIBS }}shared{{ else }}static{{ end }}"
270+
TARBALL_SHA256: "{{.TARBALL_SHA256}}"
271+
TARBALL_URL: "{{.TARBALL_URL}}"
272+
224273
log-surgeon:
225274
internal: true
226275
run: "once"

0 commit comments

Comments
 (0)