Home | History | Annotate | Line # | Download | only in Modules
      1 # Try to find dpdk
      2 #
      3 # Once done, this will define
      4 #
      5 # dpdk_FOUND
      6 # dpdk_INCLUDE_DIRS
      7 # dpdk_LIBRARIES
      8 # dpdk_STATIC_LIBRARIES
      9 # dpdk_LIBS_STATIC
     10 # dpdk_REQUIRES_PRIVATE
     11 # dpdk_PACKAGE_NAME
     12 
     13 #
     14 # We only try to find DPDK using pkg-config; DPDK is *SO*
     15 # complicated - DPDK 19.02, for example, has about 117(!)
     16 # libraries, and the precise set of libraries required has
     17 # changed over time  - so attempting to guess which libraries
     18 # you need, and hardcoding that in an attempt to find the
     19 # libraries without DPDK, rather than relying on DPDK to
     20 # tell you, with a .pc file, what libraries are needed,
     21 # is *EXTREMELY* fragile and has caused some bug reports,
     22 # so we're just not going to do it.
     23 #
     24 # If that causes a problem, the only thing we will do is
     25 # accept an alternative way of finding the appropriate
     26 # library set for the installed version of DPDK that is
     27 # as robust as pkg-config (i.e., it had better work as well
     28 # as pkg-config with *ALL* versions of DPDK that provide a
     29 # libdpdk.pc file).
     30 #
     31 # If dpdk_ROOT is set, add ${dpdk_ROOT}/pkgconfig
     32 # to PKG_CONFIG_PATH, so we look for the .pc file there,
     33 # first.
     34 #
     35 if(PKG_CONFIG_FOUND)
     36   set(save_PKG_CONFIG_PATH $ENV{PKG_CONFIG_PATH})
     37   if(dpdk_ROOT)
     38     set(ENV{PKG_CONFIG_PATH} "${dpdk_ROOT}/pkgconfig:$ENV{PKG_CONFIG_PATH}")
     39   endif()
     40   pkg_check_modules(dpdk QUIET libdpdk)
     41   if(dpdk_FOUND)
     42     #
     43     # Get link information for DPDK.
     44     #
     45     pkg_get_link_info(dpdk libdpdk)
     46   endif()
     47   set(ENV{PKG_CONFIG_PATH} "${save_PKG_CONFIG_PATH}")
     48 endif()
     49 
     50 mark_as_advanced(dpdk_INCLUDE_DIRS dpdk_LIBRARIES dpdk_STATIC_LIBRARIES dpdk_REQUIRES_PRIVATE)
     51 
     52 include(FindPackageHandleStandardArgs)
     53 find_package_handle_standard_args(dpdk DEFAULT_MSG
     54   dpdk_INCLUDE_DIRS
     55   dpdk_LIBRARIES)
     56 
     57 if(dpdk_FOUND)
     58   #
     59   # This depends on CMake support for "imported targets",
     60   # which are not supported until CMake 3.19.
     61   #
     62   # Ubuntu 20.04 provides CMake 3.16.3, so we are *NOT*
     63   # going to require CMake 3.19.  If you want to use
     64   # Shiny New Features(TM), wait until all the OSes on
     65   # which a build might conceivably be done, and that
     66   # provide CMake, provide 3.19 or later.
     67   #
     68   # Just don't do this stuff on earlier versions.  If that
     69   # breaks something, figure out a way to do it *without*
     70   # "imported targets", and either do this that way, or,
     71   # at least, do it that way on older versions of CMake.
     72   #
     73   # (One good thing about autotools is that only the builders
     74   # of a package, and people doing configure-script development,
     75   # have to care about the autoconf etc. version; you don't
     76   # even need to have autotools installed in order to be able
     77   # to run an autotools-generated configure script, you just
     78   # need an environment UN*Xy enough, and modern enough, to
     79   # run the stuff in the script.
     80   #
     81   # This is *NOT* the case for CMake; not only do you need
     82   # CMake in order to build a package using CMake, you need
     83   # a version recent enough to run the stuff the package's
     84   # CMake files use.
     85   #
     86   # Please keep this in mind when changing any CMake files,
     87   # and keep in mind what versions of CMake come with, for
     88   # example, commonly-used versions of commonly-used
     89   # Linux distributions.)
     90   #
     91   if(NOT CMAKE_VERSION VERSION_LESS 3.19)
     92     if(NOT TARGET dpdk::cflags)
     93        if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64")
     94         set(rte_cflags "-march=core2")
     95       elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM")
     96         set(rte_cflags "-march=armv7-a")
     97       elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
     98         set(rte_cflags "-march=armv8-a+crc")
     99       endif()
    100       add_library(dpdk::cflags INTERFACE IMPORTED)
    101       if (rte_cflags)
    102         set_target_properties(dpdk::cflags PROPERTIES
    103           INTERFACE_COMPILE_OPTIONS "${rte_cflags}")
    104       endif()
    105     endif()
    106 
    107     if(NOT TARGET dpdk::dpdk)
    108       add_library(dpdk::dpdk INTERFACE IMPORTED)
    109       find_package(Threads QUIET)
    110       list(APPEND dpdk_LIBRARIES
    111         Threads::Threads
    112         dpdk::cflags)
    113       set_target_properties(dpdk::dpdk PROPERTIES
    114         INTERFACE_LINK_LIBRARIES "${dpdk_LIBRARIES}"
    115         INTERFACE_INCLUDE_DIRECTORIES "${dpdk_INCLUDE_DIRS}")
    116     endif()
    117   endif()
    118 endif()
    119