to the gettext domain name, to simplify parallel installations.
Also, rename set_text_domain() to pg_bindtextdomain(), because that is what
it does.
host_alias
target_alias
configure_args
+PG_MAJORVERSION
build
build_cpu
build_vendor
#define PG_VERSION "$PACKAGE_VERSION"
_ACEOF
+PG_MAJORVERSION=`expr "$PACKAGE_VERSION" : '\([0-9][0-9]*\.[0-9][0-9]*\)'`
+
+
+cat >>confdefs.h <<_ACEOF
+#define PG_MAJORVERSION "$PG_MAJORVERSION"
+_ACEOF
+
# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
host_alias!$host_alias$ac_delim
target_alias!$target_alias$ac_delim
configure_args!$configure_args$ac_delim
+PG_MAJORVERSION!$PG_MAJORVERSION$ac_delim
build!$build$ac_delim
build_cpu!$build_cpu$ac_delim
build_vendor!$build_vendor$ac_delim
ELF_SYS!$ELF_SYS$ac_delim
LDFLAGS_SL!$LDFLAGS_SL$ac_delim
LD!$LD$ac_delim
-with_gnu_ld!$with_gnu_ld$ac_delim
_ACEOF
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
cat >conf$$subs.sed <<_ACEOF
+with_gnu_ld!$with_gnu_ld$ac_delim
ld_R_works!$ld_R_works$ac_delim
RANLIB!$RANLIB$ac_delim
STRIP!$STRIP$ac_delim
LTLIBOBJS!$LTLIBOBJS$ac_delim
_ACEOF
- if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 58; then
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 59; then
break
elif $ac_last_try; then
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
AC_SUBST(configure_args, [$ac_configure_args])
AC_DEFINE_UNQUOTED(PG_VERSION, "$PACKAGE_VERSION", [PostgreSQL version as a string])
+[PG_MAJORVERSION=`expr "$PACKAGE_VERSION" : '\([0-9][0-9]*\.[0-9][0-9]*\)'`]
+AC_SUBST(PG_MAJORVERSION)
+AC_DEFINE_UNQUOTED(PG_MAJORVERSION, "$PG_MAJORVERSION", [PostgreSQL major version as a string])
AC_CANONICAL_HOST
version.sgml: $(top_builddir)/src/Makefile.global
{ \
echo "<!entity version \"$(VERSION)\">"; \
- echo "<!entity majorversion \"`expr $(VERSION) : '\([0-9][0-9]*\.[0-9][0-9]*\)'`\">"; \
+ echo "<!entity majorversion \"$(MAJORVERSION)\">"; \
} >$@
features-supported.sgml: $(top_srcdir)/src/backend/catalog/sql_feature_packages.txt $(top_srcdir)/src/backend/catalog/sql_features.txt
# PostgreSQL version number
VERSION = @PACKAGE_VERSION@
+MAJORVERSION = @PG_MAJORVERSION@
# Support for VPATH builds
vpath_build = @vpath_build@
# Try to keep the sections in some kind of order, folks...
override CFLAGS += $(CFLAGS_SL)
+ifdef SO_MAJOR_VERSION
+# libraries ought to use this to refer to versioned gettext domain names
+override CPPFLAGS += -DSO_MAJOR_VERSION=$(SO_MAJOR_VERSION)
+endif
ifeq ($(PORTNAME), aix)
ifdef SO_MAJOR_VERSION
* error messages to be localized.
*/
- set_pglocale_pgservice(argv[0], "postgres");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("postgres"));
#ifdef WIN32
}
void
-set_text_domain(const char *domain)
+pg_bindtextdomain(const char *domain)
{
#ifdef ENABLE_NLS
if (my_exec_path[0] != '\0')
};
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "initdb");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("initdb"));
if (argc > 1)
{
int j;
int ret;
- set_pglocale_pgservice(argv[0], "pg_config");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_config"));
progname = get_progname(argv[0]);
const char *strftime_fmt = "%c";
const char *progname;
- set_pglocale_pgservice(argv[0], "pg_controldata");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_controldata"));
progname = get_progname(argv[0]);
#endif
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pg_ctl");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_ctl"));
/*
* save argv[0] so do_start() can look for the postmaster if necessary. we
{NULL, 0, NULL, 0}
};
- set_pglocale_pgservice(argv[0], "pg_dump");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
g_verbose = false;
int optindex;
- set_pglocale_pgservice(argv[0], "pg_dump");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
progname = get_progname(argv[0]);
{NULL, 0, NULL, 0}
};
- set_pglocale_pgservice(argv[0], "pg_dump");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
opts = NewRestoreOptions();
int fd;
char path[MAXPGPATH];
- set_pglocale_pgservice(argv[0], "pg_resetxlog");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_resetxlog"));
progname = get_progname(argv[0]);
char *password_prompt = NULL;
bool new_pass;
- set_pglocale_pgservice(argv[0], "psql");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("psql"));
if (argc > 1)
{
bool verbose = false;
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pgscripts");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "clusterdb", help);
PGresult *result;
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pgscripts");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "createdb", help);
PGresult *result;
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pgscripts");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "createlang", help);
PGresult *result;
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pgscripts");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "createuser", help);
PGresult *result;
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pgscripts");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "dropdb", help);
PGresult *result;
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pgscripts");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "droplang", help);
PGresult *result;
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pgscripts");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "dropuser", help);
const char *index = NULL;
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pgscripts");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "reindexdb", help);
bool verbose = false;
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pgscripts");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "vacuumdb", help);
#define STATUS_WAITING (2)
+/* gettext domain name mangling */
+
+/*
+ * To better support parallel installations of major PostgeSQL
+ * versions as well as parallel installations of major library soname
+ * versions, we mangle the gettext domain name by appending those
+ * version numbers. The coding rule ought to be that whereever the
+ * domain name is mentioned as a literal, it must be wrapped into
+ * PG_TEXTDOMAIN(). The macros below do not work on non-literals; but
+ * that is somewhat intentional because it avoids having to worry
+ * about multiple states of premangling and postmangling as the values
+ * are being passed around.
+ *
+ * Make sure this matches the installation rules in nls-global.mk.
+ */
+
+/* need a second indirection because we want to stringize the macro value, not the name */
+#define CppAsString2(x) CppAsString(x)
+
+#ifdef SO_MAJOR_VERSION
+# define PG_TEXTDOMAIN(domain) (domain CppAsString2(SO_MAJOR_VERSION) "-" PG_MAJORVERSION)
+#else
+# define PG_TEXTDOMAIN(domain) (domain "-" PG_MAJORVERSION)
+#endif
+
+
/* ----------------------------------------------------------------
* Section 8: system-specific hacks
*
extern void ValidatePgVersion(const char *path);
extern void process_shared_preload_libraries(void);
extern void process_local_preload_libraries(void);
-extern void set_text_domain(const char *domain);
+extern void pg_bindtextdomain(const char *domain);
/* in access/transam/xlog.c */
extern bool BackupInProgress(void);
(--with-krb-srvnam=NAME) */
#undef PG_KRB_SRVNAM
+/* PostgreSQL major version as a string */
+#undef PG_MAJORVERSION
+
/* PostgreSQL version as a string */
#undef PG_VERSION
ldir = getenv("PGLOCALEDIR");
if (!ldir)
ldir = LOCALEDIR;
- bindtextdomain("ecpg", ldir);
+ bindtextdomain(PG_TEXTDOMAIN("ecpg"), ldir);
#ifdef WIN32
SetLastError(save_errno);
#else
#endif
}
- return dgettext("ecpg", msgid);
+ return dgettext(PG_TEXTDOMAIN("ecpg"), msgid);
}
#endif /* ENABLE_NLS */
char my_exec_path[MAXPGPATH];
char include_path[MAXPGPATH];
- set_pglocale_pgservice(argv[0], "ecpg");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("ecpg"));
progname = get_progname(argv[0]);
ldir = getenv("PGLOCALEDIR");
if (!ldir)
ldir = LOCALEDIR;
- bindtextdomain("libpq", ldir);
+ bindtextdomain(PG_TEXTDOMAIN("libpq"), ldir);
#ifdef WIN32
SetLastError(save_errno);
#else
#endif
}
- return dgettext("libpq", msgid);
+ return dgettext(PG_TEXTDOMAIN("libpq"), msgid);
}
#endif /* ENABLE_NLS */
endif # not XGETTEXT
+# catalog name extentions must match behavior of PG_TEXTDOMAIN() in c.h
install-po: all-po installdirs-po
ifneq (,$(LANGUAGES))
for lang in $(LANGUAGES); do \
- $(INSTALL_DATA) po/$$lang.mo '$(DESTDIR)$(localedir)'/$$lang/LC_MESSAGES/$(CATALOG_NAME).mo || exit 1; \
+ $(INSTALL_DATA) po/$$lang.mo '$(DESTDIR)$(localedir)'/$$lang/LC_MESSAGES/$(CATALOG_NAME)$(SO_MAJOR_VERSION)-$(MAJORVERSION).mo || exit 1; \
done
endif
$(mkinstalldirs) $(foreach lang, $(LANGUAGES), '$(DESTDIR)$(localedir)'/$(lang)/LC_MESSAGES)
uninstall-po:
- rm -f $(foreach lang, $(LANGUAGES), '$(DESTDIR)$(localedir)'/$(lang)/LC_MESSAGES/$(CATALOG_NAME).mo)
+ rm -f $(foreach lang, $(LANGUAGES), '$(DESTDIR)$(localedir)'/$(lang)/LC_MESSAGES/$(CATALOG_NAME)$(SO_MAJOR_VERSION)-$(MAJORVERSION).mo)
clean-po:
/* define our text domain for translations */
#undef TEXTDOMAIN
-#define TEXTDOMAIN "plperl"
+#define TEXTDOMAIN PG_TEXTDOMAIN("plperl")
/* perl stuff */
#include "plperl.h"
if (inited)
return;
- set_text_domain(TEXTDOMAIN);
+ pg_bindtextdomain(TEXTDOMAIN);
DefineCustomBoolVariable("plperl.use_strict",
gettext_noop("If true, will compile trusted and untrusted perl code in strict mode"),
if (inited)
return;
- set_text_domain(TEXTDOMAIN);
+ pg_bindtextdomain(TEXTDOMAIN);
plpgsql_HashTableInit();
RegisterXactCallback(plpgsql_xact_cb, NULL);
/* define our text domain for translations */
#undef TEXTDOMAIN
-#define TEXTDOMAIN "plpgsql"
+#define TEXTDOMAIN PG_TEXTDOMAIN("plpgsql")
/* ----------
* Compiler's namestack item types
/* define our text domain for translations */
#undef TEXTDOMAIN
-#define TEXTDOMAIN "plpython"
+#define TEXTDOMAIN PG_TEXTDOMAIN("plpython")
#include <compile.h>
#include <eval.h>
if (inited)
return;
- set_text_domain(TEXTDOMAIN);
+ pg_bindtextdomain(TEXTDOMAIN);
Py_Initialize();
PLy_init_interp();
/* define our text domain for translations */
#undef TEXTDOMAIN
-#define TEXTDOMAIN "pltcl"
+#define TEXTDOMAIN PG_TEXTDOMAIN("pltcl")
#if defined(UNICODE_CONVERSION) && HAVE_TCL_VERSION(8,1)
if (pltcl_pm_init_done)
return;
- set_text_domain(TEXTDOMAIN);
+ pg_bindtextdomain(TEXTDOMAIN);
#ifdef WIN32
/* Required on win32 to prevent error loading init.tcl */
* PGLOCALEDIR */
/* don't set LC_ALL in the backend */
- if (strcmp(app, "postgres") != 0)
+ if (strcmp(app, PG_TEXTDOMAIN("postgres")) != 0)
setlocale(LC_ALL, "");
if (find_my_exec(argv0, my_exec_path) < 0)
};
progname = get_progname(argv[0]);
- set_pglocale_pgservice(argv[0], "pg_regress");
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_regress"));
#ifndef HAVE_UNIX_SOCKETS
/* no unix domain sockets available, so change default */