From: Thomas Monjalon <tho...@monjalon.net>

Drivers dependencies are evaluated in the order defined per
their parent directory (also called class).
This strict ordering prevent from having 2 different drivers
of the same class with different dependencies ordering.
This problem occurs if drivers/common/mlx5 depends on drivers/bus/pci,
while drivers/bus/dpaa depends on drivers/common/dpaax.
Having a strict ordering between directories bus and common
is too much restrictive.

That's why it is made possible to have a more fine-grain directory list,
adding a driver sub-directory in the list.
In this case, the isolated driver must be removed from its class list,
and added directly in drivers/meson.build.
Also, 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 <tho...@monjalon.net>
---
 drivers/meson.build | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/drivers/meson.build b/drivers/meson.build
index e2aeba931..e6d0409aa 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -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 occurence
+       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
-- 
2.25.4

Reply via email to