agent-enviroments/builder/libs/seastar/cmake/Finddpdk.cmake
2024-09-10 17:06:08 +03:00

182 lines
5.3 KiB
CMake

#
# This file is open source software, licensed to you under the terms
# of the Apache License, Version 2.0 (the "License"). See the NOTICE file
# distributed with this work for additional information regarding copyright
# ownership. You may not use this file except in compliance with the License.
#
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
#
# Copyright (C) 2018 Scylladb, Ltd.
#
find_package (PkgConfig REQUIRED)
pkg_check_modules (dpdk_PC libdpdk)
# we cannot use ${dpdk_PC_STATIC_LDFLAGS} directly, because we want to
# export DPDK as a bundle of static libraries, so need to find the
# individual paths to all .a files
find_path (dpdk_INCLUDE_DIR
NAMES rte_atomic.h
HINTS
${dpdk_PC_INCLUDE_DIRS}
PATH_SUFFIXES
dpdk)
if (dpdk_INCLUDE_DIR AND EXISTS "${dpdk_INCLUDE_DIR}/rte_build_config.h")
file (STRINGS "${dpdk_INCLUDE_DIR}/rte_build_config.h" rte_mbuf_refcnt_atomic
REGEX "^#define[ \t ]+RTE_MBUF_REFCNT_ATOMIC")
if (rte_mbuf_refcnt_atomic)
message (WARNING
"DPDK is configured with RTE_MBUF_REFCNT_ATOMIC enabled, "
"please disable this option and recompile DPDK for better performance.")
endif ()
endif ()
set(rte_libs
bus_pci
bus_vdev
cfgfile
cmdline
cryptodev
eal
ethdev
hash
kvargs
mbuf
mempool
mempool_ring
net
net_bnxt
net_cxgbe
net_e1000
net_ena
net_enic
net_i40e
net_ixgbe
net_nfp
net_qede
net_ring
net_sfc
net_vmxnet3
pci
rcu
ring
security
telemetry
timer)
# sfc_efx driver can only build on x86 and aarch64
if (CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|aarch64")
list (APPEND rte_libs
common_sfc_efx)
endif ()
list (APPEND dpdk_REQUIRED
dpdk_INCLUDE_DIR)
# we prefer static library over the shared library, so just find the
# static libraries first.
set (_cmake_find_library_suffixes_saved ${CMAKE_FIND_LIBRARY_SUFFIXES})
set (CMAKE_FIND_LIBRARY_SUFFIXES
${CMAKE_STATIC_LIBRARY_SUFFIX}
${CMAKE_SHARED_LIBRARY_SUFFIX})
foreach (lib ${rte_libs})
string(TOUPPER ${lib} upper_lib)
set(library_name "dpdk_${upper_lib}_LIBRARY")
find_library (${library_name}
NAME rte_${lib}
HINTS
${dpdk_PC_STATIC_LIBRARY_DIRS})
list (APPEND dpdk_REQUIRED
${library_name})
list (APPEND dpdk_LIBRARIES
${library_name})
if (NOT ${library_name})
continue()
endif ()
set (library_path ${${library_name}})
list (APPEND _dpdk_linker_files ${library_path})
set (dpdk_lib dpdk::${lib})
list (APPEND _dpdk_libraries ${dpdk_lib})
if (dpdk_INCLUDE_DIR AND NOT (TARGET ${dpdk_lib}))
add_library (${dpdk_lib} UNKNOWN IMPORTED)
set_target_properties (${dpdk_lib}
PROPERTIES
IMPORTED_LOCATION ${library_path}
INTERFACE_INCLUDE_DIRECTORIES ${dpdk_INCLUDE_DIR})
endif ()
endforeach ()
# restore the previous saved suffixes
set (CMAKE_FIND_LIBRARY_SUFFIXES ${_cmake_find_library_suffixes_saved})
include (FindPackageHandleStandardArgs)
find_package_handle_standard_args (dpdk
REQUIRED_VARS
${dpdk_REQUIRED})
if (dpdk_FOUND AND NOT (TARGET dpdk))
get_filename_component (library_suffix "${dpdk_EAL_LIBRARY}" LAST_EXT)
# strictly speaking, we should have being using check_c_compiler_flag()
# here, but we claim Seastar as a project written in CXX language, and
# C is not enabled, so CXX is used here instead.
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("-Wno-volatile" _warning_supported_volatile)
if(_warning_supported_volatile)
# include/generic/rte_spinlock.h increments volatiled-qualified type with
# "++". but this is deprecated by GCC, so silence it.
set(compile_options
INTERFACE_COMPILE_OPTIONS "-Wno-volatile")
endif()
if (library_suffix STREQUAL CMAKE_STATIC_LIBRARY_SUFFIX)
# No pmd driver code will be pulled in without "--whole-archive". To
# avoid exposing that to seastar users, combine dpdk into a single
# .o file.
set (dpdk_object_path "${CMAKE_BINARY_DIR}/dpdk.o")
add_custom_command (
OUTPUT ${dpdk_object_path}
COMMAND ${CMAKE_CXX_COMPILER}
-r # create a relocatable object
-o ${dpdk_object_path}
-Wl,--whole-archive ${_dpdk_linker_files}
DEPENDS
${_dpdk_linker_files})
add_custom_target (dpdk_object
DEPENDS ${dpdk_object_path})
add_library (dpdk OBJECT IMPORTED)
add_dependencies (dpdk dpdk_object)
set_target_properties (dpdk
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${dpdk_INCLUDE_DIR}
IMPORTED_OBJECTS ${dpdk_object_path}
${compile_options})
# we include dpdk in seastar already, so no need to expose it with
# dpdk_LIBRARIES
set (dpdk_LIBRARIES "")
add_library (DPDK::dpdk ALIAS dpdk)
else ()
set (dpdk_LIBRARIES ${dpdk_PC_LDFLAGS})
add_library (DPDK::dpdk INTERFACE IMPORTED)
set_target_properties (DPDK::dpdk
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${dpdk_PC_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${_dpdk_libraries}"
${compile_options})
endif()
endif ()