# Try to find dpdk # # Once done, this will define # # dpdk_FOUND # dpdk_INCLUDE_DIRS # dpdk_LIBRARIES # dpdk_STATIC_LIBRARIES # dpdk_LIBS_STATIC # dpdk_REQUIRES_PRIVATE # dpdk_PACKAGE_NAME # # We only try to find DPDK using pkg-config; DPDK is *SO* # complicated - DPDK 19.02, for example, has about 117(!) # libraries, and the precise set of libraries required has # changed over time - so attempting to guess which libraries # you need, and hardcoding that in an attempt to find the # libraries without DPDK, rather than relying on DPDK to # tell you, with a .pc file, what libraries are needed, # is *EXTREMELY* fragile and has caused some bug reports, # so we're just not going to do it. # # If that causes a problem, the only thing we will do is # accept an alternative way of finding the appropriate # library set for the installed version of DPDK that is # as robust as pkg-config (i.e., it had better work as well # as pkg-config with *ALL* versions of DPDK that provide a # libdpdk.pc file). # # If dpdk_ROOT is set, add ${dpdk_ROOT}/pkgconfig # to PKG_CONFIG_PATH, so we look for the .pc file there, # first. # if(PKG_CONFIG_FOUND) set(save_PKG_CONFIG_PATH $ENV{PKG_CONFIG_PATH}) if(dpdk_ROOT) set(ENV{PKG_CONFIG_PATH} "${dpdk_ROOT}/pkgconfig:$ENV{PKG_CONFIG_PATH}") endif() pkg_check_modules(dpdk QUIET libdpdk) if(dpdk_FOUND) # # Get link information for DPDK. # pkg_get_link_info(dpdk libdpdk) endif() set(ENV{PKG_CONFIG_PATH} "${save_PKG_CONFIG_PATH}") endif() mark_as_advanced(dpdk_INCLUDE_DIRS dpdk_LIBRARIES dpdk_STATIC_LIBRARIES dpdk_REQUIRES_PRIVATE) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(dpdk DEFAULT_MSG dpdk_INCLUDE_DIRS dpdk_LIBRARIES) if(dpdk_FOUND) # # This depends on CMake support for "imported targets", # which are not supported until CMake 3.19. # # Ubuntu 20.04 provides CMake 3.16.3, so we are *NOT* # going to require CMake 3.19. If you want to use # Shiny New Features(TM), wait until all the OSes on # which a build might conceivably be done, and that # provide CMake, provide 3.19 or later. # # Just don't do this stuff on earlier versions. If that # breaks something, figure out a way to do it *without* # "imported targets", and either do this that way, or, # at least, do it that way on older versions of CMake. # # (One good thing about autotools is that only the builders # of a package, and people doing configure-script development, # have to care about the autoconf etc. version; you don't # even need to have autotools installed in order to be able # to run an autotools-generated configure script, you just # need an environment UN*Xy enough, and modern enough, to # run the stuff in the script. # # This is *NOT* the case for CMake; not only do you need # CMake in order to build a package using CMake, you need # a version recent enough to run the stuff the package's # CMake files use. # # Please keep this in mind when changing any CMake files, # and keep in mind what versions of CMake come with, for # example, commonly-used versions of commonly-used # Linux distributiions.) # if(NOT CMAKE_VERSION VERSION_LESS 3.19) if(NOT TARGET dpdk::cflags) if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64") set(rte_cflags "-march=core2") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM") set(rte_cflags "-march=armv7-a") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64") set(rte_cflags "-march=armv8-a+crc") endif() add_library(dpdk::cflags INTERFACE IMPORTED) if (rte_cflags) set_target_properties(dpdk::cflags PROPERTIES INTERFACE_COMPILE_OPTIONS "${rte_cflags}") endif() endif() if(NOT TARGET dpdk::dpdk) add_library(dpdk::dpdk INTERFACE IMPORTED) find_package(Threads QUIET) list(APPEND dpdk_LIBRARIES Threads::Threads dpdk::cflags) set_target_properties(dpdk::dpdk PROPERTIES INTERFACE_LINK_LIBRARIES "${dpdk_LIBRARIES}" INTERFACE_INCLUDE_DIRECTORIES "${dpdk_INCLUDE_DIRS}") endif() endif() endif()