From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-f49.google.com (mail-wm0-f49.google.com [74.125.82.49]) by dpdk.org (Postfix) with ESMTP id 4C77A567B for ; Wed, 13 Jul 2016 15:03:54 +0200 (CEST) Received: by mail-wm0-f49.google.com with SMTP id f126so28197958wma.1 for ; Wed, 13 Jul 2016 06:03:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=beu8KqVl9TVpMyzgmKrm5Erp/SFTgvEKqqXTDkUmJ+o=; b=kX6Ccjf8BKMRnqmAmtsE9423Qzd75/wP2tlDEtdXxA+Z3x5GCC9ZSIQh8iOURCpcom MGdOCImh/HceQxT5otnCr5jjimNH6LjUhvgZErxG9ghL1QUCFzle7qkXum80p+ZNaoKE YctezLT3Tto4xRmNDKUhmnZCYv4bTV98NCuAo0Mg2JLl3s2tG9DtmaI7BTHeuACO9o/S R7brpyLfwgT/qX211DxWLV0mJuZbQhQezNE8tnfTJ+89yiGZO3OKjM0SEDTyA6bq7MOs otNuzAA4oOy9E0MGzos89O1QxVzFlN69ru0u50+pEb1KHlIgNiI/OcqlXT1iO1JnnJ9F JSMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=beu8KqVl9TVpMyzgmKrm5Erp/SFTgvEKqqXTDkUmJ+o=; b=G+KpD2sv+CBhzPJXWg6o0GLW/8VCRuaKiPiBzTnIcSVGF2MpCqzecgTqVa5vkJEyBr pxCOuJI4Oa3i0E78OkCUjXOgBMYDTBXg5VFnu96InPB5k8pZaN7np5pgt9rrTidrBc4m RWlH++tPn/gETxXxjRGVg/6vzazBSDhMfDRH+V6l4fx99BZKbVUclsPgji5qktQwfhGO 0VHc3RM6UTXqJUhn5EzYrDRFNFR3JAai/oNgd0vr3c0woHNZvvn0KlMigsLllJBeodrq 0RD+2UF9CRj8oav3P/L2IUspNQiu8y2ABEOJdn+3FNWwbYt0VUimEu556lgKNunEwsqA oIMA== X-Gm-Message-State: ALyK8tJB/lwOazLAIyVvNRXfOQcHAdfLGNVjrbsASgBvnBghhbb4tMdmqwABPLxL0iW+UiZo X-Received: by 10.28.15.213 with SMTP id 204mr26850777wmp.74.1468415033772; Wed, 13 Jul 2016 06:03:53 -0700 (PDT) Received: from 6wind.com (guy78-3-82-239-227-177.fbx.proxad.net. [82.239.227.177]) by smtp.gmail.com with ESMTPSA id go7sm829432wjd.47.2016.07.13.06.03.51 for (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 13 Jul 2016 06:03:52 -0700 (PDT) From: Adrien Mazarguil To: dev@dpdk.org Date: Wed, 13 Jul 2016 15:02:47 +0200 Message-Id: <5032796c329111b0de9b560ebb3a239a025acee1.1468413397.git.adrien.mazarguil@6wind.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v4 10/10] scripts: check compilation of exported header files X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 Jul 2016 13:03:54 -0000 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 --- MAINTAINERS | 1 + scripts/check-includes.sh | 286 +++++++++++++++++++++++++++++++++++++++++ scripts/test-build.sh | 14 ++ 3 files changed, 301 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index f996c2e..e2933c4 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 < /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 < "$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