1# SPDX-License-Identifier: BSD-3-Clause 2# Copyright(c) 2017-2019 Intel Corporation 3 4 5# process all libraries equally, as far as possible 6# "core" libs first, then others alphabetically as far as possible 7# NOTE: for speed of meson runs, the dependencies in the subdirectories 8# sometimes skip deps that would be implied by others, e.g. if mempool is 9# given as a dep, no need to mention ring. This is especially true for the 10# core libs which are widely reused, so their deps are kept to a minimum. 11libraries = [ 12 'kvargs', # eal depends on kvargs 13 'telemetry', # basic info querying 14 'eal', # everything depends on eal 15 'ring', 16 'rcu', # rcu depends on ring 17 'mempool', 18 'mbuf', 19 'net', 20 'meter', 21 'ethdev', 22 'pci', # core 23 'cmdline', 24 'metrics', # bitrate/latency stats depends on this 25 'hash', # efd depends on this 26 'timer', # eventdev depends on this 27 'acl', 28 'bbdev', 29 'bitratestats', 30 'bpf', 31 'cfgfile', 32 'compressdev', 33 'cryptodev', 34 'distributor', 35 'efd', 36 'eventdev', 37 'gpudev', 38 'gro', 39 'gso', 40 'ip_frag', 41 'jobstats', 42 'kni', 43 'latencystats', 44 'lpm', 45 'member', 46 'pcapng', 47 'power', 48 'rawdev', 49 'regexdev', 50 'dmadev', 51 'rib', 52 'reorder', 53 'sched', 54 'security', 55 'stack', 56 'vhost', 57 'ipsec', # ipsec lib depends on net, crypto and security 58 'fib', #fib lib depends on rib 59 'port', # pkt framework libs which use other libs from above 60 'pdump', # pdump lib depends on bpf 61 'table', 62 'pipeline', 63 'flow_classify', # flow_classify lib depends on pkt framework table lib 64 'graph', 65 'node', 66] 67 68optional_libs = [ 69 'bitratestats', 70 'cfgfile', 71 'flow_classify', 72 'gpudev', 73 'gro', 74 'gso', 75 'kni', 76 'jobstats', 77 'latencystats', 78 'metrics', 79 'node', 80 'pdump', 81 'pipeline', 82 'port', 83 'power', 84 'table', 85 'vhost', 86] 87 88disabled_libs = [] 89opt_disabled_libs = run_command(list_dir_globs, get_option('disable_libs'), 90 check: true).stdout().split() 91foreach l:opt_disabled_libs 92 if not optional_libs.contains(l) 93 warning('Cannot disable mandatory library "@0@"'.format(l)) 94 continue 95 endif 96 disabled_libs += l 97endforeach 98 99 100default_cflags = machine_args 101default_cflags += ['-DALLOW_EXPERIMENTAL_API'] 102default_cflags += ['-DALLOW_INTERNAL_API'] 103 104if cc.has_argument('-Wno-format-truncation') 105 default_cflags += '-Wno-format-truncation' 106endif 107 108enabled_libs = [] # used to print summary at the end 109 110foreach l:libraries 111 build = true 112 reason = '<unknown reason>' # set if build == false to explain why 113 name = l 114 use_function_versioning = false 115 sources = [] 116 headers = [] 117 indirect_headers = [] # public headers not directly included by apps 118 driver_sdk_headers = [] # public headers included by drivers 119 includes = [] 120 cflags = default_cflags 121 objs = [] # other object files to link against, used e.g. for 122 # instruction-set optimized versions of code 123 124 # use "deps" for internal DPDK dependencies, and "ext_deps" for 125 # external package/library requirements 126 ext_deps = [] 127 deps = [] 128 # eal is standard dependency once built 129 if dpdk_conf.has('RTE_LIB_EAL') 130 deps += ['eal'] 131 endif 132 133 if disabled_libs.contains(l) 134 build = false 135 reason = 'explicitly disabled via build config' 136 else 137 subdir(l) 138 endif 139 if name != l 140 warning('Library name, "@0@", and directory name, "@1@", do not match'.format(name, l)) 141 endif 142 143 shared_deps = ext_deps 144 static_deps = ext_deps 145 foreach d:deps 146 if not build 147 break 148 endif 149 if not is_variable('shared_rte_' + d) 150 build = false 151 reason = 'missing internal dependency, "@0@"'.format(d) 152 message('Disabling @1@ [@2@]: missing internal dependency "@0@"' 153 .format(d, name, 'lib/' + l)) 154 else 155 shared_deps += [get_variable('shared_rte_' + d)] 156 static_deps += [get_variable('static_rte_' + d)] 157 endif 158 endforeach 159 160 if not build 161 dpdk_libs_disabled += name 162 set_variable(name.underscorify() + '_disable_reason', reason) 163 continue 164 endif 165 166 enabled_libs += name 167 dpdk_conf.set('RTE_LIB_' + name.to_upper(), 1) 168 install_headers(headers) 169 install_headers(indirect_headers) 170 if get_option('enable_driver_sdk') 171 install_headers(driver_sdk_headers) 172 endif 173 dpdk_chkinc_headers += headers 174 175 libname = 'rte_' + name 176 includes += include_directories(l) 177 178 if developer_mode and is_windows and use_function_versioning 179 message('@0@: Function versioning is not supported by Windows.'.format(name)) 180 endif 181 182 if use_function_versioning 183 cflags += '-DRTE_USE_FUNCTION_VERSIONING' 184 endif 185 cflags += '-DRTE_LOG_DEFAULT_LOGTYPE=lib.' + l 186 187 # first build static lib 188 static_lib = static_library(libname, 189 sources, 190 objects: objs, 191 c_args: cflags, 192 dependencies: static_deps, 193 include_directories: includes, 194 install: true) 195 static_dep = declare_dependency( 196 include_directories: includes, 197 dependencies: static_deps) 198 199 if not use_function_versioning or is_windows 200 # use pre-build objects to build shared lib 201 sources = [] 202 objs += static_lib.extract_all_objects(recursive: false) 203 else 204 # for compat we need to rebuild with 205 # RTE_BUILD_SHARED_LIB defined 206 cflags += '-DRTE_BUILD_SHARED_LIB' 207 endif 208 version_map = '@0@/@1@/version.map'.format( 209 meson.current_source_dir(), l) 210 implib = 'librte_' + l + '.dll.a' 211 212 def_file = custom_target(libname + '_def', 213 command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'], 214 input: version_map, 215 output: '@0@_exports.def'.format(libname)) 216 217 mingw_map = custom_target(libname + '_mingw', 218 command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'], 219 input: version_map, 220 output: '@0@_mingw.map'.format(libname)) 221 222 if is_ms_linker 223 lk_args = ['-Wl,/def:' + def_file.full_path()] 224 if meson.version().version_compare('<0.54.0') 225 lk_args += ['-Wl,/implib:lib\\' + implib] 226 endif 227 else 228 if is_windows 229 lk_args = ['-Wl,--version-script=' + mingw_map.full_path()] 230 else 231 lk_args = ['-Wl,--version-script=' + version_map] 232 endif 233 endif 234 235 lk_deps = [version_map, def_file, mingw_map] 236 if developer_mode and not is_windows 237 # on unix systems check the output of the 238 # check-symbols.sh script, using it as a 239 # dependency of the .so build 240 lk_deps += custom_target(name + '.sym_chk', 241 command: [check_symbols, 242 version_map, '@INPUT@'], 243 capture: true, 244 input: static_lib, 245 output: name + '.sym_chk') 246 endif 247 248 shared_lib = shared_library(libname, 249 sources, 250 objects: objs, 251 c_args: cflags, 252 dependencies: shared_deps, 253 include_directories: includes, 254 link_args: lk_args, 255 link_depends: lk_deps, 256 version: abi_version, 257 soversion: so_version, 258 install: true) 259 shared_dep = declare_dependency(link_with: shared_lib, 260 include_directories: includes, 261 dependencies: shared_deps) 262 263 dpdk_libraries = [shared_lib] + dpdk_libraries 264 dpdk_static_libraries = [static_lib] + dpdk_static_libraries 265 266 set_variable('shared_rte_' + name, shared_dep) 267 set_variable('static_rte_' + name, static_dep) 268 if developer_mode 269 message('lib/@0@: Defining dependency "@1@"'.format(l, name)) 270 endif 271endforeach 272