From 24d1280c4d75038f130495a25844c60d6810faab Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 11 Feb 2011 22:53:43 -0500 Subject: [PATCH] Clean up installation directory choices for extensions. Arrange for the control files to be in $SHAREDIR/extension not $SHAREDIR/contrib, since we're generally trying to deprecate the term "contrib" and this is a once-in-many-moons opportunity to get rid of it in install paths. Fix PGXS to install the $EXTENSION file into that directory no matter what MODULEDIR is set to; a nondefault MODULEDIR should only affect the script and secondary extension files. Fix the control file directory parameter to be interpreted relative to $SHAREDIR, to avoid a surprising disconnect between how you specify that and what you set MODULEDIR to. Per discussion with David Wheeler. --- doc/src/sgml/extend.sgml | 33 +++++++++++++----------- doc/src/sgml/ref/create_extension.sgml | 2 +- src/backend/commands/extension.c | 9 +++---- src/makefiles/pgxs.mk | 35 ++++++++++++++++++-------- 4 files changed, 49 insertions(+), 30 deletions(-) diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgml index 93bcba9a10..90248e59e7 100644 --- a/doc/src/sgml/extend.sgml +++ b/doc/src/sgml/extend.sgml @@ -365,13 +365,13 @@ The command relies on a control file for each extension, which must be named the same as the extension with a suffix of .control, and must be placed in the - installation's SHAREDIR/contrib directory. There + installation's SHAREDIR/extension directory. There must also be at least one SQL script file, which follows the naming pattern extension-version.sql (for example, foo-1.0.sql for version 1.0 of extension foo). By default, the script file(s) are also - placed in the SHAREDIR/contrib directory; but the + placed in the SHAREDIR/extension directory; but the control file can specify a different directory for the script file(s). @@ -395,7 +395,9 @@ The directory containing the extension's SQL script file(s). Unless an absolute path is given, the name is relative to - the SHAREDIR/contrib directory. + the installation's SHAREDIR directory. The + default behavior is equivalent to specifying + directory = 'extension'. @@ -904,16 +906,6 @@ include $(PGXS) The following variables can also be set: - - MODULEDIR - - - subdirectory into which EXTENSION, DATA and DOCS files should be - installed (if not set, default is contrib) - - - - EXTENSION @@ -921,7 +913,20 @@ include $(PGXS) extension name(s); for each name you must provide an extension.control file, which will be installed into - prefix/share/$MODULEDIR + prefix/share/extension + + + + + + MODULEDIR + + + subdirectory of prefix/share + into which DATA and DOCS files should be installed + (if not set, default is extension if + EXTENSION is set, + or contrib if not) diff --git a/doc/src/sgml/ref/create_extension.sgml b/doc/src/sgml/ref/create_extension.sgml index 9e0e3c440b..d3b5fb009b 100644 --- a/doc/src/sgml/ref/create_extension.sgml +++ b/doc/src/sgml/ref/create_extension.sgml @@ -67,7 +67,7 @@ CREATE EXTENSION extension_name The name of the extension to be installed. PostgreSQL will create the extension using details from the file - SHAREDIR/contrib/extension.control. + SHAREDIR/extension/extension_name.control. diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 5d8b36b096..702f24a35d 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -278,7 +278,7 @@ get_extension_control_directory(void) get_share_path(my_exec_path, sharepath); result = (char *) palloc(MAXPGPATH); - snprintf(result, MAXPGPATH, "%s/contrib", sharepath); + snprintf(result, MAXPGPATH, "%s/extension", sharepath); return result; } @@ -291,7 +291,7 @@ get_extension_control_filename(const char *extname) get_share_path(my_exec_path, sharepath); result = (char *) palloc(MAXPGPATH); - snprintf(result, MAXPGPATH, "%s/contrib/%s.control", + snprintf(result, MAXPGPATH, "%s/extension/%s.control", sharepath, extname); return result; @@ -305,7 +305,7 @@ get_extension_script_directory(ExtensionControlFile *control) /* * The directory parameter can be omitted, absolute, or relative to the - * control-file directory. + * installation's share directory. */ if (!control->directory) return get_extension_control_directory(); @@ -315,8 +315,7 @@ get_extension_script_directory(ExtensionControlFile *control) get_share_path(my_exec_path, sharepath); result = (char *) palloc(MAXPGPATH); - snprintf(result, MAXPGPATH, "%s/contrib/%s", - sharepath, control->directory); + snprintf(result, MAXPGPATH, "%s/%s", sharepath, control->directory); return result; } diff --git a/src/makefiles/pgxs.mk b/src/makefiles/pgxs.mk index 655c5f9e38..412bf5c930 100644 --- a/src/makefiles/pgxs.mk +++ b/src/makefiles/pgxs.mk @@ -25,9 +25,10 @@ # # The following variables can also be set: # -# MODULEDIR -- subdirectory into which EXTENSION, DATA and DOCS files -# should be installed (if not set, default is "contrib") # EXTENSION -- name of extension (there must be a $EXTENSION.control file) +# MODULEDIR -- subdirectory of $PREFIX/share into which DATA and DOCS files +# should be installed (if not set, default is "extension" if EXTENSION +# is set, or "contrib" if not) # DATA -- random files to install into $PREFIX/share/$MODULEDIR # DATA_built -- random files to install into $PREFIX/share/$MODULEDIR, # which need to be built first @@ -72,11 +73,16 @@ override CFLAGS += $(CFLAGS_SL) endif ifdef MODULEDIR -datamoduledir = $(MODULEDIR) -docmoduledir = $(MODULEDIR) +datamoduledir := $(MODULEDIR) +docmoduledir := $(MODULEDIR) else -datamoduledir = contrib -docmoduledir = contrib +ifdef EXTENSION +datamoduledir := extension +docmoduledir := extension +else +datamoduledir := contrib +docmoduledir := contrib +endif endif ifdef PG_CPPFLAGS @@ -96,8 +102,14 @@ endif # MODULE_big install: all installdirs -ifneq (,$(DATA)$(DATA_built)$(EXTENSION)) - @for file in $(addprefix $(srcdir)/, $(DATA)) $(DATA_built) $(addsuffix .control, $(EXTENSION)); do \ +ifneq (,$(EXTENSION)) + @for file in $(addprefix $(srcdir)/, $(addsuffix .control, $(EXTENSION))); do \ + echo "$(INSTALL_DATA) $$file '$(DESTDIR)$(datadir)/extension'"; \ + $(INSTALL_DATA) $$file '$(DESTDIR)$(datadir)/extension'; \ + done +endif # EXTENSION +ifneq (,$(DATA)$(DATA_built)) + @for file in $(addprefix $(srcdir)/, $(DATA)) $(DATA_built); do \ echo "$(INSTALL_DATA) $$file '$(DESTDIR)$(datadir)/$(datamoduledir)'"; \ $(INSTALL_DATA) $$file '$(DESTDIR)$(datadir)/$(datamoduledir)'; \ done @@ -168,8 +180,11 @@ endif # MODULE_big uninstall: -ifneq (,$(DATA)$(DATA_built)$(EXTENSION)) - rm -f $(addprefix '$(DESTDIR)$(datadir)/$(datamoduledir)'/, $(notdir $(DATA) $(DATA_built) $(addsuffix .control, $(EXTENSION)))) +ifneq (,$(EXTENSION)) + rm -f $(addprefix '$(DESTDIR)$(datadir)/extension'/, $(notdir $(addsuffix .control, $(EXTENSION)))) +endif +ifneq (,$(DATA)$(DATA_built)) + rm -f $(addprefix '$(DESTDIR)$(datadir)/$(datamoduledir)'/, $(notdir $(DATA) $(DATA_built))) endif ifneq (,$(DATA_TSEARCH)) rm -f $(addprefix '$(DESTDIR)$(datadir)/tsearch_data'/, $(notdir $(DATA_TSEARCH)))