patches for DPDK stable branches
 help / color / mirror / Atom feed
* [dpdk-stable] [PATCH] build: fix symlink of drivers for Windows
@ 2021-04-01 12:27 Nick Connolly
  2021-04-04  0:00 ` Dmitry Kozlyuk
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Nick Connolly @ 2021-04-01 12:27 UTC (permalink / raw)
  To: Bruce Richardson, Ranjit Menon, Nick Connolly
  Cc: dev, dmitry.kozliuk, navasile, dmitrym, pallavi.kadam, stable

The symlink-drivers-solibs.sh script was disabled as part of 'install'
for Windows because there is no support for shell scripts. However,
this means that driver related DLLs are not present in the installed
'libdir' directory.

Replace the shell script with a python script to perform the symbolic
linking to improve cross platform support. On Linux the functionality
is unchanged.

On Windows, symbolic links are somewhat problematic since the
SeCreateSymbolicLinkPrivilege is required to be able to create them.
In addition, different cross-compilation environments handle symbolic
links differently, e.g. WSL, Msys2, Cygwin. Rather than trying to
distinguish these scenarios, the python script will perform a file copy
for any Windows specific names.

On Windows, the shared library outputs have different names depending
upon which toolset has been used to build them. The script currently
handles Clang and GCC.

Fixes: 5c7d86948764 ("build: fix install on Windows")
Cc: stable@dpdk.org
Signed-off-by: Nick Connolly <nick.connolly@mayadata.io>
---
 buildtools/symlink-drivers-solibs.py | 49 ++++++++++++++++++++++++++++
 buildtools/symlink-drivers-solibs.sh | 13 --------
 config/meson.build                   |  7 ++--
 3 files changed, 51 insertions(+), 18 deletions(-)
 create mode 100644 buildtools/symlink-drivers-solibs.py
 delete mode 100644 buildtools/symlink-drivers-solibs.sh

diff --git a/buildtools/symlink-drivers-solibs.py b/buildtools/symlink-drivers-solibs.py
new file mode 100644
index 000000000..5627ddd9d
--- /dev/null
+++ b/buildtools/symlink-drivers-solibs.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 Intel Corporation
+
+import os
+import sys
+import glob
+import shutil
+
+# post-install script for meson/ninja builds to symlink the PMDs stored in
+# $libdir/dpdk/pmds-*/ to $libdir. This is needed as some PMDs depend on
+# others, e.g. PCI device PMDs depending on the PCI bus driver.
+
+# parameters to script are paths relative to install prefix:
+# 1. directory for installed regular libs e.g. lib64
+# 2. subdirectory of libdir where the pmds are
+# 3. directory for installed regular binaries e.g. bin
+
+os.chdir(os.environ['MESON_INSTALL_DESTDIR_PREFIX'])
+
+lib_dir = sys.argv[1]
+pmd_subdir = sys.argv[2]
+bin_dir = sys.argv[3]
+pmd_dir = os.path.join(lib_dir, pmd_subdir)
+
+# copy Windows PMDs to avoid any issues with symlinks since the
+# build could be a cross-compilation under WSL, Msys or Cygnus.
+# the filenames are dependent upon the specific toolchain in use.
+
+def copy_pmd_files(pattern, to_dir):
+	for file in glob.glob(os.path.join(pmd_dir, pattern)):
+		to = os.path.join(to_dir, os.path.basename(file))
+		shutil.copy2(file, to)
+		print(to + ' -> ' + file)
+
+copy_pmd_files('*rte_*.dll', bin_dir)
+copy_pmd_files('*rte_*.pdb', bin_dir)
+copy_pmd_files('*rte_*.lib', lib_dir)
+copy_pmd_files('*rte_*.dll.a', lib_dir)
+
+# symlink shared objects
+
+os.chdir(lib_dir)
+for file in glob.glob(os.path.join(pmd_subdir, 'librte_*.so*')):
+	to = os.path.basename(file)
+	if os.path.exists(to):
+		os.remove(to)
+	os.symlink(file, to)
+	print(to + ' -> ' + file)
diff --git a/buildtools/symlink-drivers-solibs.sh b/buildtools/symlink-drivers-solibs.sh
deleted file mode 100644
index 42985e855..000000000
--- a/buildtools/symlink-drivers-solibs.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#! /bin/sh
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2017 Intel Corporation
-
-# post-install script for meson/ninja builds to symlink the PMDs stored in
-# $libdir/dpdk/drivers/ to $libdir. This is needed as some PMDs depend on
-# others, e.g. PCI device PMDs depending on the PCI bus driver.
-
-# parameters to script are paths relative to install prefix:
-# 1. directory for installed regular libs e.g. lib64
-# 2. subdirectory of libdir where the pmds are
-
-cd ${MESON_INSTALL_DESTDIR_PREFIX}/$1 && ln -sfv $2/librte_*.so* .
diff --git a/config/meson.build b/config/meson.build
index 66a2edcc4..c51669b7d 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -57,11 +57,8 @@ eal_pmd_path = join_paths(get_option('prefix'), driver_install_path)
 # driver .so files often depend upon the bus drivers for their connect bus,
 # e.g. ixgbe depends on librte_bus_pci. This means that the bus drivers need
 # to be in the library path, so symlink the drivers from the main lib directory.
-if not is_windows
-	meson.add_install_script('../buildtools/symlink-drivers-solibs.sh',
-			get_option('libdir'),
-			pmd_subdir_opt)
-endif
+meson.add_install_script(py3, '../buildtools/symlink-drivers-solibs.py',
+	get_option('libdir'), pmd_subdir_opt, get_option('bindir'))
 
 # set the machine type and cflags for it
 if meson.is_cross_build()
-- 
2.25.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2021-07-09 15:05 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-01 12:27 [dpdk-stable] [PATCH] build: fix symlink of drivers for Windows Nick Connolly
2021-04-04  0:00 ` Dmitry Kozlyuk
2021-04-06 10:24   ` Nick Connolly
2021-04-10  8:01 ` [dpdk-stable] [PATCH v2] " Nick Connolly
2021-04-24  0:53   ` Narcisa Ana Maria Vasile
2021-04-26 10:07 ` [dpdk-stable] [PATCH v3] " Nick Connolly
2021-05-27 17:37   ` Nick Connolly
2021-05-28  8:19     ` Bruce Richardson
2021-05-28 10:50       ` Nick Connolly
2021-05-28  8:19   ` Bruce Richardson
2021-07-09 15:05     ` Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).