Skip to content

Commit

Permalink
buildtools: externally check exported headers
Browse files Browse the repository at this point in the history
At the moment, the headers check is run "internally", iow with
compilation flags and include path coming from the meson components.

One issue is that both internal and public headers are usually stored
in a single directory in the DPDK components.
If a lib/foo library exports a header rte_foo.h (iow rte_foo.h is part
of the headers list in lib/foo/meson.build) and this rte_foo.h includes
an internal header foo_internal.h, then the headers check won't detect
such an issue as rte_foo.h is compiled with -Ilib/foo.

Add an additional check which relies on a DPDK installed in a staging
directory.
This check then compiles every header against the staging directory.

Signed-off-by: David Marchand <[email protected]>
  • Loading branch information
david-marchand committed Nov 25, 2024
1 parent 0b5f5a8 commit 4a28a7e
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 5 deletions.
7 changes: 4 additions & 3 deletions .ci/linux-build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,6 @@ OPTS="$OPTS -Ddefault_library=$DEF_LIB"
OPTS="$OPTS -Dbuildtype=$buildtype"
if [ "$STDATOMIC" = "true" ]; then
OPTS="$OPTS -Denable_stdatomic=true"
else
OPTS="$OPTS -Dcheck_includes=true"
fi
if [ "$MINI" = "true" ]; then
OPTS="$OPTS -Denable_drivers=net/null"
Expand Down Expand Up @@ -178,13 +176,16 @@ if [ "$RUN_TESTS" = "true" ]; then
[ "$failed" != "true" ]
fi

# Test examples compilation with an installed dpdk
# Test headers and examples compilation with an installed dpdk
if [ "$BUILD_EXAMPLES" = "true" ]; then
[ -d install ] || DESTDIR=$(pwd)/install meson install -C build
export LD_LIBRARY_PATH=$(dirname $(find $(pwd)/install -name librte_eal.so)):$LD_LIBRARY_PATH
export PATH=$(dirname $(find $(pwd)/install -name dpdk-devbind.py)):$PATH
export PKG_CONFIG_PATH=$(dirname $(find $(pwd)/install -name libdpdk.pc)):$PKG_CONFIG_PATH
export PKGCONF="pkg-config --define-prefix"

make -C buildtools/chkincs O=build/buildtools/chkincs

find build/examples -maxdepth 1 -type f -name "dpdk-*" |
while read target; do
target=${target%%:*}
Expand Down
101 changes: 101 additions & 0 deletions buildtools/chkincs/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2024 Red Hat, Inc.

ifeq ($(V),)
Q ?= @
else
Q =
endif

O ?= build

PKGCONF ?= pkg-config

ifneq ($(shell $(PKGCONF) --exists libdpdk && echo 0),0)
$(error "no installation of DPDK found")
endif

ifeq ($(I),)

.PHONY: headers_list
.ONESHELL:
headers_list:
$(Q)for dir in $$($(PKGCONF) --cflags-only-I libdpdk); do
dir=$${dir##-I}
[ -e $$dir/rte_build_config.h ] || continue
$(MAKE) I="$$dir" O="$(O)"
break
done
else

HEADERS := $(shell find $(I) -name "*.h" | grep -vE $(I)'/(generic|internal)/')
SRCS := $(patsubst $(I)/%.h, $(O)/%.c, $(HEADERS))
.PRECIOUS: $(SRCS)

PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null)
CFLAGS = $(shell $(PKGCONF) --cflags libdpdk)
LDFLAGS = $(shell $(PKGCONF) --libs libdpdk)

all: $(O)/chkincs $(O)/chkincs-exp $(O)/chkincs-all

OBJS := $(O)/main.o $(patsubst %.c, %.o, $(SRCS))
OBJS_EXP := $(O)/main.o $(patsubst %.c, %_exp.o, $(SRCS))
OBJS_ALL := $(O)/main.o $(patsubst %.c, %_all.o, $(SRCS))

$(O):
$(Q)mkdir -p $(O)

$(O)/%.c: $(I)/%.h $(O) gen_c_file_for_header.py Makefile
$(Q)python3 gen_c_file_for_header.py $< $@

$(O)/chkincs: $(OBJS)
$(Q)$(CC) $(LDFLAGS) -o $@ $^

$(O)/chkincs-exp: $(OBJS_EXP)
$(Q)$(CC) $(LDFLAGS) -o $@ $^

$(O)/chkincs-all: $(OBJS_ALL)
$(Q)$(CC) $(LDFLAGS) -o $@ $^

$(O)/main.o: main.c $(O) Makefile $(PC_FILE)
$(Q)$(CC) $(CFLAGS) -o $@ -c $<

$(O)/%.o: $(O)/%.c Makefile $(PC_FILE)
$(Q)$(CC) $(CFLAGS) -o $@ -c $<

$(O)/%_exp.o: $(O)/%.c Makefile $(PC_FILE)
$(Q)$(CC) $(CFLAGS) -DALLOW_EXPERIMENTAL_API -o $@ -c $<

$(O)/%_all.o: $(O)/%.c Makefile $(PC_FILE)
$(Q)$(CC) $(CFLAGS) -DALLOW_EXPERIMENTAL_API -DALLOW_INTERNAL_API -o $@ -c $<

CXXFLAGS = $(shell $(PKGCONF) --cflags libdpdk)

all: $(O)/chkincs-cpp $(O)/chkincs-cpp-exp $(O)/chkincs-cpp-all

OBJS_CPP := $(O)/main_cpp.o $(patsubst %.c, %.cpp.o, $(SRCS))
OBJS_CPP_EXP := $(O)/main_cpp.o $(patsubst %.c, %_exp.cpp.o, $(SRCS))
OBJS_CPP_ALL := $(O)/main_cpp.o $(patsubst %.c, %_all.cpp.o, $(SRCS))

$(O)/chkincs-cpp: $(OBJS_CPP)
$(Q)$(CXX) $(LDFLAGS) -o $@ $^

$(O)/chkincs-cpp-exp: $(OBJS_CPP_EXP)
$(Q)$(CXX) $(LDFLAGS) -o $@ $^

$(O)/chkincs-cpp-all: $(OBJS_CPP_ALL)
$(Q)$(CXX) $(LDFLAGS) -o $@ $^

$(O)/main_cpp.o: main.c $(O) Makefile $(PC_FILE)
$(Q)$(CXX) $(CXXFLAGS) -o $@ -c $<

$(O)/%.cpp.o: $(O)/%.c Makefile $(PC_FILE)
$(Q)$(CXX) $(CXXFLAGS) -o $@ -c $<

$(O)/%_exp.cpp.o: $(O)/%.c Makefile $(PC_FILE)
$(Q)$(CXX) $(CXXFLAGS) -DALLOW_EXPERIMENTAL_API -o $@ -c $<

$(O)/%_all.cpp.o: $(O)/%.c Makefile $(PC_FILE)
$(Q)$(CXX) $(CXXFLAGS) -DALLOW_EXPERIMENTAL_API -DALLOW_INTERNAL_API -o $@ -c $<

endif
6 changes: 4 additions & 2 deletions devtools/test-meson-builds.sh
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ generic_isa='nehalem'
if ! check_cc_flags "-march=$generic_isa" ; then
generic_isa='corei7'
fi
build build-x86-generic cc skipABI -Dcheck_includes=true \
build build-x86-generic cc skipABI \
-Dlibdir=lib -Dcpu_instruction_set=$generic_isa $use_shared

# 32-bit with default compiler
Expand Down Expand Up @@ -318,9 +318,11 @@ if [ "$examples" = 'all' ]; then
done | sort -u |
tr '\n' ' ')
fi
# if pkg-config defines the necessary flags, test building some examples
# if pkg-config defines the necessary flags, check headers and test building some examples
if pkg-config --define-prefix libdpdk >/dev/null 2>&1; then
export PKGCONF="pkg-config --define-prefix"
echo "## Checking exported headers"
$MAKE -C buildtools/chkincs O=$build_path/buildtools/chkincs
for example in $examples; do
echo "## Building $example"
[ $example = helloworld ] && static=static || static= # save disk space
Expand Down

0 comments on commit 4a28a7e

Please sign in to comment.