Skip to content

Commit

Permalink
build: support drivers symlink on Windows
Browse files Browse the repository at this point in the history
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. Add a python script to perform the install and use
it for Windows if the version of meson supports using an external
program with add_install_script (>= 0.55.0).

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.

On Linux the functionality is unchanged, but could be replaced with the
python script once the required minimum version of meson is >= 0.55.0.

Cc: [email protected]

Signed-off-by: Nick Connolly <[email protected]>
Tested-by: Narcisa Vasile <[email protected]>
Acked-by: Narcisa Vasile <[email protected]>
Reviewed-by: Bruce Richardson <[email protected]>
  • Loading branch information
nconnolly1 authored and tmonjalo committed Jul 9, 2021
1 parent 29343b9 commit cd27047
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 0 deletions.
1 change: 1 addition & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ F: buildtools/call-sphinx-build.py
F: buildtools/list-dir-globs.py
F: buildtools/pkg-config/
F: buildtools/symlink-drivers-solibs.sh
F: buildtools/symlink-drivers-solibs.py
F: devtools/test-meson-builds.sh
F: devtools/check-meson.py

Expand Down
49 changes: 49 additions & 0 deletions buildtools/symlink-drivers-solibs.py
Original file line number Diff line number Diff line change
@@ -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)
4 changes: 4 additions & 0 deletions config/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ eal_pmd_path = join_paths(get_option('prefix'), driver_install_path)
if not is_windows
meson.add_install_script('../buildtools/symlink-drivers-solibs.sh',
get_option('libdir'), pmd_subdir_opt)
elif meson.version().version_compare('>=0.55.0')
# 0.55.0 is required to use external program with add_install_script
meson.add_install_script(py3, '../buildtools/symlink-drivers-solibs.py',
get_option('libdir'), pmd_subdir_opt, get_option('bindir'))
endif

# init disable/enable driver lists that will be populated in different places
Expand Down

0 comments on commit cd27047

Please sign in to comment.