From 24d1280c4d75038f130495a25844c60d6810faab Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> 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 | 27 ++++++++++++-------- doc/src/sgml/ref/create_extension.sgml | 2 +- src/backend/commands/extension.c | 9 +++---- src/makefiles/pgxs.mk | 35 ++++++++++++++++++-------- 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgml index 93bcba9a10c..90248e59e78 100644 --- a/doc/src/sgml/extend.sgml +++ b/doc/src/sgml/extend.sgml @@ -365,13 +365,13 @@ The <xref linkend="sql-createextension"> command relies on a control file for each extension, which must be named the same as the extension with a suffix of <literal>.control</>, and must be placed in the - installation's <literal>SHAREDIR/contrib</literal> directory. There + installation's <literal>SHAREDIR/extension</literal> directory. There must also be at least one <acronym>SQL</> script file, which follows the naming pattern <literal><replaceable>extension</>-<replaceable>version</>.sql</literal> (for example, <literal>foo-1.0.sql</> for version <literal>1.0</> of extension <literal>foo</>). By default, the script file(s) are also - placed in the <literal>SHAREDIR/contrib</literal> directory; but the + placed in the <literal>SHAREDIR/extension</literal> directory; but the control file can specify a different directory for the script file(s). </para> @@ -395,7 +395,9 @@ <para> The directory containing the extension's <acronym>SQL</> script file(s). Unless an absolute path is given, the name is relative to - the <literal>SHAREDIR/contrib</literal> directory. + the installation's <literal>SHAREDIR</literal> directory. The + default behavior is equivalent to specifying + <literal>directory = 'extension'</>. </para> </listitem> </varlistentry> @@ -905,23 +907,26 @@ include $(PGXS) <variablelist> <varlistentry> - <term><varname>MODULEDIR</varname></term> + <term><varname>EXTENSION</varname></term> <listitem> <para> - subdirectory into which EXTENSION, DATA and DOCS files should be - installed (if not set, default is <literal>contrib</literal>) + extension name(s); for each name you must provide an + <literal><replaceable>extension</replaceable>.control</literal> file, + which will be installed into + <literal><replaceable>prefix</replaceable>/share/extension</literal> </para> </listitem> </varlistentry> <varlistentry> - <term><varname>EXTENSION</varname></term> + <term><varname>MODULEDIR</varname></term> <listitem> <para> - extension name(s); for each name you must provide an - <literal><replaceable>extension</replaceable>.control</literal> file, - which will be installed into - <literal><replaceable>prefix</replaceable>/share/$MODULEDIR</literal> + subdirectory of <literal><replaceable>prefix</>/share</literal> + into which DATA and DOCS files should be installed + (if not set, default is <literal>extension</literal> if + <varname>EXTENSION</varname> is set, + or <literal>contrib</literal> if not) </para> </listitem> </varlistentry> diff --git a/doc/src/sgml/ref/create_extension.sgml b/doc/src/sgml/ref/create_extension.sgml index 9e0e3c440b6..d3b5fb009b3 100644 --- a/doc/src/sgml/ref/create_extension.sgml +++ b/doc/src/sgml/ref/create_extension.sgml @@ -67,7 +67,7 @@ CREATE EXTENSION <replaceable class="parameter">extension_name</replaceable> The name of the extension to be installed. <productname>PostgreSQL</productname> will create the extension using details from the file - <literal>SHAREDIR/contrib/</literal><replaceable class="parameter">extension</replaceable><literal>.control</literal>. + <literal>SHAREDIR/extension/</literal><replaceable class="parameter">extension_name</replaceable><literal>.control</literal>. </para> </listitem> </varlistentry> diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 5d8b36b0966..702f24a35d5 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 655c5f9e382..412bf5c9301 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))) -- GitLab