From 8c61f81b3196fe9757901e90e3fc1b30283d3995 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 27 Dec 2010 12:51:44 -0500 Subject: [PATCH] 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. --- src/tools/pginclude/cpluspluscheck | 51 +++++++++++++++--------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck index b4ec64e253..d6b04f5b64 100644 --- a/src/tools/pginclude/cpluspluscheck +++ b/src/tools/pginclude/cpluspluscheck @@ -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