DPDK patches and discussions
 help / color / mirror / Atom feed
From: Adrien Mazarguil <adrien.mazarguil@6wind.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v2 11/11] scripts: check compilation of exported header files
Date: Tue,  5 Jul 2016 12:44:57 +0200	[thread overview]
Message-ID: <7ac0bf451832201df7bdcf35bdc1cde97e650399.1467715254.git.adrien.mazarguil@6wind.com> (raw)
In-Reply-To: <cover.1467715254.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

  parent reply	other threads:[~2016-07-05 10:45 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   ` Adrien Mazarguil [this message]
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     ` [dpdk-dev] [PATCH v3 11/11] scripts: check compilation of exported header files Adrien Mazarguil
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=7ac0bf451832201df7bdcf35bdc1cde97e650399.1467715254.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).