From e6e9730c7066246856546563c0f5dcf5be10372d Mon Sep 17 00:00:00 2001 From: Dmitry Kozlyuk Date: Fri, 8 Jan 2021 05:47:22 +0300 Subject: [PATCH] buildtools: support object file extraction for Windows clang archiver tool is llvm-ar on Windows and ar on other platforms. MinGW always uses ar. Replace shell script (Unix-only) that calls ar with a Python script (OS-independent) that calls an appropriate archiver tool selected at configuration time. Move the logic not to generate empty sources into pmdinfogen. Signed-off-by: Dmitry Kozlyuk --- MAINTAINERS | 2 +- buildtools/gen-pmdinfo-cfile.py | 19 +++++++++++++++++++ buildtools/gen-pmdinfo-cfile.sh | 14 -------------- buildtools/meson.build | 10 ++++++++-- buildtools/pmdinfogen.py | 7 +++++++ 5 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 buildtools/gen-pmdinfo-cfile.py delete mode 100755 buildtools/gen-pmdinfo-cfile.sh diff --git a/MAINTAINERS b/MAINTAINERS index 2fa9372074..1a12916f56 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -99,7 +99,6 @@ F: meson.build F: meson_options.txt F: config/ F: buildtools/call-sphinx-build.py -F: buildtools/gen-pmdinfo-cfile.sh F: buildtools/list-dir-globs.py F: buildtools/pkg-config/ F: buildtools/symlink-drivers-solibs.sh @@ -135,6 +134,7 @@ Driver information M: Neil Horman M: Dmitry Kozlyuk F: buildtools/coff.py +F: buildtools/gen-pmdinfo-cfile.py F: buildtools/pmdinfogen.py F: usertools/dpdk-pmdinfo.py F: doc/guides/tools/pmdinfo.rst diff --git a/buildtools/gen-pmdinfo-cfile.py b/buildtools/gen-pmdinfo-cfile.py new file mode 100644 index 0000000000..f1f289ffee --- /dev/null +++ b/buildtools/gen-pmdinfo-cfile.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2020 Dmitry Kozlyuk + +import os +import subprocess +import sys +import tempfile + +_, ar, archive, output, *pmdinfogen = sys.argv +with tempfile.TemporaryDirectory() as temp: + proc = subprocess.run( + # Don't use "ar p", because its output is corrupted on Windows. + [ar, "xv", os.path.abspath(archive)], capture_output=True, check=True, cwd=temp + ) + lines = proc.stdout.decode().splitlines() + names = [line[len("x - ") :] for line in lines] + paths = [os.path.join(temp, name) for name in names] + subprocess.run(pmdinfogen + paths + [output], check=True) diff --git a/buildtools/gen-pmdinfo-cfile.sh b/buildtools/gen-pmdinfo-cfile.sh deleted file mode 100755 index 109ee461e8..0000000000 --- a/buildtools/gen-pmdinfo-cfile.sh +++ /dev/null @@ -1,14 +0,0 @@ -#! /bin/sh -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -arfile=$1 -output=$2 -shift 2 -pmdinfogen=$* - -# The generated file must not be empty if compiled in pedantic mode -echo 'static __attribute__((unused)) const char *generator = "'$0'";' > $output -for ofile in `ar t $arfile` ; do - ar p $arfile $ofile | $pmdinfogen - - >> $output -done diff --git a/buildtools/meson.build b/buildtools/meson.build index 23cefd4beb..0a2e91a7b9 100644 --- a/buildtools/meson.build +++ b/buildtools/meson.build @@ -2,7 +2,6 @@ # Copyright(c) 2017-2019 Intel Corporation pkgconf = find_program('pkg-config', 'pkgconf', required: false) -pmdinfo = find_program('gen-pmdinfo-cfile.sh') list_dir_globs = find_program('list-dir-globs.py') check_symbols = find_program('check-symbols.sh') ldflags_ibverbs_static = find_program('options-ibverbs-static.sh') @@ -18,11 +17,18 @@ endif map_to_win_cmd = py3 + files('map_to_win.py') sphinx_wrapper = py3 + files('call-sphinx-build.py') -# select object file format +# select library and object file format +pmdinfo = py3 + files('gen-pmdinfo-cfile.py') pmdinfogen = py3 + files('pmdinfogen.py') if host_machine.system() == 'windows' + if cc.get_id() == 'gcc' + pmdinfo += 'ar' + else + pmdinfo += 'llvm-ar' + endif pmdinfogen += 'coff' else + pmdinfo += 'ar' pmdinfogen += 'elf' endif diff --git a/buildtools/pmdinfogen.py b/buildtools/pmdinfogen.py index 965c08945e..893a6c5717 100755 --- a/buildtools/pmdinfogen.py +++ b/buildtools/pmdinfogen.py @@ -233,6 +233,12 @@ def open_output(path): return open(path, "w") +def write_header(output): + output.write( + "static __attribute__((unused)) const char *generator = \"%s\";\n" % sys.argv[0] + ) + + def main(): args = parse_args() if args.input.count('-') > 1: @@ -241,6 +247,7 @@ def main(): raise Exception("elftools module not found") output = open_output(args.output) + write_header(output) for path in args.input: image = load_image(args.format, path) drivers = load_drivers(image) -- 2.20.1