summaryrefslogtreecommitdiffstats
path: root/cmake/modules/BuildSPDK.cmake
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cmake/modules/BuildSPDK.cmake40
1 files changed, 40 insertions, 0 deletions
diff --git a/cmake/modules/BuildSPDK.cmake b/cmake/modules/BuildSPDK.cmake
new file mode 100644
index 00000000..46242dc9
--- /dev/null
+++ b/cmake/modules/BuildSPDK.cmake
@@ -0,0 +1,40 @@
+macro(build_spdk)
+ set(DPDK_DIR ${CMAKE_BINARY_DIR}/src/dpdk)
+ if(NOT TARGET dpdk-ext)
+ include(BuildDPDK)
+ build_dpdk(${DPDK_DIR})
+ endif()
+ find_package(CUnit REQUIRED)
+ if(LINUX)
+ find_package(aio REQUIRED)
+ find_package(uuid REQUIRED)
+ endif()
+ include(ExternalProject)
+ ExternalProject_Add(spdk-ext
+ DEPENDS dpdk-ext
+ SOURCE_DIR ${CMAKE_SOURCE_DIR}/src/spdk
+ CONFIGURE_COMMAND ./configure --with-dpdk=${DPDK_DIR}
+ # unset $CFLAGS, otherwise it will interfere with how SPDK sets
+ # its include directory.
+ # unset $LDFLAGS, otherwise SPDK will fail to mock some functions.
+ BUILD_COMMAND env -i PATH=$ENV{PATH} CC=${CMAKE_C_COMPILER} $(MAKE) EXTRA_CFLAGS="-fPIC"
+ BUILD_IN_SOURCE 1
+ INSTALL_COMMAND "true")
+ ExternalProject_Get_Property(spdk-ext source_dir)
+ foreach(c nvme log lvol env_dpdk util)
+ add_library(spdk::${c} STATIC IMPORTED)
+ add_dependencies(spdk::${c} spdk-ext)
+ set_target_properties(spdk::${c} PROPERTIES
+ IMPORTED_LOCATION "${source_dir}/build/lib/${CMAKE_STATIC_LIBRARY_PREFIX}spdk_${c}${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ INTERFACE_INCLUDE_DIRECTORIES "${source_dir}/include")
+ list(APPEND SPDK_LIBRARIES spdk::${c})
+ endforeach()
+ set_target_properties(spdk::env_dpdk PROPERTIES
+ INTERFACE_LINK_LIBRARIES "dpdk::dpdk;rt")
+ set_target_properties(spdk::lvol PROPERTIES
+ INTERFACE_LINK_LIBRARIES spdk::util)
+ set_target_properties(spdk::util PROPERTIES
+ INTERFACE_LINK_LIBRARIES ${UUID_LIBRARIES})
+ set(SPDK_INCLUDE_DIR "${source_dir}/include")
+ unset(source_dir)
+endmacro()