[dpdk-dev] [PATCH] devtools/test-meson-builds: allow custom set of examples

Bruce Richardson bruce.richardson at intel.com
Tue Nov 10 14:19:19 CET 2020


On Tue, Nov 10, 2020 at 02:04:21PM +0100, Thomas Monjalon wrote:
> 10/11/2020 12:34, Bruce Richardson:
> > On Tue, Nov 10, 2020 at 12:25:13PM +0100, Thomas Monjalon wrote:
> > > 10/11/2020 11:08, Bruce Richardson:
> > > > On Mon, Nov 09, 2020 at 08:26:10PM +0100, Thomas Monjalon wrote:
> > > > > 09/11/2020 19:02, Bruce Richardson:
> > > > > > On Mon, Nov 09, 2020 at 06:09:51PM +0100, Thomas Monjalon wrote:
> > > > > > > 27/10/2020 18:38, Bruce Richardson:
> > > > > > > > To test the installation process of DPDK using "ninja install"
> > > > > > > > test-meson-builds.sh builds a subset of the examples using "make".
> > > > > > > > To allow more flexibility for people testing, allow the set of
> > > > > > > > examples chosen for this make test to be overridden using variable
> > > > > > > > "DPDK_BUILD_TEST_EXAMPLES" in the environment.
> > > > > > > > 
> > > > > > > > Since a number of example apps link against drivers directly even
> > > > > > > > for shared builds, we need to ensure that LD_LIBRARY_PATH points to
> > > > > > > > the main DPDK lib folder so any dependencies of those drivers can
> > > > > > > > be found e.g. that the PCI/vdev bus driver .so is found. [All
> > > > > > > > drivers are symlinked from drivers dir back to lib dir on install,
> > > > > > > > so only one dir rather than two is needed in the path.]
> > > > > > > [...]
> > > > > > > > +libdir=$(dirname $(find $DESTDIR -name librte_eal.so)) +export
> > > > > > > > LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH
> > > > > > > 
> > > > > > > I don't get why libdir is required for some examples, and not for
> > > > > > > others? The pkg-config file is not enough?
> > > > > > > 
> > > > > > 
> > > > > > It's only needed for examples that link against drivers directly. 
> > > > > > 
> > > > > > I believe it's needed in those cases, because app linker flags
> > > > > > (including e.g. -lrte_pmd_bond) occur before the pkg-config flags,
> > > > > > which means that the linker at that point does not have the path to
> > > > > > find the dependencies of the driver. [In a normal build, this wouldn't
> > > > > > be necessary because the library directory would be a standard path]
> > > > > 
> > > > > If it's just a matter of ordering, it would be a better example to fix
> > > > > the ordering in the Makefile, isn't it?
> > > > > 
> > > > 
> > > > I thought about that, but it seems strange to have the DPDK linker flags
> > > > appear before the application specific flags. The general style is to have
> > > > the apps own linker flags apply first, and then the list of dependencies,
> > > > so that any app linker flags take precedence. The other option is to have
> > > > two separate LDFLAG variables for the app, one for before pkg-config flags
> > > > and the other afterwards, but that is an untidy solution.
> > > > 
> > > > Therefore, I think it's better to keep the ordering in the examples as-is
> > > > and just set the library path in the script. It's only a single extra
> > > > assignment that is necessary because we are installing to a non-standard
> > > > path using DESTDIR.
> > > 
> > > It is OK to add LD_LIBRARY_PATH in test-meson-builds.sh because
> > > DPDK is "installed" with a DESTDIR prefix.
> > > 
> > > But this change is unrelated to test more examples,
> > > it is a general fix for examples compilation.
> > > The thing I'm missing, as I said above,
> > > "why libdir is required for some examples, and not for others?"
> > > I feel something wrong made linking work where it should not.
> > > 
> > 
> > As I explained above, libdir is required for examples that link directly
> > against DPDK drivers in shared builds. There are only a few examples that
> > do so, which is why the majority worked fine, and why this was not needed
> > before.
> 
> Sorry I don't understand how we link other libraries without LD_LIBRARY_PATH.
> Where the library path was taken from before this change?
> 

pkg-config outputs the library path via -L flag for all the other
libraries, which is why they are picked up.  Right now the flags passed are
(in the case of the bonding example app):

	LDFLAGS += -lrte_net_bond
	...
	LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
	...
	build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
		$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)

which resolves to (roughly): 
"-lrte_net_bond -L/path/to/dpdk/libs -lrte_ethdev ..."

This means that all the regular DPDK libs are found based off the "-L"
flag, but the rte_net_bond and its dependencies are not as they occur
before the -L flag.

The alternative, as you suggested previously, is to move the -lrte_net_bond
to the end of the list, but that strikes me as less elegant as the LDFLAGS
for the app need to be split into two.

A third choice is to modify the makefiles to use pkg-config "--libs-only-L"
flag to put in the relevant pkg-config path flag before the rte_net_bond.
(However, I have yet to check that all versions of pkg-config support this
flag, since we've been bitten in the past of using flags supported by only
some versions on some distros!)

	LDFLAGS += $(shell $(PKGCONF) --libs-only-L libdpdk) -lrte_net_bond

Overall, given we are looking at a test script where we install to a
non-standard location, putting that location in the LD_LIBRARY_PATH seems
the easiest, sane solution. It also most closely matches real-world use,
where if one installs DPDK to a novel location, the path to the library
folder does need to be set somewhere for the runtime loader to find the
libs.

/Bruce


More information about the dev mailing list