diff -r 257c0be599ab config/c-compiler.m4 --- a/config/c-compiler.m4 +++ b/config/c-compiler.m4 @@ -103,6 +103,7 @@ # command-line option. If it does, add the string to CFLAGS. AC_DEFUN([PGAC_PROG_CC_CFLAGS_OPT], [AC_MSG_CHECKING([if $CC supports $1]) +AC_LANG_ASSERT([C]) pgac_save_CFLAGS=$CFLAGS CFLAGS="$pgac_save_CFLAGS $1" _AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], @@ -110,6 +111,23 @@ [CFLAGS="$pgac_save_CFLAGS" AC_MSG_RESULT(no)]) ])# PGAC_PROG_CC_CFLAGS_OPT + + + +# PGAC_PROG_CXX_CXXFLAGS_OPT +# ----------------------- +# Given a string, check if the C++ compiler supports the string as a +# command-line option. If it does, add the string to CXXFLAGS. +AC_DEFUN([PGAC_PROG_CXX_CXXFLAGS_OPT], +[AC_MSG_CHECKING([if $CXX supports $1]) +AC_LANG_ASSERT([C++]) +pgac_save_CXXFLAGS=$CXXFLAGS +CXXFLAGS="$pgac_save_CXXFLAGS $1" +_AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + AC_MSG_RESULT(yes), + [CXXFLAGS="$pgac_save_CXXFLAGS" + AC_MSG_RESULT(no)]) +])# PGAC_PROG_CXX_CXXFLAGS_OPT diff -r 257c0be599ab configure.in --- a/configure.in +++ b/configure.in @@ -195,6 +195,14 @@ PGAC_ARG_BOOL(enable, debug, no, [build with debugging symbols (-g)]) AC_SUBST(enable_debug) + +# +# --enable-cplusplus links the postgres backend with the C++ runtime library +# +PGAC_ARG_BOOL(enable, cplusplus, no, [build with C++ runtime library], + [AC_DEFINE([ENABLE_CPLUSPLUS], 1, + [Define to 1 for mixed C/C++ build. (--enable-cplusplus)])]) +AC_SUBST(enable_cplusplus) # # --enable-profiling enables gcc profiling @@ -365,9 +373,9 @@ PGAC_ARG_REQ(with, CC, [CMD], [set compiler (deprecated)], [CC=$with_CC]) case $template in - aix) pgac_cc_list="gcc xlc";; - irix) pgac_cc_list="cc";; # no gcc - *) pgac_cc_list="gcc cc";; + aix) pgac_cc_list="gcc xlc"; pgac_cxx_list="g++ xlC";; + irix) pgac_cc_list="cc"; pgac_cxx_list="CC";; # no gcc + *) pgac_cc_list="gcc cc"; pgac_cxx_list="g++ CC";; esac AC_PROG_CC([$pgac_cc_list]) @@ -387,7 +395,15 @@ AC_SUBST(SUN_STUDIO_CC) +# +# C++ compiler +# +AC_PROG_CXX([$pgac_cxx_list]) +AC_PROG_CXXCPP +AC_SUBST(GXX) + unset CFLAGS +unset CXXFLAGS # # Read the template @@ -421,9 +437,8 @@ # ICC pretends to be GCC but it's lying; it doesn't support these options. if test "$GCC" = yes -a "$ICC" = no; then - CFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wpointer-arith" + CFLAGS="$CFLAGS -Wall -Wpointer-arith" # These work in some but not all gcc versions - PGAC_PROG_CC_CFLAGS_OPT([-Wdeclaration-after-statement]) PGAC_PROG_CC_CFLAGS_OPT([-Wendif-labels]) # Disable strict-aliasing rules; needed for gcc 3.3+ PGAC_PROG_CC_CFLAGS_OPT([-fno-strict-aliasing]) @@ -470,12 +485,53 @@ CPPFLAGS="$CPPFLAGS -I$srcdir/src/include/port/win32 -DEXEC_BACKEND" fi +# +# Initialize C++ flags from CFLAGS unless overridden in environment or template +# +if test "$ac_env_CXXFLAGS_set" = set; then + CXXFLAGS=$ac_env_CXXFLAGS_value +elif test "${CXXFLAGS+set}" = set; then + : # (keep what template set) +else + CXXFLAGS="$CFLAGS" +fi + +# Some CXXFLAGS are only valid for C++, not for C. Add them here. +if test "$GXX" = yes -a "$ICC" = no; then + AC_LANG_PUSH([C++]) + CXXFLAGS="$CXXFLAGS -Wabi" + PGAC_PROG_CXX_CXXFLAGS_OPT([-fno-enforce-eh-specs]) + PGAC_PROG_CXX_CXXFLAGS_OPT([-fno-threadsafe-statics]) + AC_LANG_POP([C++]) +fi + +# Some CFLAGS are only valid for C, not for C++. Add them here. +if test "$GCC" = yes -a "$ICC" = no; then + CFLAGS="$CFLAGS -Wmissing-prototypes" + # These work in some but not all gcc versions + PGAC_PROG_CC_CFLAGS_OPT([-Wdeclaration-after-statement]) +fi + + +# # Check if the compiler still works with the template settings +# AC_MSG_CHECKING([whether the C compiler still works]) AC_TRY_LINK([], [return 0;], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) AC_MSG_ERROR([cannot proceed])]) + +if test "$enable_cplusplus" = yes; then + AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([whether the C++ compiler still works]) + AC_TRY_LINK([class X {public: bool b; X(bool bb){this->b = bb;}};], + [X* x = new X(true);], + [AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) + AC_MSG_ERROR([cannot proceed])]) + AC_LANG_POP([C++]) +fi # Defend against gcc -ffast-math if test "$GCC" = yes; then @@ -1765,6 +1821,7 @@ # Begin output steps AC_MSG_NOTICE([using CFLAGS=$CFLAGS]) +AC_MSG_NOTICE([using CXXFLAGS=$CXXFLAGS]) AC_MSG_NOTICE([using CPPFLAGS=$CPPFLAGS]) AC_MSG_NOTICE([using LDFLAGS=$LDFLAGS]) diff -r 257c0be599ab doc/src/sgml/installation.sgml --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -1261,6 +1261,17 @@ can be profiled. On backend exit, a subdirectory will be created that contains the gmon.out file for use in profiling. This option is for use only with GCC and when doing development work. + + + + + + + + + Compiles the postgres server with C++ runtime + library support. Specify this option only if you intend to use or + develop server extensions or modifications in the C++ language. diff -r 257c0be599ab doc/src/sgml/ref/pg_config-ref.sgml --- a/doc/src/sgml/ref/pg_config-ref.sgml +++ b/doc/src/sgml/ref/pg_config-ref.sgml @@ -223,6 +223,27 @@ + + + + Print the value of the CXX variable showing the C++ + compiler that was used for building C++ modules (if any) in the + PostgreSQL backend. + + + + + + + + + Print the value of the CXXFLAGS variable that was used for building + PostgreSQL. This shows C++ compiler switches. + + + + + diff -r 257c0be599ab src/Makefile.global.in --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -164,6 +164,7 @@ enable_debug = @enable_debug@ enable_dtrace = @enable_dtrace@ enable_coverage = @enable_coverage@ +enable_cplusplus = @enable_cplusplus@ enable_thread_safety = @enable_thread_safety@ python_includespec = @python_includespec@ @@ -214,6 +215,21 @@ GCC = @GCC@ SUN_STUDIO_CC = @SUN_STUDIO_CC@ CFLAGS = @CFLAGS@ + +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXFLAGS = @CXXFLAGS@ +GXX = @GXX@ + +# gmake predefines these and uses them in its predefined implicit rules. +# We include them here just in case someone uses a version of gmake which +# doesn't have them built in. These are as defined by gmake 3.81. +COMPILE.c ?= $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c +LINK.c ?= $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) +COMPILE.cc ?= $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c +LINK.cc ?= $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) +COMPILE.cpp ?= $(COMPILE.cc) +LINK.cpp ?= $(LINK.cc) # Kind-of compilers @@ -545,18 +561,25 @@ ifeq ($(autodepend), yes) -ifndef COMPILE.c -COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) -c -endif - DEPDIR = .deps +DEPMKDIR = @if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi ifeq ($(GCC), yes) # GCC allows us to create object and dependency file in one invocation. +DEPFLAGS = -MMD -MP -MF $(DEPDIR)/$(*F).Po + %.o : %.c - @if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi - $(COMPILE.c) -o $@ $< -MMD -MP -MF $(DEPDIR)/$(*F).Po + $(DEPMKDIR) + $(COMPILE.c) $(DEPFLAGS) -o $@ $< + +%.o : %.cc + $(DEPMKDIR) + $(COMPILE.cc) $(DEPFLAGS) -o $@ $< + +%.o: %.cpp + $(DEPMKDIR) + $(COMPILE.cpp) $(DEPFLAGS) -o $@ $< endif # GCC diff -r 257c0be599ab src/backend/Makefile --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -43,7 +43,12 @@ ifneq ($(PORTNAME), aix) postgres: $(OBJS) +ifeq ($(enable_cplusplus), yes) + # Link with C++ runtime support + $(CXX) $(CXXFLAGS) $(LDFLAGS) $(export_dynamic) $(call expand_subsys,$^) $(LIBS) -o $@ +else $(CC) $(CFLAGS) $(LDFLAGS) $(export_dynamic) $(call expand_subsys,$^) $(LIBS) -o $@ +endif endif endif @@ -111,7 +116,12 @@ # The postgres.o target is needed by the rule in Makefile.global that # creates the exports file when MAKE_EXPORTS = true. postgres.o: $(OBJS) +ifeq ($(enable_cplusplus), yes) + # Link with C++ runtime support + $(CXX) $(LDREL) $(LDFLAGS) $(call expand_subsys,$^) $(LIBS) -o $@ +else $(CC) $(LDREL) $(LDFLAGS) $(call expand_subsys,$^) $(LIBS) -o $@ +endif # The following targets are specified in make commands that appear in @@ -268,4 +278,9 @@ # are up to date. It saves the time of doing all the submakes. .PHONY: quick quick: $(OBJS) +ifeq ($(enable_cplusplus), yes) + # Link with C++ runtime support + $(CXX) $(CXXFLAGS) $(LDFLAGS) $(export_dynamic) $(call expand_subsys,$^) $(LIBS) -o postgres +else $(CC) $(CFLAGS) $(LDFLAGS) $(export_dynamic) $(call expand_subsys,$^) $(LIBS) -o postgres +endif diff -r 257c0be599ab src/backend/common.mk --- a/src/backend/common.mk +++ b/src/backend/common.mk @@ -6,7 +6,7 @@ # When including this file, set OBJS to the object files created in # this directory and SUBDIRS to subdirectories containing more things -# to build. +# to build. Set CXXOBJS to the subset of OBJS which are to be C++ compiled. ifdef PARTIAL_LINKING # old style: linking using SUBSYS.o @@ -36,6 +36,11 @@ # Parallel make trickery $(SUBDIROBJS): $(SUBDIRS:%=%-recursive) ; +# For .o files listed in CXXOBJS, use C++ compiler to make .o from .c +$(CXXOBJS) : %.o: %.c + $(DEPMKDIR) + $(COMPILE.cc) $(DEPFLAGS) -o $@ $< + .PHONY: $(SUBDIRS:%=%-recursive) $(SUBDIRS:%=%-recursive): $(MAKE) -C $(subst -recursive,,$@) all diff -r 257c0be599ab src/backend/main/Makefile --- a/src/backend/main/Makefile +++ b/src/backend/main/Makefile @@ -14,4 +14,11 @@ OBJS = main.o +# If "configure --enable-cplusplus" was specified, make list of modules +# which are to be compiled as C++. The main() function should be compiled as +# C++ to ensure proper initialization of the mixed C/C++ runtime environment. +ifeq ($(enable_cplusplus),yes) +CXXOBJS = main.o +endif + include $(top_srcdir)/src/backend/common.mk diff -r 257c0be599ab src/backend/main/main.c --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -34,6 +34,14 @@ #include #endif +#if defined(ENABLE_CPLUSPLUS) && !defined(__cplusplus) +#error --enable-cplusplus configure option specified; this file should be compiled as C++ +#endif + +#ifdef __cplusplus +extern "C" { +#endif + #include "bootstrap/bootstrap.h" #include "postmaster/postmaster.h" #include "tcop/tcopprot.h" @@ -42,6 +50,10 @@ #include "utils/ps_status.h" #ifdef WIN32 #include "libpq/pqsignal.h" +#endif + +#ifdef __cplusplus +} /* extern "C" */ #endif diff -r 257c0be599ab src/bin/pg_config/Makefile --- a/src/bin/pg_config/Makefile +++ b/src/bin/pg_config/Makefile @@ -24,6 +24,8 @@ override CPPFLAGS += -DVAL_CPPFLAGS="\"$(STD_CPPFLAGS)\"" override CPPFLAGS += -DVAL_CFLAGS="\"$(CFLAGS)\"" override CPPFLAGS += -DVAL_CFLAGS_SL="\"$(CFLAGS_SL)\"" +override CPPFLAGS += -DVAL_CXX="\"$(CXX)\"" +override CPPFLAGS += -DVAL_CXXFLAGS="\"$(CXXFLAGS)\"" override CPPFLAGS += -DVAL_LDFLAGS="\"$(STD_LDFLAGS)\"" override CPPFLAGS += -DVAL_LDFLAGS_SL="\"$(LDFLAGS_SL)\"" override CPPFLAGS += -DVAL_LIBS="\"$(LIBS)\"" diff -r 257c0be599ab src/bin/pg_config/pg_config.c --- a/src/bin/pg_config/pg_config.c +++ b/src/bin/pg_config/pg_config.c @@ -311,6 +311,38 @@ } static void +show_cxx(bool all) +{ +#ifdef VAL_CXX + if (all) + printf("CXX = "); + printf("%s\n", VAL_CXX); +#else + if (!all) + { + fprintf(stderr, _("not recorded\n")); + exit(1); + } +#endif +} + +static void +show_cxxflags(bool all) +{ +#ifdef VAL_CXXFLAGS + if (all) + printf("CXXFLAGS = "); + printf("%s\n", VAL_CXXFLAGS); +#else + if (!all) + { + fprintf(stderr, _("not recorded\n")); + exit(1); + } +#endif +} + +static void show_ldflags(bool all) { #ifdef VAL_LDFLAGS @@ -397,6 +429,8 @@ {"--cppflags", show_cppflags}, {"--cflags", show_cflags}, {"--cflags_sl", show_cflags_sl}, + {"--cxx", show_cxx}, + {"--cxxflags", show_cxxflags}, {"--ldflags", show_ldflags}, {"--ldflags_sl", show_ldflags_sl}, {"--libs", show_libs}, @@ -432,6 +466,8 @@ printf(_(" --cppflags show CPPFLAGS value used when PostgreSQL was built\n")); printf(_(" --cflags show CFLAGS value used when PostgreSQL was built\n")); printf(_(" --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n")); + printf(_(" --cxx show CXX value used when PostgreSQL was built\n")); + printf(_(" --cxxflags show CXXFLAGS value used when PostgreSQL was built\n")); printf(_(" --ldflags show LDFLAGS value used when PostgreSQL was built\n")); printf(_(" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n")); printf(_(" --libs show LIBS value used when PostgreSQL was built\n")); diff -r 257c0be599ab src/include/pg_config.h.in --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -44,6 +44,9 @@ /* Define to the default TCP port number as a string constant. */ #undef DEF_PGPORT_STR + +/* Define to 1 for mixed C/C++ build. (--enable-cplusplus) */ +#undef ENABLE_CPLUSPLUS /* Define to 1 to enable DTrace support. (--enable-dtrace) */ #undef ENABLE_DTRACE