Rearrange cpluspluscheck to check just one .h file at a time.

This is slower than the original coding but avoids the problem of
including files in an unpredictable order.  Aside from being more
trustworthy, we can get rid of some exclusions that were formerly
made for what turn out to be ordering or re-inclusion problems.

I also modified it to include libpq's exported files in the check.
ecpg should be included as well, but I'm unclear on which ecpg .h
files are meant to be included by clients.
This commit is contained in:
Tom Lane 2010-12-27 12:51:44 -05:00
parent 37b61a69f3
commit 8c61f81b31
1 changed files with 26 additions and 25 deletions

View File

@ -1,35 +1,36 @@
#!/bin/sh
# Check all include files in or below the current directory for C++
# compatibility. Typically, run this in PostgreSQL's src/include/ directory.
# Check all exported PostgreSQL include files for C++ compatibility.
# Run this from the top-level source directory after performing a build.
# No output if everything is OK, else compiler errors.
set -e
me=`basename $0`
trap 'rm -rf $tmp' 0 1 2 3 15
tmp=`mktemp -d /tmp/$me.XXXXXX`
{
echo ' extern "C" {'
echo '#include "postgres.h"'
trap 'rm -rf $tmp' 0 1 2 3 15
# Omit port/, because it's platform specific, and c.h includes the relevant
# file anyway.
# Omit regex/ and snowball/, because those files came from elsewhere, and
# they would need extra work if someone cared to fix them.
# gram.h will be included by ./parser/gramparse.h.
# kwlist.h is not meant to be included without having defined PG_KEYWORD.
# rusagestub.h will be included by ./utils/pg_rusage.h if necessary.
for file in `find . \( -name port -prune -o -name regex -prune -o -name snowball -prune \) -o -name '*.h' -not -name gram.h -not -name kwlist.h -not -name rusagestub.h -print`; do
f=`echo $file | sed 's,^\./,,'`
echo "#include \"$f\""
# Omit src/include/port/, because it's platform specific, and c.h includes
# the relevant file anyway.
# rusagestub.h is also platform-specific, and will be included by
# utils/pg_rusage.h if necessary.
# regex/regerrs.h is not meant to be included standalone.
# parser/gram.h will be included by parser/gramparse.h.
# parser/kwlist.h is not meant to be included standalone.
for f in `find src/include src/interfaces/libpq/libpq-fe.h src/interfaces/libpq/libpq-events.h -name '*.h' -print | \
grep -v -e ^src/include/port/ \
-e ^src/include/rusagestub.h -e ^src/include/regex/regerrs.h \
-e ^src/include/parser/gram.h -e ^src/include/parser/kwlist.h`
do
{
echo ' extern "C" {'
echo '#include "postgres.h"'
echo "#include \"$f\""
echo '};'
} >$tmp/test.cpp
# -fno-operator-names omits the definition of bitand and bitor, which
# collide with varbit.h. Could be fixed, if one were so inclined.
${CXX:-g++} -I . -I src/include -fsyntax-only -fno-operator-names -Wall -c $tmp/test.cpp
done
echo '};'
} >$tmp/test.cpp
# -fno-operator-names omits the definition of bitand and bitor, which would
# collide with varbit.h. Could be fixed, if one were so inclined.
${CXX:-g++} -I. -fsyntax-only -fno-operator-names -Wall -c $tmp/test.cpp