From: Adrien Mazarguil <adrien.mazarguil@6wind.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v3 11/11] scripts: check compilation of exported header files
Date: Thu, 7 Jul 2016 17:49:33 +0200 [thread overview]
Message-ID: <6b3bd62dc0d2f50ee40bce5b5b374444b76c0548.1467905467.git.adrien.mazarguil@6wind.com> (raw)
In-Reply-To: <cover.1467905466.git.adrien.mazarguil@6wind.com>
This script checks that header files in a given directory do not miss
dependencies when included on their own, do not conflict and accept being
compiled with the strictest possible flags.
Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
---
MAINTAINERS | 1 +
scripts/check-includes.sh | 286 +++++++++++++++++++++++++++++++++++++++++
scripts/test-build.sh | 14 ++
3 files changed, 301 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index a59191e..c12db3d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -26,6 +26,7 @@ T: git://dpdk.org/dpdk
F: MAINTAINERS
F: scripts/check-maintainers.sh
F: scripts/check-git-log.sh
+F: scripts/check-includes.sh
F: scripts/checkpatches.sh
F: scripts/load-devel-config.sh
F: scripts/test-build.sh
diff --git a/scripts/check-includes.sh b/scripts/check-includes.sh
new file mode 100755
index 0000000..d65adc6
--- /dev/null
+++ b/scripts/check-includes.sh
@@ -0,0 +1,286 @@
+#!/bin/sh -e
+#
+# BSD LICENSE
+#
+# Copyright 2016 6WIND S.A.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of 6WIND S.A. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# This script checks that header files in a given directory do not miss
+# dependencies when included on their own, do not conflict and accept being
+# compiled with the strictest possible flags.
+#
+# Files are looked up in the directory provided as the first argument,
+# otherwise build/include by default.
+#
+# Recognized environment variables:
+#
+# VERBOSE=1 is the same as -v.
+#
+# QUIET=1 is the same as -q.
+#
+# SUMMARY=1 is the same as -s.
+#
+# CC, CPPFLAGS, CFLAGS, EXTRA_CPPFLAGS, EXTRA_CFLAGS, CXX, CXXFLAGS and
+# EXTRA_CXXFLAGS are taken into account.
+#
+# PEDANTIC_CFLAGS, PEDANTIC_CXXFLAGS and PEDANTIC_CPPFLAGS provide strict
+# C/C++ compilation flags.
+#
+# IGNORE contains a list of shell patterns matching files (relative to the
+# include directory) to avoid. It is set by default to known DPDK headers
+# which must not be included on their own.
+#
+# IGNORE_CXX provides additional files for C++.
+
+while getopts hqvs arg; do
+ case $arg in
+ h)
+ cat <<EOF
+usage: $0 [-h] [-q] [-v] [-s] [DIR]
+
+This script checks that header files in a given directory do not miss
+dependencies when included on their own, do not conflict and accept being
+compiled with the strictest possible flags.
+
+ -h display this help and exit
+ -q quiet mode, disable normal output
+ -v show command lines being executed
+ -s show summary
+
+With no DIR, default to build/include.
+
+Any failed header check yields a nonzero exit status.
+EOF
+ exit
+ ;;
+ q)
+ QUIET=1
+ ;;
+ v)
+ VERBOSE=1
+ ;;
+ s)
+ SUMMARY=1
+ ;;
+ *)
+ exit 1
+ ;;
+ esac
+done
+
+shift $(($OPTIND - 1))
+
+include_dir=${1:-build/include}
+
+: ${PEDANTIC_CFLAGS=-std=c99 -pedantic -Wall -Wextra -Werror}
+: ${PEDANTIC_CXXFLAGS=}
+: ${PEDANTIC_CPPFLAGS=-D_XOPEN_SOURCE=600}
+: ${CC:=cc}
+: ${CXX:=c++}
+: ${IGNORE= \
+ 'rte_atomic_32.h' \
+ 'rte_atomic_64.h' \
+ 'rte_byteorder_32.h' \
+ 'rte_byteorder_64.h' \
+ 'generic/*' \
+ 'exec-env/*' \
+}
+: ${IGNORE_CXX= \
+ 'rte_eth_vhost.h' \
+ 'rte_virtio_net.h' \
+}
+
+temp_cc=/tmp/${0##*/}.$$.c
+pass_cc=
+failures_cc=0
+
+temp_cxx=/tmp/${0##*/}.$$.cc
+pass_cxx=
+failures_cxx=0
+
+# Process output parameters.
+
+[ "$QUIET" = 1 ] &&
+exec 1> /dev/null
+
+[ "$VERBOSE" = 1 ] &&
+output ()
+{
+ local CCV
+ local CXXV
+
+ shift
+ CCV=$CC
+ CXXV=$CXX
+ CC="echo $CC" CXX="echo $CXX" "$@"
+ CC=$CCV
+ CXX=$CXXV
+
+ "$@"
+} ||
+output ()
+{
+
+ printf ' %s\n' "$1"
+ shift
+ "$@"
+}
+
+trap 'rm -f "$temp_cc" "$temp_cxx"' EXIT
+
+compile_cc ()
+{
+ ${CC} -I"$include_dir" \
+ ${PEDANTIC_CPPFLAGS} ${CPPFLAGS} ${EXTRA_CPPFLAGS} \
+ ${PEDANTIC_CFLAGS} ${CFLAGS} ${EXTRA_CFLAGS} \
+ -c -o /dev/null "${temp_cc}"
+}
+
+compile_cxx ()
+{
+ ${CXX} -I"$include_dir" \
+ ${PEDANTIC_CPPFLAGS} ${CPPFLAGS} ${EXTRA_CPPFLAGS} \
+ ${PEDANTIC_CXXFLAGS} ${CXXFLAGS} ${EXTRA_CXXFLAGS} \
+ -c -o /dev/null "${temp_cxx}"
+}
+
+ignore ()
+{
+ file="$1"
+ shift
+ while [ $# -ne 0 ]; do
+ case "$file" in
+ $1)
+ return 0
+ ;;
+ esac
+ shift
+ done
+ return 1
+}
+
+# Check C/C++ compilation for each header file.
+
+while read -r path
+do
+ file=${path#$include_dir}
+ file=${file##/}
+ if ignore "$file" $IGNORE; then
+ output "SKIP $file" :
+ continue
+ fi
+ if printf "\
+#include <%s>
+
+int main(void)
+{
+ return 0;
+}
+" "$file" > "$temp_cc" &&
+ output "CC $file" compile_cc
+ then
+ pass_cc="$pass_cc $file"
+ else
+ failures_cc=$(($failures_cc + 1))
+ fi
+ if ignore "$file" $IGNORE_CXX; then
+ output "SKIP CXX $file" :
+ continue
+ fi
+ if printf "\
+#include <%s>
+
+int main()
+{
+}
+" "$file" > "$temp_cxx" &&
+ output "CXX $file" compile_cxx
+ then
+ pass_cxx="$pass_cxx $file"
+ else
+ failures_cxx=$(($failures_cxx + 1))
+ fi
+done <<EOF
+$(find "$include_dir" -name '*.h')
+EOF
+
+# Check C compilation with all includes.
+
+: > "$temp_cc" &&
+for file in $pass_cc; do
+ printf "\
+#include <%s>
+" "$file" >> $temp_cc
+done
+if printf "\
+int main(void)
+{
+ return 0;
+}
+" >> "$temp_cc" &&
+ output "CC (all includes that did not fail)" compile_cc
+then
+ :
+else
+ failures_cc=$(($failures_cc + 1))
+fi
+
+# Check C++ compilation with all includes.
+
+: > "$temp_cxx" &&
+for file in $pass_cxx; do
+ printf "\
+#include <%s>
+" "$file" >> $temp_cxx
+done
+if printf "\
+int main()
+{
+}
+" >> "$temp_cxx" &&
+ output "CXX (all includes that did not fail)" compile_cxx
+then
+ :
+else
+ failures_cxx=$(($failures_cxx + 1))
+fi
+
+# Report results.
+
+if [ "$SUMMARY" = 1 ]; then
+ printf "\
+Summary:
+ %u failure(s) for C using '%s'.
+ %u failure(s) for C++ using '%s'.
+" $failures_cc "$CC" $failures_cxx "$CXX" 1>&2
+fi
+
+# Exit with nonzero status if there are failures.
+
+[ $failures_cc -eq 0 ] &&
+[ $failures_cxx -eq 0 ]
diff --git a/scripts/test-build.sh b/scripts/test-build.sh
index 5bcecfc..b2ea602 100755
--- a/scripts/test-build.sh
+++ b/scripts/test-build.sh
@@ -229,6 +229,20 @@ for conf in $configs ; do
make -j$J -sC examples/performance-thread \
EXTRA_LDFLAGS="$DPDK_DEP_LDFLAGS" $verbose \
O=$(readlink -m $dir/examples/performance-thread)
+ echo "================== Check includes in $dir"
+ if echo $target | grep -q 'gcc'; then
+ CC=gcc
+ CXX=g++
+ elif echo $target | grep -q 'clang'; then
+ CC=clang
+ CXX=clang++
+ else
+ CXX=$CC
+ fi
+ CC=$CROSS$CC CXX=$CROSS$CXX \
+ VERBOSE="$((! ! ${#verbose}))" \
+ QUIET="$((! ${#verbose}))" \
+ scripts/check-includes.sh "$dir/include"
unset RTE_TARGET
echo "################## $dir done."
done
--
2.1.4
next prev parent reply other threads:[~2016-07-07 15:50 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-05 14:08 [dpdk-dev] [PATCH 00/10] Fix build errors related to exported headers Adrien Mazarguil
2016-04-05 14:08 ` [dpdk-dev] [PATCH 01/10] lib: add extension keyword to braced-groups within expressions Adrien Mazarguil
2016-04-05 14:08 ` [dpdk-dev] [PATCH 02/10] lib: add extension keyword to large enum values Adrien Mazarguil
2016-04-05 14:08 ` [dpdk-dev] [PATCH 03/10] lib: use C99 syntax for zero-size arrays Adrien Mazarguil
2016-04-05 14:08 ` [dpdk-dev] [PATCH 04/10] lib: add extension keyword to nonstandard bit-fields Adrien Mazarguil
2016-04-05 14:08 ` [dpdk-dev] [PATCH 05/10] lib: add extension keyword to structs with no members Adrien Mazarguil
2016-04-05 14:08 ` [dpdk-dev] [PATCH 06/10] lib: add extension keyword to unnamed structs/unions Adrien Mazarguil
2016-04-05 14:08 ` [dpdk-dev] [PATCH 07/10] lib: fix missing include dependencies Adrien Mazarguil
2016-04-05 20:23 ` [dpdk-dev] [dpdk-dev, " Jan Viktorin
2016-04-06 8:54 ` Adrien Mazarguil
2016-04-06 12:10 ` Jan Viktorin
2016-04-05 14:08 ` [dpdk-dev] [PATCH 08/10] lib: add extension keyword to forward reference to enum types Adrien Mazarguil
2016-04-05 14:08 ` [dpdk-dev] [PATCH 09/10] lib: remove named variadic macros in exported headers Adrien Mazarguil
2016-04-05 14:08 ` [dpdk-dev] [PATCH 10/10] lib: hide static functions that are never defined Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 00/11] Fix build errors related to exported headers Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 01/11] lib: work around braced-groups within expressions Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 02/11] lib: work around large enum values Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 03/11] lib: use C99 syntax for zero-size arrays Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 04/11] lib: work around nonstandard bit-fields Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 05/11] lib: work around structs with no members Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 06/11] lib: work around unnamed structs/unions Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 07/11] lib: add missing include dependencies Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 08/11] lib: work around forward reference to enum types Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 09/11] lib: remove named variadic macros in exported headers Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 10/11] lib: hide static functions never defined Adrien Mazarguil
2016-07-05 10:44 ` [dpdk-dev] [PATCH v2 11/11] scripts: check compilation of exported header files Adrien Mazarguil
2016-07-05 11:15 ` [dpdk-dev] [PATCH v2 00/11] Fix build errors related to exported headers Jan Viktorin
2016-07-05 11:35 ` Adrien Mazarguil
2016-07-05 11:27 ` Ferruh Yigit
2016-07-05 12:33 ` Thomas Monjalon
2016-07-05 12:37 ` Adrien Mazarguil
2016-07-06 16:34 ` Thomas Monjalon
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 " Adrien Mazarguil
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 01/11] lib: work around braced-groups within expressions Adrien Mazarguil
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 02/11] lib: work around large enum values Adrien Mazarguil
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 03/11] lib: use C99 syntax for zero-size arrays Adrien Mazarguil
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 04/11] lib: work around nonstandard bit-fields Adrien Mazarguil
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 05/11] lib: work around structs with no members Adrien Mazarguil
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 06/11] lib: work around unnamed structs/unions Adrien Mazarguil
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 07/11] lib: add missing include dependencies Adrien Mazarguil
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 08/11] lib: work around forward reference to enum types Adrien Mazarguil
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 09/11] lib: remove named variadic macros in exported headers Adrien Mazarguil
2016-07-07 15:49 ` [dpdk-dev] [PATCH v3 10/11] lib: hide static functions never defined Adrien Mazarguil
2016-07-07 15:49 ` Adrien Mazarguil [this message]
2016-07-07 18:33 ` [dpdk-dev] [PATCH v3 00/11] Fix build errors related to exported headers Wiles, Keith
2016-07-08 8:05 ` Adrien Mazarguil
2016-07-08 9:56 ` Ferruh Yigit
2016-07-08 14:15 ` Wiles, Keith
2016-07-08 14:35 ` Adrien Mazarguil
2016-07-08 14:45 ` Ferruh Yigit
2016-07-08 15:23 ` Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 00/10] " Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 01/10] lib: work around braced-groups within expressions Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 02/10] lib: work around large enum values Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 03/10] lib: use C99 syntax for zero-size arrays Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 04/10] lib: work around nonstandard bit-fields Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 05/10] lib: work around unnamed structs/unions Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 06/10] lib: add missing include dependencies Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 07/10] lib: work around forward reference to enum types Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 08/10] lib: remove named variadic macros in exported headers Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 09/10] lib: hide static functions never defined Adrien Mazarguil
2016-07-13 13:02 ` [dpdk-dev] [PATCH v4 10/10] scripts: check compilation of exported header files Adrien Mazarguil
2016-07-15 21:03 ` [dpdk-dev] [PATCH v4 00/10] Fix build errors related to exported headers Bruce Richardson
2016-07-18 10:47 ` Adrien Mazarguil
2016-07-20 9:55 ` Thomas Monjalon
2016-08-23 16:36 ` Thomas Monjalon
2016-09-08 12:39 ` Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 " Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 01/10] lib: work around braced-groups within expressions Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 02/10] lib: work around large enum values Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 03/10] lib: use C99 syntax for zero-size arrays Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 04/10] lib: work around nonstandard bit-fields Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 05/10] lib: work around unnamed structs/unions Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 06/10] lib: add missing include dependencies Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 07/10] lib: work around forward reference to enum types Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 08/10] lib: remove named variadic macros in exported headers Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 09/10] lib: hide static functions never defined Adrien Mazarguil
2016-09-08 12:25 ` [dpdk-dev] [PATCH v5 10/10] scripts: check compilation of exported header files Adrien Mazarguil
2016-09-13 13:38 ` [dpdk-dev] [PATCH v5 00/10] Fix build errors related to exported headers Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6b3bd62dc0d2f50ee40bce5b5b374444b76c0548.1467905467.git.adrien.mazarguil@6wind.com \
--to=adrien.mazarguil@6wind.com \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).