dpdk/drivers/meson.build
<<
>>
Prefs
   1# SPDX-License-Identifier: BSD-3-Clause
   2# Copyright(c) 2017-2019 Intel Corporation
   3
   4# Defines the order of dependencies evaluation
   5subdirs = [
   6        'common',
   7        'bus',
   8        'common/cnxk',    # depends on bus.
   9        'common/mlx5',    # depends on bus.
  10        'common/qat',     # depends on bus.
  11        'common/sfc_efx', # depends on bus.
  12        'mempool',        # depends on common and bus.
  13        'dma',            # depends on common and bus.
  14        'net',            # depends on common, bus, mempool
  15        'raw',            # depends on common, bus, dma and net.
  16        'crypto',         # depends on common, bus and mempool (net in future).
  17        'compress',       # depends on common, bus, mempool.
  18        'regex',          # depends on common, bus, regexdev.
  19        'vdpa',           # depends on common, bus and mempool.
  20        'event',          # depends on common, bus, mempool and net.
  21        'baseband',       # depends on common and bus.
  22        'gpu',            # depends on common and bus.
  23]
  24
  25if meson.is_cross_build()
  26    disable_drivers += ',' + meson.get_cross_property('disable_drivers', '')
  27    enable_drivers += ',' + meson.get_cross_property('enable_drivers', '')
  28endif
  29
  30# add cmdline disabled drivers and meson disabled drivers together
  31disable_drivers += ',' + get_option('disable_drivers')
  32disable_drivers = run_command(list_dir_globs, disable_drivers, check: true).stdout().split()
  33
  34# add cmdline enabled drivers and meson enabled drivers together
  35enable_drivers = ',' + get_option('enable_drivers')
  36enable_drivers = run_command(list_dir_globs, enable_drivers, check: true).stdout().split()
  37if enable_drivers.length() == 0
  38    enable_drivers = run_command(list_dir_globs, '*/*', check: true).stdout().split()
  39endif
  40
  41# these drivers must always be enabled, otherwise the build breaks
  42always_enable = ['bus/pci', 'bus/vdev']
  43# we always need a mempool driver, and ring is default, so make it mandatory
  44always_enable += ['mempool/ring']
  45enable_drivers += always_enable
  46
  47default_cflags = machine_args
  48default_cflags += ['-DALLOW_EXPERIMENTAL_API']
  49default_cflags += ['-DALLOW_INTERNAL_API']
  50
  51if cc.has_argument('-Wno-format-truncation')
  52    default_cflags += '-Wno-format-truncation'
  53endif
  54
  55foreach subpath:subdirs
  56    drivers = []
  57    std_deps = []
  58    log_prefix = ''
  59
  60    # subpath can be either "class" or "class/driver"
  61    if subpath.contains('/')
  62        driver_path = subpath.split('/')
  63        class = driver_path[0]
  64        drivers += driver_path[1]
  65    else
  66        class = subpath
  67        subdir(class)
  68    endif
  69
  70    # save class name on first occurrence
  71    if not dpdk_driver_classes.contains(class)
  72        dpdk_driver_classes += class
  73    endif
  74    # get already enabled drivers of the same class
  75    enabled_drivers = get_variable(class + '_drivers', [])
  76
  77    # default log prefix can be defined per class
  78    if log_prefix == ''
  79        # default log name is pmd.class.driver
  80        log_prefix = 'pmd.' + class
  81    endif
  82
  83    foreach drv:drivers
  84        drv_path = join_paths(class, drv)
  85
  86        # set up empty variables used for build
  87        build = true # set to false to disable, e.g. missing deps
  88        reason = '<unknown reason>' # set if build == false to explain
  89        name = drv
  90        sources = []
  91        headers = []
  92        objs = []
  93        cflags = default_cflags
  94        includes = [include_directories(drv_path)]
  95        # set up internal deps. Drivers can append/override as necessary
  96        deps = std_deps
  97        # ext_deps: Stores external library dependency got
  98        # using dependency() (preferred) or find_library().
  99        # For the find_library() case (but not with dependency()) we also
 100        # need to specify the "-l" flags in pkgconfig_extra_libs variable
 101        # too, so that it can be reflected in the pkgconfig output for
 102        # static builds.
 103        ext_deps = []
 104        pkgconfig_extra_libs = []
 105        testpmd_sources = []
 106
 107        if not enable_drivers.contains(drv_path)
 108            build = false
 109            reason = 'not in enabled drivers build config'
 110        elif disable_drivers.contains(drv_path)
 111            if always_enable.contains(drv_path)
 112                message('Driver @0@ cannot be disabled, not disabling.'.format(drv_path))
 113            else
 114                build = false
 115                reason = 'explicitly disabled via build config'
 116            endif
 117        endif
 118
 119        if build
 120            # pull in driver directory which should update all the local variables
 121            subdir(drv_path)
 122
 123            # get dependency objs from strings
 124            shared_deps = ext_deps
 125            static_deps = ext_deps
 126            foreach d:deps
 127                if not build
 128                    break
 129                endif
 130                if not is_variable('shared_rte_' + d)
 131                    build = false
 132                    reason = 'missing internal dependency, "@0@"'.format(d)
 133                    message('Disabling @1@ [@2@]: missing internal dependency "@0@"'
 134                            .format(d, name, 'drivers/' + drv_path))
 135                else
 136                    shared_deps += [get_variable('shared_rte_' + d)]
 137                    static_deps += [get_variable('static_rte_' + d)]
 138                endif
 139            endforeach
 140        endif
 141
 142        if not build
 143            # some driver directories are placeholders which
 144            # are never built, so we allow suppression of the
 145            # component disable printout in those cases
 146            if reason != ''
 147                dpdk_drvs_disabled += drv_path
 148                set_variable(drv_path.underscorify() + '_disable_reason', reason)
 149            endif
 150            continue
 151        endif
 152
 153        enabled_drivers += name
 154        lib_name = '_'.join(['rte', class, name])
 155        cflags += '-DRTE_LOG_DEFAULT_LOGTYPE=' + '.'.join([log_prefix, name])
 156        dpdk_conf.set(lib_name.to_upper(), 1)
 157
 158        dpdk_extra_ldflags += pkgconfig_extra_libs
 159
 160        install_headers(headers)
 161
 162        # generate pmdinfo sources by building a temporary
 163        # lib and then running pmdinfogen on the contents of
 164        # that lib. The final lib reuses the object files and
 165        # adds in the new source file.
 166        out_filename = lib_name + '.pmd.c'
 167        tmp_lib = static_library('tmp_' + lib_name, sources,
 168                include_directories: includes,
 169                dependencies: static_deps,
 170                c_args: cflags)
 171        objs += tmp_lib.extract_all_objects(recursive: true)
 172        sources = custom_target(out_filename,
 173                command: [pmdinfo, tmp_lib.full_path(), '@OUTPUT@', pmdinfogen],
 174                output: out_filename,
 175                depends: [tmp_lib])
 176
 177        # now build the static driver
 178        static_lib = static_library(lib_name,
 179                sources,
 180                objects: objs,
 181                include_directories: includes,
 182                dependencies: static_deps,
 183                c_args: cflags,
 184                install: true)
 185
 186        # now build the shared driver
 187        version_map = '@0@/@1@/version.map'.format(meson.current_source_dir(), drv_path)
 188        implib = 'lib' + lib_name + '.dll.a'
 189
 190        def_file = custom_target(lib_name + '_def',
 191                command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
 192                input: version_map,
 193                output: '@0@_exports.def'.format(lib_name))
 194
 195        mingw_map = custom_target(lib_name + '_mingw',
 196                command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
 197                input: version_map,
 198                output: '@0@_mingw.map'.format(lib_name))
 199
 200        lk_deps = [version_map, def_file, mingw_map]
 201        if is_windows
 202            if is_ms_linker
 203                lk_args = ['-Wl,/def:' + def_file.full_path()]
 204                if meson.version().version_compare('<0.54.0')
 205                    lk_args += ['-Wl,/implib:drivers\\' + implib]
 206                endif
 207            else
 208                lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]
 209            endif
 210        else
 211            lk_args = ['-Wl,--version-script=' + version_map]
 212            if developer_mode
 213                # on unix systems check the output of the
 214                # check-symbols.sh script, using it as a
 215                # dependency of the .so build
 216                lk_deps += custom_target(lib_name + '.sym_chk',
 217                        command: [check_symbols, version_map, '@INPUT@'],
 218                        capture: true,
 219                        input: static_lib,
 220                        output: lib_name + '.sym_chk')
 221            endif
 222        endif
 223
 224        shared_lib = shared_library(lib_name, sources,
 225                objects: objs,
 226                include_directories: includes,
 227                dependencies: shared_deps,
 228                c_args: cflags,
 229                link_args: lk_args,
 230                link_depends: lk_deps,
 231                version: abi_version,
 232                soversion: so_version,
 233                install: true,
 234                install_dir: driver_install_path)
 235
 236        # create a dependency object and add it to the global dictionary so
 237        # testpmd or other built-in apps can find it if necessary
 238        shared_dep = declare_dependency(link_with: shared_lib,
 239                include_directories: includes,
 240                dependencies: shared_deps)
 241        static_dep = declare_dependency(
 242                include_directories: includes,
 243                dependencies: static_deps)
 244
 245        dpdk_drivers += static_lib
 246
 247        set_variable('shared_@0@'.format(lib_name), shared_dep)
 248        set_variable('static_@0@'.format(lib_name), static_dep)
 249        # for drivers, we only need to add dependency objects for static libs,
 250        # shared lib drivers are not linked in
 251        dpdk_static_lib_deps += static_dep
 252
 253        dependency_name = ''.join(lib_name.split('rte_'))
 254        if testpmd_sources.length() != 0
 255            testpmd_drivers_sources += testpmd_sources
 256            testpmd_drivers_deps += dependency_name
 257        endif
 258        if developer_mode
 259            message('drivers/@0@: Defining dependency "@1@"'.format(
 260                    drv_path, dependency_name))
 261        endif
 262    endforeach
 263
 264    set_variable(class + '_drivers', enabled_drivers)
 265endforeach
 266