]> git.proxmox.com Git - ceph.git/blob - ceph/cmake/modules/BuildDPDK.cmake
bfa8ff0c285ac373d45b0cdf44ec8ddd659a91a9
[ceph.git] / ceph / cmake / modules / BuildDPDK.cmake
1 function(do_build_dpdk dpdk_dir)
2 # mk/machine/native/rte.vars.mk
3 # rte_cflags are extracted from mk/machine/${machine}/rte.vars.mk
4 # only 3 of them have -march=<arch> defined, so copying them here.
5 # we need to pass the -march=<arch> to ${cc} as some headers in dpdk
6 # require it to compile. for instance, dpdk/include/rte_memcpy.h.
7 if(CMAKE_SYSTEM_PROCESSOR MATCHES "i386")
8 set(arch "x86_64")
9 set(machine "default")
10 set(machine_tmpl "native")
11 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
12 set(arch "i686")
13 set(machine "default")
14 set(machine_tmpl "native")
15 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64")
16 set(arch "x86_64")
17 set(machine "default")
18 set(machine_tmpl "native")
19 set(rte_cflags "-march=core2")
20 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM")
21 set(arch "arm")
22 set(machine "armv7a")
23 set(machine_tmpl "armv7a")
24 set(rte_cflags "-march=armv7-a")
25 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
26 set(arch "arm64")
27 set(machine "armv8a")
28 set(machine_tmpl "armv8a")
29 set(rte_cflags "-march=armv8-a+crc")
30 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(powerpc|ppc)64")
31 set(arch "ppc_64")
32 set(machine "power8")
33 set(machine_tmpl "power8")
34 else()
35 message(FATAL_ERROR "not able to build DPDK support: "
36 "unknown arch \"${CMAKE_SYSTEM_PROCESSOR}\"")
37 endif()
38 set(dpdk_rte_CFLAGS "${rte_cflags}" CACHE INTERNAL "")
39 if(CMAKE_SYSTEM_NAME MATCHES "Linux")
40 set(execenv "linux")
41 elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
42 set(execenv "freebsd")
43 else()
44 message(FATAL_ERROR "not able to build DPDK support: "
45 "unsupported OS \"${CMAKE_SYSTEM_NAME}\"")
46 endif()
47
48 if(CMAKE_C_COMPILER_ID STREQUAL GNU)
49 set(toolchain "gcc")
50 elseif(CMAKE_C_COMPILER_ID STREQUAL Clang)
51 set(toolchain "clang")
52 elseif(CMAKE_C_COMPILER_ID STREQUAL Intel)
53 set(toolchain "icc")
54 else()
55 message(FATAL_ERROR "not able to build DPDK support: "
56 "unknown compiler \"${CMAKE_C_COMPILER_ID}\"")
57 endif()
58
59 set(target "${arch}-${machine_tmpl}-${execenv}-${toolchain}")
60
61 include(FindMake)
62 find_make("MAKE_EXECUTABLE" "make_cmd")
63 execute_process(
64 COMMAND ${MAKE_EXECUTABLE} showconfigs
65 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/spdk/dpdk
66 OUTPUT_VARIABLE supported_targets
67 OUTPUT_STRIP_TRAILING_WHITESPACE)
68 string(REPLACE "\n" ";" supported_targets "${supported_targets}")
69 list(FIND supported_targets ${target} found)
70 if(found EQUAL -1)
71 message(FATAL_ERROR "not able to build DPDK support: "
72 "unsupported target. "
73 "\"${target}\" not listed in ${supported_targets}")
74 endif()
75
76 if(Seastar_DPDK AND WITH_SPDK)
77 message(FATAL_ERROR "not able to build DPDK with "
78 "both Seastar_DPDK and WITH_SPDK enabled")
79 elseif(Seastar_DPDK)
80 set(dpdk_source_dir ${CMAKE_SOURCE_DIR}/src/seastar/dpdk)
81 else() # WITH_SPDK or WITH_DPDK is enabled
82 set(dpdk_source_dir ${CMAKE_SOURCE_DIR}/src/spdk/dpdk)
83 endif()
84
85 set(extra_cflags "-fPIC")
86 include(CheckCCompilerFlag)
87 check_c_compiler_flag("-Wno-unused-but-set-variable"
88 HAVE_UNUSED_BUT_SET_VARIABLE)
89 if(HAVE_UNUSED_BUT_SET_VARIABLE)
90 string(APPEND extra_cflags " -Wno-unused-but-set-variable")
91 endif()
92
93 include(ExternalProject)
94 ExternalProject_Add(dpdk-ext
95 SOURCE_DIR ${dpdk_source_dir}
96 CONFIGURE_COMMAND ${make_cmd} config O=${dpdk_dir} T=${target}
97 BUILD_COMMAND ${make_cmd} O=${dpdk_dir} CC=${CMAKE_C_COMPILER} EXTRA_CFLAGS=${extra_cflags}
98 BUILD_IN_SOURCE 1
99 INSTALL_COMMAND ""
100 LOG_CONFIGURE ON
101 LOG_BUILD ON
102 LOG_MERGED_STDOUTERR ON
103 LOG_OUTPUT_ON_FAILURE ON)
104 if(NUMA_FOUND)
105 set(numa "y")
106 else()
107 set(numa "n")
108 endif()
109 ExternalProject_Add_Step(dpdk-ext patch-config
110 COMMAND ${CMAKE_MODULE_PATH}/patch-dpdk-conf.sh ${dpdk_dir} ${machine} ${arch} ${numa}
111 DEPENDEES configure
112 DEPENDERS build)
113 # easier to adjust the config
114 ExternalProject_Add_StepTargets(dpdk-ext configure patch-config build)
115 endfunction()
116
117 function(do_export_dpdk dpdk_dir)
118 set(DPDK_INCLUDE_DIR ${dpdk_dir}/include)
119 # create the directory so cmake won't complain when looking at the imported
120 # target
121 file(MAKE_DIRECTORY ${DPDK_INCLUDE_DIR})
122
123 if(NOT TARGET dpdk::cflags)
124 add_library(dpdk::cflags INTERFACE IMPORTED)
125 if (dpdk_rte_CFLAGS)
126 set_target_properties(dpdk::cflags PROPERTIES
127 INTERFACE_COMPILE_OPTIONS "${dpdk_rte_CFLAGS}")
128 endif()
129 endif()
130
131 list(APPEND dpdk_components
132 bus_pci
133 eal
134 kvargs
135 mbuf
136 mempool
137 mempool_ring
138 pci
139 ring
140 telemetry)
141 if(Seastar_DPDK)
142 list(APPEND dpdk_components
143 bus_vdev
144 cfgfile
145 hash
146 net
147 pmd_bnxt
148 pmd_cxgbe
149 pmd_e1000
150 pmd_ena
151 pmd_enic
152 pmd_i40e
153 pmd_ixgbe
154 pmd_nfp
155 pmd_qede
156 pmd_ring
157 pmd_sfc_efx
158 timer)
159 endif()
160
161 foreach(c ${dpdk_components})
162 add_library(dpdk::${c} STATIC IMPORTED)
163 add_dependencies(dpdk::${c} dpdk-ext)
164 set(dpdk_${c}_LIBRARY
165 "${dpdk_dir}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}rte_${c}${CMAKE_STATIC_LIBRARY_SUFFIX}")
166 set_target_properties(dpdk::${c} PROPERTIES
167 INTERFACE_INCLUDE_DIRECTORIES ${DPDK_INCLUDE_DIR}
168 INTERFACE_LINK_LIBRARIES dpdk::cflags
169 IMPORTED_LOCATION "${dpdk_${c}_LIBRARY}")
170 list(APPEND DPDK_LIBRARIES dpdk::${c})
171 list(APPEND DPDK_ARCHIVES "${dpdk_${c}_LIBRARY}")
172 endforeach()
173
174 if(NUMA_FOUND)
175 set(dpdk_numa " -Wl,-lnuma")
176 endif()
177 add_library(dpdk::dpdk INTERFACE IMPORTED)
178 add_dependencies(dpdk::dpdk
179 ${DPDK_LIBRARIES})
180 # workaround for https://gitlab.kitware.com/cmake/cmake/issues/16947
181 set_target_properties(dpdk::dpdk PROPERTIES
182 INTERFACE_INCLUDE_DIRECTORIES ${DPDK_INCLUDE_DIR}
183 INTERFACE_LINK_LIBRARIES
184 "-Wl,--whole-archive $<JOIN:${DPDK_ARCHIVES}, > -Wl,--no-whole-archive ${dpdk_numa} -Wl,-lpthread,-ldl")
185 if(dpdk_rte_CFLAGS)
186 set_target_properties(dpdk::dpdk PROPERTIES
187 INTERFACE_COMPILE_OPTIONS "${dpdk_rte_CFLAGS}")
188 endif()
189 endfunction()
190
191 function(build_dpdk dpdk_dir)
192 find_package(NUMA QUIET)
193 if(NOT TARGET dpdk-ext)
194 do_build_dpdk(${dpdk_dir})
195 endif()
196 if(NOT TARGET dpdk::dpdk)
197 do_export_dpdk(${dpdk_dir})
198 endif()
199 endfunction()