mirror of
https://github.com/postgres/postgres.git
synced 2025-06-05 23:56:58 +03:00
There isn't a lot of user demand for AIX support, we have a bunch of hacks to work around AIX-specific compiler bugs and idiosyncrasies, and no one has stepped up to the plate to properly maintain it. Remove support for AIX to get rid of that maintenance overhead. It's still supported for stable versions. The acute issue that triggered this decision was that after commit 8af2565248, the AIX buildfarm members have been hitting this assertion: TRAP: failed Assert("(uintptr_t) buffer == TYPEALIGN(PG_IO_ALIGN_SIZE, buffer)"), File: "md.c", Line: 472, PID: 2949728 Apperently the "pg_attribute_aligned(a)" attribute doesn't work on AIX for values larger than PG_IO_ALIGN_SIZE, for a static const variable. That could be worked around, but we decided to just drop the AIX support instead. Discussion: https://www.postgresql.org/message-id/20240224172345.32@rfd.leadboat.com Reviewed-by: Andres Freund, Noah Misch, Thomas Munro
227 lines
8.8 KiB
Bash
Executable File
227 lines
8.8 KiB
Bash
Executable File
#!/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
|