cmake/modules/BuildSPDK.cmake: link whole-archive

We build spdk as static library, linking against them requires the
use of `-Wl,--whole-archive` as argument, otherwise we will have error
`nvme.c: nvme_probe_internal: *ERROR*: NVMe trtype 256 not available`.
This is due to the use of constructor functions in spdk to register
NVMe transports. So we need to do so to ensure we call all the
constructors.

Signed-off-by: Tongliang Deng <dengtongliang@sensetime.com>
This commit is contained in:
Tongliang Deng 2022-01-13 17:01:52 +08:00
parent ac28356234
commit e82b0a7b09
2 changed files with 10 additions and 7 deletions

View File

@ -68,12 +68,14 @@ macro(build_spdk)
add_dependencies(${spdk_lib} spdk-ext)
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")
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()

View File

@ -35,7 +35,8 @@ if(HAVE_LIBAIO)
endif(HAVE_LIBAIO)
if(WITH_SPDK)
target_link_libraries(blk PRIVATE ${SPDK_LIBRARIES})
target_link_libraries(blk
PRIVATE spdk::spdk)
endif()
if(WITH_ZBD)