Skip to content

Commit 16acfe0

Browse files
authored
Merge pull request ceph#54624 from cbodley/wip-cmake-qat
cmake: add ExternalProjects to enable QAT by default Reviewed-by: Kefu Chai <[email protected]>
2 parents e160811 + 84af835 commit 16acfe0

27 files changed

+459
-206
lines changed

.gitmodules

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,9 @@
7575
[submodule "src/jaegertracing/opentelemetry-cpp"]
7676
path = src/jaegertracing/opentelemetry-cpp
7777
url = https://github.com/open-telemetry/opentelemetry-cpp.git
78+
[submodule "src/qatlib"]
79+
path = src/qatlib
80+
url = https://github.com/intel/qatlib.git
81+
[submodule "src/qatzip"]
82+
path = src/qatzip
83+
url = https://github.com/intel/qatzip.git

CMakeLists.txt

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -307,16 +307,45 @@ endif()
307307

308308
option(WITH_BLUEFS "libbluefs library" OFF)
309309

310-
option(WITH_QAT "Enable Qat driver" OFF)
311-
if(WITH_QAT)
310+
CMAKE_DEPENDENT_OPTION(WITH_QATLIB "Enable QAT with qatlib" ON
311+
"NOT CMAKE_SYSTEM_PROCESSOR MATCHES aarch64" OFF)
312+
option(WITH_SYSTEM_QATLIB "Use system packages for qatlib" OFF)
313+
option(WITH_QATDRV "Enable QAT with out-of-tree driver" OFF)
314+
CMAKE_DEPENDENT_OPTION(WITH_QATZIP "Enable QATzip" ON
315+
"NOT CMAKE_SYSTEM_PROCESSOR MATCHES aarch64" OFF)
316+
option(WITH_SYSTEM_QATZIP "Use system packages for QATzip" OFF)
317+
318+
if(WITH_QATDRV)
312319
find_package(QatDrv REQUIRED COMPONENTS qat_s usdm_drv_s)
313-
set(HAVE_QATDRV $(QatDrv_FOUND))
320+
set(HAVE_QAT TRUE)
321+
elseif(WITH_QATLIB)
322+
if(NOT WITH_SYSTEM_QAT)
323+
include(BuildQAT)
324+
build_qat()
325+
endif()
326+
find_package(QAT REQUIRED)
327+
if(NOT WITH_SYSTEM_QAT)
328+
add_dependencies(QAT::qat qatlib_ext)
329+
add_dependencies(QAT::usdm qatlib_ext)
330+
endif()
331+
set(HAVE_QAT TRUE)
314332
endif()
315333

316-
option(WITH_QATZIP "Enable QATZIP" OFF)
317334
if(WITH_QATZIP)
318-
find_package(qatzip REQUIRED)
319-
set(HAVE_QATZIP ${qatzip_FOUND})
335+
if(NOT HAVE_QAT)
336+
message(FATAL_ERROR "WITH_QATZIP requires WITH_QATLIB or WITH_QATDRV")
337+
endif()
338+
if(NOT WITH_SYSTEM_QATZIP)
339+
include(BuildQATzip)
340+
build_qatzip()
341+
# qatzip build depends on qatlib
342+
add_dependencies(qatzip_ext QAT::qat)
343+
endif()
344+
find_package(QATzip REQUIRED)
345+
if(NOT WITH_SYSTEM_QATZIP)
346+
add_dependencies(QAT::zip qatzip_ext)
347+
endif()
348+
set(HAVE_QATZIP TRUE)
320349
endif(WITH_QATZIP)
321350

322351
# needs mds and? XXX

ceph.spec.in

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@
111111
# this is tracked in https://bugzilla.redhat.com/2152265
112112
%bcond_with system_arrow
113113
%endif
114+
%if 0%{?fedora} || 0%{?rhel} >= 9
115+
%bcond_without system_qat
116+
%else
117+
%bcond_with system_qat
118+
%endif
114119
%if 0%{?fedora} || 0%{?suse_version} || 0%{?rhel} >= 8 || 0%{?openEuler}
115120
%global weak_deps 1
116121
%endif
@@ -332,6 +337,10 @@ BuildRequires: libarrow-devel
332337
BuildRequires: parquet-libs-devel
333338
BuildRequires: utf8proc-devel
334339
%endif
340+
%if 0%{with system_qat}
341+
BuildRequires: qatlib-devel
342+
BuildRequires: qatzip-devel
343+
%endif
335344
%if 0%{with seastar}
336345
BuildRequires: c-ares-devel
337346
BuildRequires: gnutls-devel
@@ -1447,6 +1456,10 @@ cmake .. \
14471456
-DWITH_SYSTEM_ARROW:BOOL=ON \
14481457
-DWITH_SYSTEM_UTF8PROC:BOOL=ON \
14491458
%endif
1459+
%if 0%{with system_qat}
1460+
-DWITH_SYSTEM_QATLIB:BOOL=ON \
1461+
-DWITH_SYSTEM_QATZIP:BOOL=ON \
1462+
%endif
14501463
%if 0%{with seastar}
14511464
-DWITH_SEASTAR:BOOL=ON \
14521465
-DWITH_JAEGER:BOOL=OFF \

cmake/modules/BuildQAT.cmake

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
function(build_qat)
2+
set(QAT_BINARY_DIR ${CMAKE_BINARY_DIR}/src/qatlib)
3+
set(QAT_INSTALL_DIR ${QAT_BINARY_DIR}/install)
4+
set(QAT_INCLUDE_DIR ${QAT_INSTALL_DIR}/include)
5+
set(QAT_LIBRARY_DIR ${QAT_INSTALL_DIR}/lib)
6+
set(QAT_LIBRARY ${QAT_LIBRARY_DIR}/libqat.a)
7+
set(QAT_USDM_LIBRARY ${QAT_LIBRARY_DIR}/libusdm.a)
8+
9+
# this include directory won't exist until the install step, but the
10+
# imported targets need it early for INTERFACE_INCLUDE_DIRECTORIES
11+
file(MAKE_DIRECTORY "${QAT_INCLUDE_DIR}")
12+
13+
set(configure_cmd env CC=${CMAKE_C_COMPILER} ./configure --prefix=${QAT_INSTALL_DIR})
14+
# disable systemd or 'make install' tries to write /usr/lib/systemd/system/qat.service
15+
list(APPEND configure_cmd --disable-systemd)
16+
# build a static library with -fPIC that we can link into crypto/compressor plugins
17+
list(APPEND configure_cmd --with-pic --enable-static --disable-shared)
18+
19+
# clear the DESTDIR environment variable from debian/rules,
20+
# because it messes with the internal install paths of arrow's bundled deps
21+
set(NO_DESTDIR_COMMAND ${CMAKE_COMMAND} -E env --unset=DESTDIR)
22+
23+
include(ExternalProject)
24+
ExternalProject_Add(qatlib_ext
25+
SOURCE_DIR "${PROJECT_SOURCE_DIR}/src/qatlib"
26+
CONFIGURE_COMMAND ./autogen.sh COMMAND ${configure_cmd}
27+
BUILD_COMMAND ${NO_DESTDIR_COMMAND} make -j3
28+
BUILD_IN_SOURCE 1
29+
BUILD_BYPRODUCTS ${QAT_LIBRARY} ${QAT_USDM_LIBRARY}
30+
INSTALL_COMMAND ${NO_DESTDIR_COMMAND} make install
31+
UPDATE_COMMAND ""
32+
LOG_CONFIGURE ON
33+
LOG_BUILD ON
34+
LOG_INSTALL ON
35+
LOG_MERGED_STDOUTERR ON
36+
LOG_OUTPUT_ON_FAILURE ON)
37+
38+
# export vars for find_package(QAT)
39+
set(QAT_LIBRARY ${QAT_LIBRARY} PARENT_SCOPE)
40+
set(QAT_USDM_LIBRARY ${QAT_USDM_LIBRARY} PARENT_SCOPE)
41+
set(QAT_INCLUDE_DIR ${QAT_INCLUDE_DIR} PARENT_SCOPE)
42+
# library dir for BuildQATzip.cmake
43+
set(QAT_LIBRARY_DIR ${QAT_LIBRARY_DIR} PARENT_SCOPE)
44+
endfunction()

cmake/modules/BuildQATzip.cmake

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
function(build_qatzip)
2+
set(QATzip_BINARY_DIR ${CMAKE_BINARY_DIR}/src/qatzip)
3+
set(QATzip_INSTALL_DIR ${QATzip_BINARY_DIR}/install)
4+
set(QATzip_INCLUDE_DIR ${QATzip_INSTALL_DIR}/include)
5+
set(QATzip_LIBRARY ${QATzip_INSTALL_DIR}/lib/libqatzip.a)
6+
7+
# this include directory won't exist until the install step, but the
8+
# imported targets need it early for INTERFACE_INCLUDE_DIRECTORIES
9+
file(MAKE_DIRECTORY "${QATzip_INCLUDE_DIR}")
10+
11+
set(configure_cmd env CC=${CMAKE_C_COMPILER} ./configure --prefix=${QATzip_INSTALL_DIR})
12+
# build a static library with -fPIC that we can link into crypto/compressor plugins
13+
list(APPEND configure_cmd --with-pic --enable-static --disable-shared)
14+
if(QATDRV_INCLUDE_DIR)
15+
list(APPEND configure_cmd --with-ICP_ROOT=${QATDRV_INCLUDE_DIR})
16+
endif()
17+
if(QAT_INCLUDE_DIR)
18+
list(APPEND configure_cmd CFLAGS=-I${QAT_INCLUDE_DIR})
19+
endif()
20+
if(QAT_LIBRARY_DIR)
21+
list(APPEND configure_cmd LDFLAGS=-L${QAT_LIBRARY_DIR})
22+
endif()
23+
24+
# clear the DESTDIR environment variable from debian/rules,
25+
# because it messes with the internal install paths of arrow's bundled deps
26+
set(NO_DESTDIR_COMMAND ${CMAKE_COMMAND} -E env --unset=DESTDIR)
27+
28+
include(ExternalProject)
29+
ExternalProject_Add(qatzip_ext
30+
SOURCE_DIR "${PROJECT_SOURCE_DIR}/src/qatzip"
31+
CONFIGURE_COMMAND ./autogen.sh COMMAND ${configure_cmd}
32+
BUILD_COMMAND ${NO_DESTDIR_COMMAND} make -j3
33+
BUILD_IN_SOURCE 1
34+
BUILD_BYPRODUCTS ${QATzip_LIBRARY}
35+
INSTALL_COMMAND ${NO_DESTDIR_COMMAND} make install
36+
UPDATE_COMMAND ""
37+
LOG_CONFIGURE ON
38+
LOG_BUILD ON
39+
LOG_INSTALL ON
40+
LOG_MERGED_STDOUTERR ON
41+
LOG_OUTPUT_ON_FAILURE ON)
42+
43+
# export vars for find_package(QATzip)
44+
set(QATzip_LIBRARIES ${QATzip_LIBRARY} PARENT_SCOPE)
45+
set(QATzip_INCLUDE_DIR ${QATzip_INCLUDE_DIR} PARENT_SCOPE)
46+
set(QATzip_INTERFACE_LINK_LIBRARIES QAT::qat QAT::usdm LZ4::LZ4 PARENT_SCOPE)
47+
endfunction()

cmake/modules/FindQAT.cmake

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
find_package(PkgConfig)
2+
pkg_search_module(PC_QAT libqat qatlib QUIET)
3+
4+
find_path(QAT_INCLUDE_DIR
5+
NAMES qat/cpa.h
6+
HINTS ${PC_QAT_INCLUDE_DIRS})
7+
8+
find_library(QAT_LIBRARY
9+
NAMES qat
10+
HINTS ${PC_QAT_LIBRARY_DIRS})
11+
12+
find_library(QAT_USDM_LIBRARY
13+
NAMES usdm
14+
HINTS ${PC_QAT_LIBRARY_DIRS})
15+
16+
set(QAT_VERSION ${PC_QAT_VERSION})
17+
set(QAT_LIBRARIES ${QAT_LIBRARY} ${QAT_USDM_LIBRARY})
18+
19+
include(FindPackageHandleStandardArgs)
20+
find_package_handle_standard_args(QAT
21+
REQUIRED_VARS QAT_LIBRARY QAT_USDM_LIBRARY QAT_INCLUDE_DIR
22+
VERSION_VAR QAT_VERSION)
23+
24+
mark_as_advanced(QAT_LIBRARY QAT_USDM_LIBRARY QAT_LIBRARIES QAT_INCLUDE_DIR QAT_VERSION)
25+
26+
if(QAT_FOUND AND NOT (TARGET QAT::qat))
27+
add_library(QAT::qat UNKNOWN IMPORTED)
28+
set_target_properties(QAT::qat PROPERTIES
29+
INTERFACE_INCLUDE_DIRECTORIES "${QAT_INCLUDE_DIR}"
30+
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
31+
IMPORTED_LOCATION "${QAT_LIBRARY}")
32+
endif()
33+
34+
if(QAT_FOUND AND NOT (TARGET QAT::usdm))
35+
add_library(QAT::usdm UNKNOWN IMPORTED)
36+
set_target_properties(QAT::usdm PROPERTIES
37+
INTERFACE_INCLUDE_DIRECTORIES "${QAT_INCLUDE_DIR}"
38+
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
39+
IMPORTED_LOCATION "${QAT_USDM_LIBRARY}")
40+
endif()

cmake/modules/FindQATzip.cmake

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# - Find QATzip
2+
# Find the QATzip compression library and includes
3+
#
4+
# QATzip_INCLUDE_DIR - where to find QATzip.h, etc.
5+
# QATzip_LIBRARIES - List of libraries when using QATzip.
6+
# QATzip_FOUND - True if QATzip found.
7+
8+
find_package(PkgConfig QUIET)
9+
pkg_search_module(PC_QATzip qatzip QUIET)
10+
11+
find_path(QATzip_INCLUDE_DIR
12+
NAMES qatzip.h
13+
HINTS ${PC_QATzip_INCLUDE_DIRS})
14+
15+
find_library(QATzip_LIBRARIES
16+
NAMES qatzip
17+
HINTS ${PC_QATzip_LIBRARY_DIRS})
18+
19+
include(FindPackageHandleStandardArgs)
20+
find_package_handle_standard_args(QATzip DEFAULT_MSG QATzip_LIBRARIES QATzip_INCLUDE_DIR)
21+
22+
mark_as_advanced(
23+
QATzip_LIBRARIES
24+
QATzip_INCLUDE_DIR)
25+
26+
if(QATzip_FOUND AND NOT TARGET QAT::zip)
27+
add_library(QAT::zip SHARED IMPORTED)
28+
set_target_properties(QAT::zip PROPERTIES
29+
INTERFACE_INCLUDE_DIRECTORIES "${QATzip_INCLUDE_DIR}"
30+
INTERFACE_LINK_LIBRARIES "${QATzip_INTERFACE_LINK_LIBRARIES}"
31+
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
32+
IMPORTED_LOCATION "${QATzip_LIBRARIES}")
33+
endif()

cmake/modules/FindQatDrv.cmake

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,15 @@ foreach(component ${QatDrv_FIND_COMPONENTS})
7474
add_library(QatDrv::${component} STATIC IMPORTED GLOBAL)
7575
set_target_properties(QatDrv::${component} PROPERTIES
7676
INTERFACE_INCLUDE_DIRECTORIES "${QatDrv_INCLUDE_DIRS}"
77+
INTERFACE_COMPILE_OPTIONS "-DHAVE_QATDRV"
7778
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
7879
IMPORTED_LOCATION "${QatDrv_${component}_LIBRARIES}")
7980
endif()
81+
82+
# add alias targets to match FindQAT.cmake
83+
if(component STREQUAL "qat_s")
84+
add_library(QAT::qat ALIAS QatDrv::qat_s)
85+
elseif(component STREQUAL "usdm_drv_s")
86+
add_library(QAT::usdm ALIAS QatDrv::usdm_drv_s)
87+
endif()
8088
endforeach()

cmake/modules/Findqatzip.cmake

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/CMakeLists.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -505,10 +505,6 @@ if(NOT WITH_SYSTEM_BOOST)
505505
list(APPEND ceph_common_deps ${ZLIB_LIBRARIES})
506506
endif()
507507

508-
if(HAVE_QATZIP)
509-
list(APPEND ceph_common_deps ${qatzip_LIBRARIES})
510-
endif()
511-
512508
if(WITH_DPDK)
513509
list(APPEND ceph_common_deps common_async_dpdk)
514510
endif()

0 commit comments

Comments
 (0)