1d30ea906Sjfb8856606# SPDX-License-Identifier: BSD-3-Clause 24418919fSjohnjiang# Copyright(c) 2017-2019 Intel Corporation 34418919fSjohnjiang 4*2d9fd380Sjfb8856606# Defines the order of dependencies evaluation 5*2d9fd380Sjfb8856606subdirs = [ 6*2d9fd380Sjfb8856606 'common', 7d30ea906Sjfb8856606 'bus', 8*2d9fd380Sjfb8856606 'common/mlx5', # depends on bus. 9*2d9fd380Sjfb8856606 'common/qat', # depends on bus. 10d30ea906Sjfb8856606 'mempool', # depends on common and bus. 114418919fSjohnjiang 'net', # depends on common, bus, mempool 124418919fSjohnjiang 'raw', # depends on common, bus and net. 13d30ea906Sjfb8856606 'crypto', # depends on common, bus and mempool (net in future). 14d30ea906Sjfb8856606 'compress', # depends on common, bus, mempool. 15*2d9fd380Sjfb8856606 'regex', # depends on common, bus, regexdev. 16*2d9fd380Sjfb8856606 'vdpa', # depends on common, bus and mempool. 17d30ea906Sjfb8856606 'event', # depends on common, bus, mempool and net. 18*2d9fd380Sjfb8856606 'baseband', # depends on common and bus. 19*2d9fd380Sjfb8856606] 204418919fSjohnjiang 21*2d9fd380Sjfb8856606disabled_drivers = run_command(list_dir_globs, get_option('disable_drivers'), 22*2d9fd380Sjfb8856606 ).stdout().split() 23d30ea906Sjfb8856606 24d30ea906Sjfb8856606default_cflags = machine_args 25*2d9fd380Sjfb8856606default_cflags += ['-DALLOW_EXPERIMENTAL_API'] 26*2d9fd380Sjfb8856606default_cflags += ['-DALLOW_INTERNAL_API'] 27*2d9fd380Sjfb8856606 28d30ea906Sjfb8856606if cc.has_argument('-Wno-format-truncation') 29d30ea906Sjfb8856606 default_cflags += '-Wno-format-truncation' 30d30ea906Sjfb8856606endif 31d30ea906Sjfb8856606 32*2d9fd380Sjfb8856606foreach subpath:subdirs 33d30ea906Sjfb8856606 drivers = [] 34d30ea906Sjfb8856606 std_deps = [] 35d30ea906Sjfb8856606 config_flag_fmt = '' # format string used to set the value in dpdk_conf 36d30ea906Sjfb8856606 37*2d9fd380Sjfb8856606 # subpath can be either "class" or "class/driver" 38*2d9fd380Sjfb8856606 if subpath.contains('/') 39*2d9fd380Sjfb8856606 driver_path = subpath.split('/') 40*2d9fd380Sjfb8856606 class = driver_path[0] 41*2d9fd380Sjfb8856606 drivers += driver_path[1] 42*2d9fd380Sjfb8856606 else 43*2d9fd380Sjfb8856606 class = subpath 44d30ea906Sjfb8856606 subdir(class) 45*2d9fd380Sjfb8856606 endif 46*2d9fd380Sjfb8856606 47*2d9fd380Sjfb8856606 # save class name on first occurrence 48*2d9fd380Sjfb8856606 if not dpdk_driver_classes.contains(class) 49*2d9fd380Sjfb8856606 dpdk_driver_classes += class 50*2d9fd380Sjfb8856606 endif 51*2d9fd380Sjfb8856606 # get already enabled drivers of the same class 52*2d9fd380Sjfb8856606 enabled_drivers = get_variable(class + '_drivers', []) 53d30ea906Sjfb8856606 54d30ea906Sjfb8856606 foreach drv:drivers 55d30ea906Sjfb8856606 drv_path = join_paths(class, drv) 56d30ea906Sjfb8856606 57d30ea906Sjfb8856606 # set up empty variables used for build 58d30ea906Sjfb8856606 build = true # set to false to disable, e.g. missing deps 594418919fSjohnjiang reason = '<unknown reason>' # set if build == false to explain 60d30ea906Sjfb8856606 name = drv 61*2d9fd380Sjfb8856606 fmt_name = '' 62d30ea906Sjfb8856606 sources = [] 63*2d9fd380Sjfb8856606 headers = [] 64d30ea906Sjfb8856606 objs = [] 65d30ea906Sjfb8856606 cflags = default_cflags 66d30ea906Sjfb8856606 includes = [include_directories(drv_path)] 67d30ea906Sjfb8856606 # set up internal deps. Drivers can append/override as necessary 68d30ea906Sjfb8856606 deps = std_deps 69d30ea906Sjfb8856606 # ext_deps: Stores external library dependency got 704418919fSjohnjiang # using dependency() (preferred) or find_library(). 714418919fSjohnjiang # For the find_library() case (but not with dependency()) we also 724418919fSjohnjiang # need to specify the "-l" flags in pkgconfig_extra_libs variable 734418919fSjohnjiang # too, so that it can be reflected in the pkgconfig output for 744418919fSjohnjiang # static builds. 75d30ea906Sjfb8856606 ext_deps = [] 76d30ea906Sjfb8856606 pkgconfig_extra_libs = [] 77d30ea906Sjfb8856606 78*2d9fd380Sjfb8856606 if disabled_drivers.contains(drv_path) 794418919fSjohnjiang build = false 80*2d9fd380Sjfb8856606 reason = 'explicitly disabled via build config' 81*2d9fd380Sjfb8856606 else 82*2d9fd380Sjfb8856606 # pull in driver directory which should update all the local variables 83*2d9fd380Sjfb8856606 subdir(drv_path) 844418919fSjohnjiang endif 85*2d9fd380Sjfb8856606 86d30ea906Sjfb8856606 if build 874418919fSjohnjiang # get dependency objs from strings 884418919fSjohnjiang shared_deps = ext_deps 894418919fSjohnjiang static_deps = ext_deps 904418919fSjohnjiang foreach d:deps 914418919fSjohnjiang if not is_variable('shared_rte_' + d) 924418919fSjohnjiang build = false 93*2d9fd380Sjfb8856606 reason = 'missing internal dependency, "@0@"'.format(d) 944418919fSjohnjiang message('Disabling @1@ [@2@]: missing internal dependency "@0@"' 954418919fSjohnjiang .format(d, name, 'drivers/' + drv_path)) 964418919fSjohnjiang else 974418919fSjohnjiang shared_deps += [get_variable('shared_rte_' + d)] 984418919fSjohnjiang static_deps += [get_variable('static_rte_' + d)] 994418919fSjohnjiang endif 1004418919fSjohnjiang endforeach 1014418919fSjohnjiang endif 1024418919fSjohnjiang 1034418919fSjohnjiang if not build 1044418919fSjohnjiang # some driver directories are placeholders which 1054418919fSjohnjiang # are never built, so we allow suppression of the 1064418919fSjohnjiang # component disable printout in those cases 1074418919fSjohnjiang if reason != '' 1084418919fSjohnjiang dpdk_drvs_disabled += drv_path 1094418919fSjohnjiang set_variable(drv_path.underscorify() + 1104418919fSjohnjiang '_disable_reason', reason) 1114418919fSjohnjiang endif 1124418919fSjohnjiang else 113*2d9fd380Sjfb8856606 enabled_drivers += name 114*2d9fd380Sjfb8856606 lib_name = '_'.join(['rte', class, name]) 115*2d9fd380Sjfb8856606 dpdk_conf.set(lib_name.to_upper(), 1) 116d30ea906Sjfb8856606 117*2d9fd380Sjfb8856606 if fmt_name == '' 118*2d9fd380Sjfb8856606 fmt_name = name 119*2d9fd380Sjfb8856606 endif 120d30ea906Sjfb8856606 121*2d9fd380Sjfb8856606 dpdk_conf.set(config_flag_fmt.format(fmt_name.to_upper()),1) #old-style macro 122*2d9fd380Sjfb8856606 # for driver compatibility, since we changed the 123*2d9fd380Sjfb8856606 # default to match that of make. Remove in future release 124*2d9fd380Sjfb8856606 # after following deprecation process 125*2d9fd380Sjfb8856606 if config_flag_fmt.contains('_PMD_@0@') and (class == 'crypto' 126*2d9fd380Sjfb8856606 or class == 'compress' 127*2d9fd380Sjfb8856606 or class == 'event') 128*2d9fd380Sjfb8856606 alt_flag_fmt = '_@0@_PMD'.join( 129*2d9fd380Sjfb8856606 config_flag_fmt.split('_PMD_@0@')) 130*2d9fd380Sjfb8856606 if config_flag_fmt.contains('EVENTDEV') 131*2d9fd380Sjfb8856606 alt_flag_fmt = '_@0@_EVENTDEV_PMD'.join( 132*2d9fd380Sjfb8856606 config_flag_fmt.split('_PMD_@0@_EVENTDEV')) 133*2d9fd380Sjfb8856606 endif 134*2d9fd380Sjfb8856606 dpdk_conf.set(alt_flag_fmt.format( 135*2d9fd380Sjfb8856606 fmt_name.to_upper()), 1) 136d30ea906Sjfb8856606 endif 137d30ea906Sjfb8856606 138d30ea906Sjfb8856606 dpdk_extra_ldflags += pkgconfig_extra_libs 139d30ea906Sjfb8856606 140*2d9fd380Sjfb8856606 install_headers(headers) 141*2d9fd380Sjfb8856606 142d30ea906Sjfb8856606 # generate pmdinfo sources by building a temporary 143d30ea906Sjfb8856606 # lib and then running pmdinfogen on the contents of 144d30ea906Sjfb8856606 # that lib. The final lib reuses the object files and 145d30ea906Sjfb8856606 # adds in the new source file. 146*2d9fd380Sjfb8856606 if not is_windows 147d30ea906Sjfb8856606 out_filename = lib_name + '.pmd.c' 148d30ea906Sjfb8856606 tmp_lib = static_library('tmp_' + lib_name, 149d30ea906Sjfb8856606 sources, 150d30ea906Sjfb8856606 include_directories: includes, 1514418919fSjohnjiang dependencies: static_deps, 152d30ea906Sjfb8856606 c_args: cflags) 153d30ea906Sjfb8856606 objs += tmp_lib.extract_all_objects() 154d30ea906Sjfb8856606 sources = custom_target(out_filename, 155d30ea906Sjfb8856606 command: [pmdinfo, tmp_lib.full_path(), 156d30ea906Sjfb8856606 '@OUTPUT@', pmdinfogen], 157d30ea906Sjfb8856606 output: out_filename, 158d30ea906Sjfb8856606 depends: [pmdinfogen, tmp_lib]) 159d30ea906Sjfb8856606 endif 160d30ea906Sjfb8856606 161d30ea906Sjfb8856606 # now build the static driver 162d30ea906Sjfb8856606 static_lib = static_library(lib_name, 163d30ea906Sjfb8856606 sources, 164d30ea906Sjfb8856606 objects: objs, 165d30ea906Sjfb8856606 include_directories: includes, 1664418919fSjohnjiang dependencies: static_deps, 167d30ea906Sjfb8856606 c_args: cflags, 168d30ea906Sjfb8856606 install: true) 169d30ea906Sjfb8856606 170d30ea906Sjfb8856606 # now build the shared driver 171*2d9fd380Sjfb8856606 version_map = '@0@/@1@/version.map'.format( 172d30ea906Sjfb8856606 meson.current_source_dir(), 173*2d9fd380Sjfb8856606 drv_path) 1740c6bd470Sfengbojiang implib = 'lib' + lib_name + '.dll.a' 1754418919fSjohnjiang 1764418919fSjohnjiang def_file = custom_target(lib_name + '_def', 177*2d9fd380Sjfb8856606 command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'], 1784418919fSjohnjiang input: version_map, 1794418919fSjohnjiang output: '@0@_exports.def'.format(lib_name)) 180*2d9fd380Sjfb8856606 181*2d9fd380Sjfb8856606 mingw_map = custom_target(lib_name + '_mingw', 182*2d9fd380Sjfb8856606 command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'], 183*2d9fd380Sjfb8856606 input: version_map, 184*2d9fd380Sjfb8856606 output: '@0@_mingw.map'.format(lib_name)) 185*2d9fd380Sjfb8856606 186*2d9fd380Sjfb8856606 lk_deps = [version_map, def_file, mingw_map] 1874418919fSjohnjiang if is_windows 1880c6bd470Sfengbojiang if is_ms_linker 1890c6bd470Sfengbojiang lk_args = ['-Wl,/def:' + def_file.full_path()] 1900c6bd470Sfengbojiang if meson.version().version_compare('<0.54.0') 1910c6bd470Sfengbojiang lk_args += ['-Wl,/implib:drivers\\' + implib] 1920c6bd470Sfengbojiang endif 1930c6bd470Sfengbojiang else 194*2d9fd380Sjfb8856606 lk_args = ['-Wl,--version-script=' + mingw_map.full_path()] 1950c6bd470Sfengbojiang endif 1964418919fSjohnjiang else 1974418919fSjohnjiang lk_args = ['-Wl,--version-script=' + version_map] 1984418919fSjohnjiang # on unix systems check the output of the 199*2d9fd380Sjfb8856606 # check-symbols.sh script, using it as a 2004418919fSjohnjiang # dependency of the .so build 201*2d9fd380Sjfb8856606 lk_deps += custom_target(lib_name + '.sym_chk', 202*2d9fd380Sjfb8856606 command: [check_symbols, 2034418919fSjohnjiang version_map, '@INPUT@'], 2044418919fSjohnjiang capture: true, 2054418919fSjohnjiang input: static_lib, 206*2d9fd380Sjfb8856606 output: lib_name + '.sym_chk') 2074418919fSjohnjiang endif 2084418919fSjohnjiang 209d30ea906Sjfb8856606 shared_lib = shared_library(lib_name, 210d30ea906Sjfb8856606 sources, 211d30ea906Sjfb8856606 objects: objs, 212d30ea906Sjfb8856606 include_directories: includes, 2134418919fSjohnjiang dependencies: shared_deps, 214d30ea906Sjfb8856606 c_args: cflags, 2154418919fSjohnjiang link_args: lk_args, 2164418919fSjohnjiang link_depends: lk_deps, 217*2d9fd380Sjfb8856606 version: abi_version, 218d30ea906Sjfb8856606 soversion: so_version, 219d30ea906Sjfb8856606 install: true, 220d30ea906Sjfb8856606 install_dir: driver_install_path) 221d30ea906Sjfb8856606 222d30ea906Sjfb8856606 # create a dependency object and add it to the global dictionary so 223d30ea906Sjfb8856606 # testpmd or other built-in apps can find it if necessary 224d30ea906Sjfb8856606 shared_dep = declare_dependency(link_with: shared_lib, 225d30ea906Sjfb8856606 include_directories: includes, 2264418919fSjohnjiang dependencies: shared_deps) 2270c6bd470Sfengbojiang static_dep = declare_dependency( 228d30ea906Sjfb8856606 include_directories: includes, 2294418919fSjohnjiang dependencies: static_deps) 230d30ea906Sjfb8856606 231d30ea906Sjfb8856606 dpdk_drivers += static_lib 232d30ea906Sjfb8856606 233d30ea906Sjfb8856606 set_variable('shared_@0@'.format(lib_name), shared_dep) 234d30ea906Sjfb8856606 set_variable('static_@0@'.format(lib_name), static_dep) 2354418919fSjohnjiang dependency_name = ''.join(lib_name.split('rte_')) 2364418919fSjohnjiang message('drivers/@0@: Defining dependency "@1@"'.format( 2374418919fSjohnjiang drv_path, dependency_name)) 238d30ea906Sjfb8856606 endif # build 239d30ea906Sjfb8856606 endforeach 240d30ea906Sjfb8856606 241*2d9fd380Sjfb8856606 set_variable(class + '_drivers', enabled_drivers) 242d30ea906Sjfb8856606endforeach 243