drivers: relax dependency order
authorThomas Monjalon <thomas@monjalon.net>
Mon, 27 Jul 2020 17:47:08 +0000 (20:47 +0300)
committerThomas Monjalon <thomas@monjalon.net>
Tue, 28 Jul 2020 16:28:47 +0000 (18:28 +0200)
Drivers dependencies are evaluated in the order defined per their parent
directory (also called class). This strict ordering prevents from
having pairs of drivers from two classes with different dependency
ordering. For example, if the mlx5 common code depends on the pci bus
driver, while the dpaax common code is itself a dependency of the dpaa
bus driver.  Having a strict ordering between directories bus and common
is too restrictive, as processing either common drivers or bus drivers
first leads us to missing dependencies in this scenario.

This patch makes it possible to have a more fine-grain directory list,
adding a specific driver sub-directory in the top-level drivers
subdirectory list. In this case, the isolated driver must also be removed
from its class list, and the per-class variables must be duplicated in
the isolated driver, because the call "subdir(class)" is skipped in the
isolated driver case.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: David Marchand <david.marchand@redhat.com>
drivers/meson.build

index e2aeba9..0389574 100644 (file)
@@ -1,8 +1,8 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017-2019 Intel Corporation
 
-# Defines the order in which the drivers are buit.
-dpdk_driver_classes = [
+# Defines the order of dependencies evaluation
+subdirs = [
        'common',
        'bus',
        'mempool', # depends on common and bus.
@@ -27,7 +27,7 @@ if cc.has_argument('-Wno-format-truncation')
        default_cflags += '-Wno-format-truncation'
 endif
 
-foreach class:dpdk_driver_classes
+foreach subpath:subdirs
        drivers = []
        std_deps = []
        config_flag_fmt = '' # format string used to set the value in dpdk_conf
@@ -35,8 +35,22 @@ foreach class:dpdk_driver_classes
                             # the library, the dependency and to find the
                             # version file for linking
 
-       subdir(class)
-       class_drivers = []
+       # subpath can be either "class" or "class/driver"
+       if subpath.contains('/')
+               driver_path = subpath.split('/')
+               class = driver_path[0]
+               drivers += driver_path[1]
+       else
+               class = subpath
+               subdir(class)
+       endif
+
+       # save class name on first occurrence
+       if not dpdk_driver_classes.contains(class)
+               dpdk_driver_classes += class
+       endif
+       # get already enabled drivers of the same class
+       enabled_drivers = get_variable(class + '_drivers', [])
 
        foreach drv:drivers
                drv_path = join_paths(class, drv)
@@ -96,7 +110,7 @@ foreach class:dpdk_driver_classes
                                                '_disable_reason', reason)
                        endif
                else
-                       class_drivers += name
+                       enabled_drivers += name
 
                        if fmt_name == ''
                                fmt_name = name
@@ -203,5 +217,5 @@ foreach class:dpdk_driver_classes
                endif # build
        endforeach
 
-       set_variable(class + '_drivers', class_drivers)
+       set_variable(class + '_drivers', enabled_drivers)
 endforeach