summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2024-03-10 06:33:57 +0000
committerPeter Eisentraut2024-03-10 06:56:17 +0000
commit7b8e2ae2fd3bec55e2d8c51e49871954851b5df8 (patch)
tree1ca8b482b6265198c6b5d1a546db41c9626edf22
parentf696c0cd5f299f1b51e214efc55a22a782cc175d (diff)
Combine headerscheck and cpluspluscheck scripts
They are mostly the same, and it is tedious to maintain two copies of essentially the same exclude list. headerscheck now has a new option --cplusplus to select the cpluspluscheck functionality. The top-level make targets are still the same. Reviewed-by: Thomas Munro <[email protected]> Reviewed-by: Michael Paquier <[email protected]> Discussion: https://www.postgresql.org/message-id/flat/[email protected]
-rw-r--r--GNUmakefile.in2
-rwxr-xr-xsrc/tools/pginclude/cpluspluscheck226
-rwxr-xr-xsrc/tools/pginclude/headerscheck58
3 files changed, 55 insertions, 231 deletions
diff --git a/GNUmakefile.in b/GNUmakefile.in
index eba569e930e..4d8fc794bbb 100644
--- a/GNUmakefile.in
+++ b/GNUmakefile.in
@@ -133,6 +133,6 @@ headerscheck: submake-generated-headers
$(top_srcdir)/src/tools/pginclude/headerscheck $(top_srcdir) $(abs_top_builddir)
cpluspluscheck: submake-generated-headers
- $(top_srcdir)/src/tools/pginclude/cpluspluscheck $(top_srcdir) $(abs_top_builddir)
+ $(top_srcdir)/src/tools/pginclude/headerscheck --cplusplus $(top_srcdir) $(abs_top_builddir)
.PHONY: dist distdir distcheck docs install-docs world check-world install-world installcheck-world headerscheck cpluspluscheck
diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck
deleted file mode 100755
index a46ff52cc1b..00000000000
--- a/src/tools/pginclude/cpluspluscheck
+++ /dev/null
@@ -1,226 +0,0 @@
-#!/bin/sh
-
-# Check (almost) all PostgreSQL include files for C++ compatibility.
-#
-# Argument 1 is the top-level source directory, argument 2 the
-# top-level build directory (they might be the same). If not set, they
-# default to the current directory.
-#
-# Needs to be run after configuring and creating all generated headers.
-# It's advisable to configure --with-perl --with-python, else you're
-# likely to get errors from associated headers.
-#
-# No output if everything is OK, else compiler errors.
-#
-# src/tools/pginclude/cpluspluscheck
-# Copyright (c) 2009-2024, PostgreSQL Global Development Group
-
-if [ -z "$1" ]; then
- srcdir="."
-else
- srcdir="$1"
-fi
-
-if [ -z "$2" ]; then
- builddir="."
-else
- builddir="$2"
-fi
-
-me=`basename $0`
-
-# These switches are g++ specific, you may override if necessary.
-CXXFLAGS=${CXXFLAGS:- -fsyntax-only -Wall}
-
-# Pull some info from configure's results.
-MGLOB="$builddir/src/Makefile.global"
-CPPFLAGS=`sed -n 's/^CPPFLAGS[ ]*=[ ]*//p' "$MGLOB"`
-CXX=`sed -n 's/^CXX[ ]*=[ ]*//p' "$MGLOB"`
-perl_includespec=`sed -n 's/^perl_includespec[ ]*=[ ]*//p' "$MGLOB"`
-python_includespec=`sed -n 's/^python_includespec[ ]*=[ ]*//p' "$MGLOB"`
-
-# Extract any -I and -D switches from CPPFLAGS.
-# (If necessary, user can pass more switches by presetting EXTRAFLAGS.)
-for flag in $CPPFLAGS; do
- case $flag in
- -I*|-D*) EXTRAFLAGS="$EXTRAFLAGS $flag";;
- esac
-done
-
-# Create temp directory.
-tmp=`mktemp -d /tmp/$me.XXXXXX`
-
-trap "ret=$?; rm -rf $tmp; exit $ret" 0 1 2 3 15
-
-exit_status=0
-
-# Scan all of src/ and contrib/ for header files.
-for f in `cd "$srcdir" && find src contrib -name '*.h' -print`
-do
- # Ignore files that are unportable or intentionally not standalone.
-
- # These files are platform-specific, and c.h will include the
- # one that's relevant for our current platform anyway.
- test "$f" = src/include/port/cygwin.h && continue
- test "$f" = src/include/port/darwin.h && continue
- test "$f" = src/include/port/freebsd.h && continue
- test "$f" = src/include/port/linux.h && continue
- test "$f" = src/include/port/netbsd.h && continue
- test "$f" = src/include/port/openbsd.h && continue
- test "$f" = src/include/port/solaris.h && continue
- test "$f" = src/include/port/win32.h && continue
-
- # Additional Windows-specific headers.
- test "$f" = src/include/port/win32_port.h && continue
- test "$f" = src/include/port/win32/netdb.h && continue
- test "$f" = src/include/port/win32/sys/resource.h && continue
- test "$f" = src/include/port/win32/sys/socket.h && continue
- test "$f" = src/include/port/win32_msvc/dirent.h && continue
- test "$f" = src/include/port/win32_msvc/utime.h && continue
- test "$f" = src/include/port/win32ntdll.h && continue
- test "$f" = src/port/pthread-win32.h && continue
-
- # Likewise, these files are platform-specific, and the one
- # relevant to our platform will be included by atomics.h.
- test "$f" = src/include/port/atomics/arch-arm.h && continue
- test "$f" = src/include/port/atomics/arch-hppa.h && continue
- test "$f" = src/include/port/atomics/arch-ppc.h && continue
- test "$f" = src/include/port/atomics/arch-x86.h && continue
- test "$f" = src/include/port/atomics/fallback.h && continue
- test "$f" = src/include/port/atomics/generic.h && continue
- test "$f" = src/include/port/atomics/generic-acc.h && continue
- test "$f" = src/include/port/atomics/generic-gcc.h && continue
- test "$f" = src/include/port/atomics/generic-msvc.h && continue
- test "$f" = src/include/port/atomics/generic-sunpro.h && continue
-
- # sepgsql.h depends on headers that aren't there on most platforms.
- test "$f" = contrib/sepgsql/sepgsql.h && continue
-
- # nodetags.h cannot be included standalone: it's just a code fragment.
- test "$f" = src/include/nodes/nodetags.h && continue
- test "$f" = src/backend/nodes/nodetags.h && continue
-
- # These files are not meant to be included standalone, because
- # they contain lists that might have multiple use-cases.
- test "$f" = src/include/access/rmgrlist.h && continue
- test "$f" = src/include/parser/kwlist.h && continue
- test "$f" = src/pl/plpgsql/src/pl_reserved_kwlist.h && continue
- test "$f" = src/pl/plpgsql/src/pl_unreserved_kwlist.h && continue
- test "$f" = src/interfaces/ecpg/preproc/c_kwlist.h && continue
- test "$f" = src/interfaces/ecpg/preproc/ecpg_kwlist.h && continue
- test "$f" = src/include/regex/regerrs.h && continue
- test "$f" = src/include/tcop/cmdtaglist.h && continue
- test "$f" = src/pl/plpgsql/src/plerrcodes.h && continue
- test "$f" = src/pl/plpython/spiexceptions.h && continue
- test "$f" = src/pl/tcl/pltclerrcodes.h && continue
-
- # Also not meant to be included standalone.
- test "$f" = src/include/common/unicode_nonspacing_table.h && continue
- test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue
-
- test "$f" = src/backend/catalog/syscache_ids.h && continue
- test "$f" = src/backend/catalog/syscache_info.h && continue
- test "$f" = src/include/catalog/syscache_ids.h && continue
- test "$f" = src/include/catalog/syscache_info.h && continue
-
- # We can't make these Bison output files compilable standalone
- # without using "%code require", which old Bison versions lack.
- # parser/gram.h will be included by parser/gramparse.h anyway.
- test "$f" = contrib/cube/cubeparse.h && continue
- test "$f" = contrib/seg/segparse.h && continue
- test "$f" = src/backend/bootstrap/bootparse.h && continue
- test "$f" = src/backend/parser/gram.h && continue
- test "$f" = src/backend/replication/repl_gram.h && continue
- test "$f" = src/backend/replication/syncrep_gram.h && continue
- test "$f" = src/backend/utils/adt/jsonpath_gram.h && continue
- test "$f" = src/bin/pgbench/exprparse.h && continue
- test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
- test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
- test "$f" = src/test/isolation/specparse.h && continue
-
- # ppport.h is not under our control, so we can't make it standalone.
- test "$f" = src/pl/plperl/ppport.h && continue
-
- # regression.h is not actually C, but ECPG code.
- test "$f" = src/interfaces/ecpg/test/regression.h && continue
- # printf_hack.h produces "unused function" warnings.
- test "$f" = src/interfaces/ecpg/test/printf_hack.h && continue
-
- # pg_trace.h and utils/probes.h can include sys/sdt.h from SystemTap,
- # which itself contains C++ code and so won't compile with a C++
- # compiler under extern "C" linkage.
- test "$f" = src/include/pg_trace.h && continue
- test "$f" = src/include/utils/probes.h && continue
-
- # pg_dump is not C++-clean because it uses "public" and "namespace"
- # as field names, which is unfortunate but we won't change it now.
- test "$f" = src/bin/pg_dump/compress_gzip.h && continue
- test "$f" = src/bin/pg_dump/compress_io.h && continue
- test "$f" = src/bin/pg_dump/compress_lz4.h && continue
- test "$f" = src/bin/pg_dump/compress_none.h && continue
- test "$f" = src/bin/pg_dump/compress_zstd.h && continue
- test "$f" = src/bin/pg_dump/parallel.h && continue
- test "$f" = src/bin/pg_dump/pg_backup_archiver.h && continue
- test "$f" = src/bin/pg_dump/pg_dump.h && continue
-
- # OK, create .c file to include this .h file.
- {
- echo 'extern "C" {'
- # Ideally we'd pre-include only the appropriate one of
- # postgres.h, postgres_fe.h, or c.h. We don't always have enough
- # info to guess which, but in some subdirectories there's a
- # reasonable choice to make, and otherwise we use postgres.h.
- # Also, those three files should compile with no pre-include, as
- # should src/interfaces headers meant to be exposed to clients.
- case "$f" in
- src/include/postgres.h) ;;
- src/include/postgres_fe.h) ;;
- src/include/c.h) ;;
- src/interfaces/libpq/libpq-fe.h) ;;
- src/interfaces/libpq/libpq-events.h) ;;
- src/interfaces/ecpg/ecpglib/ecpglib_extern.h)
- echo '#include "postgres_fe.h"' ;;
- src/interfaces/ecpg/ecpglib/*) ;;
- src/interfaces/*)
- echo '#include "postgres_fe.h"' ;;
- src/bin/*)
- echo '#include "postgres_fe.h"' ;;
- src/fe_utils/*)
- echo '#include "postgres_fe.h"' ;;
- src/port/*) ;;
- src/common/*)
- echo '#include "c.h"' ;;
- *)
- echo '#include "postgres.h"' ;;
- esac
- echo "#include \"$f\""
- echo '};'
- } >$tmp/test.cpp
-
- # Some subdirectories need extra -I switches.
- case "$f" in
- src/pl/plperl/*)
- EXTRAINCLUDES="$perl_includespec" ;;
- src/pl/plpython/*)
- EXTRAINCLUDES="$python_includespec" ;;
- src/interfaces/ecpg/*)
- EXTRAINCLUDES="-I $builddir/src/interfaces/ecpg/include -I $srcdir/src/interfaces/ecpg/include" ;;
- src/backend/parser/*)
- EXTRAINCLUDES="-I $builddir/src/backend/parser/" ;;
- src/backend/utils/adt/*)
- EXTRAINCLUDES="-I $builddir/src/backend/utils/adt/" ;;
- *)
- EXTRAINCLUDES="" ;;
- esac
-
- # Run the test.
- if ! ${CXX:-g++} -I $builddir -I $srcdir \
- -I $builddir/src/include -I $srcdir/src/include \
- -I $builddir/src/interfaces/libpq -I $srcdir/src/interfaces/libpq \
- $EXTRAINCLUDES $EXTRAFLAGS $CXXFLAGS -c $tmp/test.cpp
- then
- exit_status=1
- fi
-done
-
-exit $exit_status
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 0e2d7f537ef..5c12ab99b8b 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -15,6 +15,14 @@
# src/tools/pginclude/headerscheck
# Copyright (c) 2009-2024, PostgreSQL Global Development Group
+# option to check for C++ compatibility
+if [ "$1" = "--cplusplus" ]; then
+ cplusplus=true
+ shift
+else
+ cplusplus=false
+fi
+
if [ -z "$1" ]; then
srcdir="."
else
@@ -29,11 +37,15 @@ fi
me=`basename $0`
+# These switches are g++ specific, you may override if necessary.
+CXXFLAGS=${CXXFLAGS:- -fsyntax-only -Wall}
+
# Pull some info from configure's results.
MGLOB="$builddir/src/Makefile.global"
CPPFLAGS=`sed -n 's/^CPPFLAGS[ ]*=[ ]*//p' "$MGLOB"`
CFLAGS=`sed -n 's/^CFLAGS[ ]*=[ ]*//p' "$MGLOB"`
CC=`sed -n 's/^CC[ ]*=[ ]*//p' "$MGLOB"`
+CXX=`sed -n 's/^CXX[ ]*=[ ]*//p' "$MGLOB"`
PG_SYSROOT=`sed -n 's/^PG_SYSROOT[ ]*=[ ]*//p' "$MGLOB"`
perl_includespec=`sed -n 's/^perl_includespec[ ]*=[ ]*//p' "$MGLOB"`
python_includespec=`sed -n 's/^python_includespec[ ]*=[ ]*//p' "$MGLOB"`
@@ -43,6 +55,22 @@ CPPFLAGS=`echo "$CPPFLAGS" | sed "s|\\\$(PG_SYSROOT)|$PG_SYSROOT|g"`
# (EXTRAFLAGS is not set here, but user can pass it in if need be.)
+if $cplusplus; then
+ ext=cpp
+ COMPILER=${CXX:-g++}
+ # Extract any -I and -D switches from CPPFLAGS.
+ for flag in $CPPFLAGS; do
+ case $flag in
+ -I*|-D*) CXXPPFLAGS="$CXXPPFLAGS $flag";;
+ esac
+ done
+ COMPILER_FLAGS="$CXXPPFLAGS $CXXFLAGS"
+else
+ ext=c
+ COMPILER=${CC:-gcc}
+ COMPILER_FLAGS="$CPPFLAGS $CFLAGS"
+fi
+
# Create temp directory.
tmp=`mktemp -d /tmp/$me.XXXXXX`
@@ -69,6 +97,7 @@ do
# Additional Windows-specific headers.
test "$f" = src/include/port/win32_port.h && continue
test "$f" = src/include/port/win32/netdb.h && continue
+ $cplusplus && test "$f" = src/include/port/win32/sys/resource.h && continue
test "$f" = src/include/port/win32/sys/socket.h && continue
test "$f" = src/include/port/win32_msvc/dirent.h && continue
test "$f" = src/include/port/win32_msvc/utime.h && continue
@@ -134,7 +163,7 @@ do
test "$f" = src/test/isolation/specparse.h && continue
# This produces a "no previous prototype" warning.
- test "$f" = src/include/storage/checksum_impl.h && continue
+ ! $cplusplus && test "$f" = src/include/storage/checksum_impl.h && continue
# ppport.h is not under our control, so we can't make it standalone.
test "$f" = src/pl/plperl/ppport.h && continue
@@ -144,8 +173,28 @@ do
# printf_hack.h produces "unused function" warnings.
test "$f" = src/interfaces/ecpg/test/printf_hack.h && continue
+ if $cplusplus; then
+ # pg_trace.h and utils/probes.h can include sys/sdt.h from SystemTap,
+ # which itself contains C++ code and so won't compile with a C++
+ # compiler under extern "C" linkage.
+ test "$f" = src/include/pg_trace.h && continue
+ test "$f" = src/include/utils/probes.h && continue
+
+ # pg_dump is not C++-clean because it uses "public" and "namespace"
+ # as field names, which is unfortunate but we won't change it now.
+ test "$f" = src/bin/pg_dump/compress_gzip.h && continue
+ test "$f" = src/bin/pg_dump/compress_io.h && continue
+ test "$f" = src/bin/pg_dump/compress_lz4.h && continue
+ test "$f" = src/bin/pg_dump/compress_none.h && continue
+ test "$f" = src/bin/pg_dump/compress_zstd.h && continue
+ test "$f" = src/bin/pg_dump/parallel.h && continue
+ test "$f" = src/bin/pg_dump/pg_backup_archiver.h && continue
+ test "$f" = src/bin/pg_dump/pg_dump.h && continue
+ fi
+
# OK, create .c file to include this .h file.
{
+ $cplusplus && echo 'extern "C" {'
# Ideally we'd pre-include only the appropriate one of
# postgres.h, postgres_fe.h, or c.h. We don't always have enough
# info to guess which, but in some subdirectories there's a
@@ -174,7 +223,8 @@ do
echo '#include "postgres.h"' ;;
esac
echo "#include \"$f\""
- } >$tmp/test.c
+ $cplusplus && echo '};'
+ } >$tmp/test.$ext
# Some subdirectories need extra -I switches.
case "$f" in
@@ -193,10 +243,10 @@ do
esac
# Run the test.
- if ! ${CC:-gcc} $CPPFLAGS $CFLAGS -I $builddir -I $srcdir \
+ if ! $COMPILER $COMPILER_FLAGS -I $builddir -I $srcdir \
-I $builddir/src/include -I $srcdir/src/include \
-I $builddir/src/interfaces/libpq -I $srcdir/src/interfaces/libpq \
- $EXTRAINCLUDES $EXTRAFLAGS -c $tmp/test.c -o $tmp/test.o
+ $EXTRAINCLUDES $EXTRAFLAGS -c $tmp/test.$ext -o $tmp/test.o
then
exit_status=1
fi