]> git.proxmox.com Git - ceph.git/blob - ceph/cmake/modules/BuildSPDK.cmake
import 15.2.9
[ceph.git] / ceph / cmake / modules / BuildSPDK.cmake
1 macro(build_spdk)
2 set(DPDK_DIR ${CMAKE_BINARY_DIR}/src/dpdk)
3 if(NOT TARGET dpdk-ext)
4 include(BuildDPDK)
5 build_dpdk(${DPDK_DIR})
6 endif()
7 find_package(CUnit REQUIRED)
8 if(LINUX)
9 find_package(aio REQUIRED)
10 find_package(uuid REQUIRED)
11 endif()
12
13 find_program(MAKE_EXECUTABLE NAMES gmake make)
14 if(NOT MAKE_EXECUTABLE)
15 message(FATAL_ERROR "Can't find make")
16 endif()
17 if(CMAKE_MAKE_PROGRAM MATCHES "make")
18 # try to inherit command line arguments passed by parent "make" job
19 set(make_cmd "$(MAKE)")
20 else()
21 set(make_cmd "${MAKE_EXECUTABLE}")
22 endif()
23
24 set(spdk_CFLAGS "-fPIC")
25 include(CheckCCompilerFlag)
26 check_c_compiler_flag("-Wno-address-of-packed-member" HAS_WARNING_ADDRESS_OF_PACKED_MEMBER)
27 if(HAS_WARNING_ADDRESS_OF_PACKED_MEMBER)
28 set(spdk_CFLAGS "${spdk_CFLAGS} -Wno-address-of-packed-member")
29 endif()
30 include(ExternalProject)
31 ExternalProject_Add(spdk-ext
32 DEPENDS dpdk-ext
33 SOURCE_DIR ${CMAKE_SOURCE_DIR}/src/spdk
34 CONFIGURE_COMMAND ./configure --with-dpdk=${DPDK_DIR} --without-isal --without-vhost
35 # unset $CFLAGS, otherwise it will interfere with how SPDK sets
36 # its include directory.
37 # unset $LDFLAGS, otherwise SPDK will fail to mock some functions.
38 BUILD_COMMAND env -i PATH=$ENV{PATH} CC=${CMAKE_C_COMPILER} ${make_cmd} EXTRA_CFLAGS="${spdk_CFLAGS}"
39 BUILD_IN_SOURCE 1
40 INSTALL_COMMAND "true")
41 unset(make_cmd)
42 ExternalProject_Get_Property(spdk-ext source_dir)
43 foreach(c nvme log lvol env_dpdk sock util)
44 add_library(spdk::${c} STATIC IMPORTED)
45 add_dependencies(spdk::${c} spdk-ext)
46 set_target_properties(spdk::${c} PROPERTIES
47 IMPORTED_LOCATION "${source_dir}/build/lib/${CMAKE_STATIC_LIBRARY_PREFIX}spdk_${c}${CMAKE_STATIC_LIBRARY_SUFFIX}"
48 INTERFACE_INCLUDE_DIRECTORIES "${source_dir}/include")
49 list(APPEND SPDK_LIBRARIES spdk::${c})
50 endforeach()
51 set_target_properties(spdk::env_dpdk PROPERTIES
52 INTERFACE_LINK_LIBRARIES "dpdk::dpdk;rt")
53 set_target_properties(spdk::lvol PROPERTIES
54 INTERFACE_LINK_LIBRARIES spdk::util)
55 set_target_properties(spdk::util PROPERTIES
56 INTERFACE_LINK_LIBRARIES ${UUID_LIBRARIES})
57 set(SPDK_INCLUDE_DIR "${source_dir}/include")
58 unset(source_dir)
59 endmacro()