build: add internal tag check

Add checks during build to ensure that all symbols in the INTERNAL
version map section have __internal tags on their definitions, and
enable the warnings needed to announce their use.

Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
Signed-off-by: David Marchand <david.marchand@redhat.com>
This commit is contained in:
Haiyue Wang 2020-04-25 18:56:17 +08:00 committed by David Marchand
parent 2d148778d2
commit 4c82473412
6 changed files with 57 additions and 26 deletions

View file

@ -153,7 +153,7 @@ F: devtools/libabigail.abignore
F: devtools/update-abi.sh
F: devtools/update_version_map_abi.py
F: devtools/validate-abi.sh
F: buildtools/check-experimental-syms.sh
F: buildtools/check-symbols.sh
F: buildtools/map-list-symbol.sh
Driver information

View file

@ -54,4 +54,35 @@ do
}
done
for SYM in `$LIST_SYMBOL -S INTERNAL $MAPFILE |cut -d ' ' -f 3`
do
if grep -q "\.text.*[[:space:]]$SYM$" $DUMPFILE &&
! grep -q "\.text\.internal.*[[:space:]]$SYM$" $DUMPFILE
then
cat >&2 <<- END_OF_MESSAGE
$SYM is not flagged as internal
but is listed in version map
Please add __rte_internal to the definition of $SYM
END_OF_MESSAGE
ret=1
fi
done
# Filter out symbols suffixed with a . for icc
for SYM in `awk '{
if ($2 != "l" && $4 == ".text.internal" && !($NF ~ /\.$/)) {
print $NF
}
}' $DUMPFILE`
do
$LIST_SYMBOL -S INTERNAL -s $SYM -q $MAPFILE || {
cat >&2 <<- END_OF_MESSAGE
$SYM is flagged as internal
but is not listed in version map
Please add $SYM to the version map
END_OF_MESSAGE
ret=1
}
done
exit $ret

View file

@ -6,7 +6,7 @@ subdir('pmdinfogen')
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_experimental_syms = find_program('check-experimental-syms.sh')
check_symbols = find_program('check-symbols.sh')
ldflags_ibverbs_static = find_program('options-ibverbs-static.sh')
# set up map-to-def script using python, either built-in or external
@ -20,4 +20,4 @@ map_to_def_cmd = py3 + files('map_to_def.py')
sphinx_wrapper = py3 + files('call-sphinx-build.py')
# stable ABI always starts with "DPDK_"
is_experimental_cmd = [find_program('grep', 'findstr'), '^DPDK_']
is_stable_cmd = [find_program('grep', 'findstr'), '^DPDK_']

View file

@ -131,15 +131,15 @@ foreach class:dpdk_driver_classes
meson.current_source_dir(),
drv_path, lib_name)
is_experimental = run_command(is_experimental_cmd,
files(version_map)).returncode()
is_stable = run_command(is_stable_cmd,
files(version_map)).returncode() == 0
if is_experimental != 0
lib_version = experimental_abi_version
so_version = experimental_so_version
else
if is_stable
lib_version = abi_version
so_version = stable_so_version
else
lib_version = experimental_abi_version
so_version = experimental_so_version
endif
# now build the static driver
@ -168,14 +168,14 @@ foreach class:dpdk_driver_classes
else
lk_args = ['-Wl,--version-script=' + version_map]
# on unix systems check the output of the
# experimental syms script, using it as a
# check-symbols.sh script, using it as a
# dependency of the .so build
lk_deps += custom_target(lib_name + '.exp_chk',
command: [check_experimental_syms,
lk_deps += custom_target(lib_name + '.sym_chk',
command: [check_symbols,
version_map, '@INPUT@'],
capture: true,
input: static_lib,
output: lib_name + '.exp_chk')
output: lib_name + '.sym_chk')
endif
shared_lib = shared_library(lib_name,

View file

@ -109,15 +109,15 @@ foreach l:libraries
version_map = '@0@/@1@/rte_@2@_version.map'.format(
meson.current_source_dir(), dir_name, name)
is_experimental = run_command(is_experimental_cmd,
files(version_map)).returncode()
is_stable = run_command(is_stable_cmd,
files(version_map)).returncode() == 0
if is_experimental != 0
lib_version = experimental_abi_version
so_version = experimental_so_version
else
if is_stable
lib_version = abi_version
so_version = stable_so_version
else
lib_version = experimental_abi_version
so_version = experimental_so_version
endif
# first build static lib
@ -160,14 +160,14 @@ foreach l:libraries
lk_deps = [version_map, def_file]
if not is_windows
# on unix systems check the output of the
# experimental syms script, using it as a
# check-symbols.sh script, using it as a
# dependency of the .so build
lk_deps += custom_target(name + '.exp_chk',
command: [check_experimental_syms,
lk_deps += custom_target(name + '.sym_chk',
command: [check_symbols,
version_map, '@INPUT@'],
capture: true,
input: static_lib,
output: name + '.exp_chk')
output: name + '.sym_chk')
endif
shared_lib = shared_library(libname,

View file

@ -56,8 +56,8 @@ C_TO_O = $(CC) -Wp,-MD,$(call obj2dep,$(@)).tmp $(CPPFLAGS) $(CFLAGS) \
C_TO_O_STR = $(subst ','\'',$(C_TO_O)) #'# fix syntax highlight
C_TO_O_DISP = $(if $(V),"$(C_TO_O_STR)"," CC $(@)")
endif
EXPERIMENTAL_CHECK = $(RTE_SDK)/buildtools/check-experimental-syms.sh
CHECK_EXPERIMENTAL = $(EXPERIMENTAL_CHECK) $(SRCDIR)/$(EXPORT_MAP) $@
CHECK_SYMBOLS_SCRIPT = $(RTE_SDK)/buildtools/check-symbols.sh
CHECK_SYMBOLS = $(CHECK_SYMBOLS_SCRIPT) $(SRCDIR)/$(EXPORT_MAP) $@
PMDINFO_GEN = $(RTE_SDK_BIN)/app/dpdk-pmdinfogen $@ $@.pmd.c
PMDINFO_CC = $(CC) $(CPPFLAGS) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@.pmd.o $@.pmd.c
@ -75,7 +75,7 @@ C_TO_O_DO = @set -e; \
echo $(C_TO_O_DISP); \
$(C_TO_O) && \
$(PMDINFO_TO_O) && \
$(CHECK_EXPERIMENTAL) && \
$(CHECK_SYMBOLS) && \
echo $(C_TO_O_CMD) > $(call obj2cmd,$(@)) && \
sed 's,'$@':,dep_'$@' =,' $(call obj2dep,$(@)).tmp > $(call obj2dep,$(@)) && \
rm -f $(call obj2dep,$(@)).tmp