diff options
Diffstat (limited to '')
-rw-r--r-- | cmake/modules/BuildSPDK.cmake | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/cmake/modules/BuildSPDK.cmake b/cmake/modules/BuildSPDK.cmake new file mode 100644 index 000000000..d6ce97e1d --- /dev/null +++ b/cmake/modules/BuildSPDK.cmake @@ -0,0 +1,81 @@ +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(FindMake) + find_make("MAKE_EXECUTABLE" "make_cmd") + + set(spdk_CFLAGS "-fPIC") + include(CheckCCompilerFlag) + check_c_compiler_flag("-Wno-address-of-packed-member" HAVE_WARNING_ADDRESS_OF_PACKED_MEMBER) + if(HAVE_WARNING_ADDRESS_OF_PACKED_MEMBER) + string(APPEND spdk_CFLAGS " -Wno-address-of-packed-member") + endif() + check_c_compiler_flag("-Wno-unused-but-set-variable" + HAVE_UNUSED_BUT_SET_VARIABLE) + if(HAVE_UNUSED_BUT_SET_VARIABLE) + string(APPEND spdk_CFLAGS " -Wno-unused-but-set-variable") + endif() + + include(ExternalProject) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64") + # a safer option than relying on the build host's arch + set(target_arch core2) + else() + # default arch used by SPDK + set(target_arch native) + endif() + + set(source_dir "${CMAKE_SOURCE_DIR}/src/spdk") + foreach(c lvol env_dpdk sock nvmf bdev nvme conf thread trace notify accel event_accel blob vmd event_vmd event_bdev sock_posix event_sock event rpc jsonrpc json util log) + add_library(spdk::${c} STATIC IMPORTED) + set(lib_path "${source_dir}/build/lib/${CMAKE_STATIC_LIBRARY_PREFIX}spdk_${c}${CMAKE_STATIC_LIBRARY_SUFFIX}") + set_target_properties(spdk::${c} PROPERTIES + IMPORTED_LOCATION "${lib_path}" + INTERFACE_INCLUDE_DIRECTORIES "${source_dir}/include") + list(APPEND spdk_libs "${lib_path}") + list(APPEND SPDK_LIBRARIES spdk::${c}) + endforeach() + + ExternalProject_Add(spdk-ext + DEPENDS dpdk-ext + SOURCE_DIR ${source_dir} + CONFIGURE_COMMAND ./configure + --with-dpdk=${DPDK_DIR} + --without-isal + --without-vhost + --target-arch=${target_arch} + # 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_cmd} EXTRA_CFLAGS=${spdk_CFLAGS} + BUILD_IN_SOURCE 1 + BUILD_BYPRODUCTS ${spdk_libs} + INSTALL_COMMAND "" + LOG_CONFIGURE ON + LOG_BUILD ON + LOG_MERGED_STDOUTERR ON + LOG_OUTPUT_ON_FAILURE ON) + unset(make_cmd) + foreach(spdk_lib ${SPDK_LIBRARIES}) + add_dependencies(${spdk_lib} spdk-ext) + endforeach() + + set(SPDK_INCLUDE_DIR "${source_dir}/include") + add_library(spdk::spdk INTERFACE IMPORTED) + add_dependencies(spdk::spdk + ${SPDK_LIBRARIES}) + # workaround for https://review.spdk.io/gerrit/c/spdk/spdk/+/6798 + set_target_properties(spdk::spdk PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES ${SPDK_INCLUDE_DIR} + INTERFACE_LINK_LIBRARIES + "-Wl,--whole-archive $<JOIN:${spdk_libs}, > -Wl,--no-whole-archive;dpdk::dpdk;rt;${UUID_LIBRARIES}") + unset(source_dir) +endmacro() |