From: Andrew Gierth <andrew@tao11.riddles.org.uk>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Peter Eisentraut <peter.eisentraut@2ndquadrant.com>
Cc: pgsql-hackers@postgresql.org, Andres Freund <andres@anarazel.de>
Subject: Re: Should contrib modules install .h files?
Date: Thu, 05 Jul 2018 15:25:24 +0100
Message-ID: <87a7r5n4n2.fsf@news-spur.riddles.org.uk> (raw)
In-Reply-To: <87efghn7js.fsf@news-spur.riddles.org.uk>
References: <87y3euomjh.fsf@news-spur.riddles.org.uk>
<ee05ea4c-3d5b-0ec6-8daa-3ec66f021076@2ndquadrant.com>
<87tvpinfr4.fsf@news-spur.riddles.org.uk>
<63444.1530537990@sss.pgh.pa.us>
<87lgatohzp.fsf@news-spur.riddles.org.uk>
<63655.1530540982@sss.pgh.pa.us>
<87h8lhoevw.fsf@news-spur.riddles.org.uk>
<63819.1530544945@sss.pgh.pa.us>
<878t6to8j9.fsf@news-spur.riddles.org.uk>
<874lhho071.fsf@news-spur.riddles.org.uk>
<67427.1530738056@sss.pgh.pa.us>
<87po02m0bh.fsf@news-spur.riddles.org.uk>
<87in5tnafh.fsf@news-spur.riddles.org.uk>
<87efghn7js.fsf@news-spur.riddles.org.uk>
>>>>> "Andrew" == Andrew Gierth <andrew@tao11.riddles.org.uk> writes:
Andrew> Patch with docs (including an example) and Install.pm changes
Andrew> (blind). I'll stick this in the open CF to see what cfbot
Andrew> thinks of it.
Andrew> Meh. Oversight in handling empty or missing vars. Also
Andrew> incorrect dir in msvc version. Fixed I hope.
Take 3 for the windows version: don't assume the directories exist
because contrib install is done before the main include files stuff.
--
Andrew (irc:RhodiumToad)
Attachments:contrib_includes_5.patch (text/x-patch, 6.8K) downloaddiff --git a/contrib/hstore/Makefile b/contrib/hstore/Makefileindex ab7fef3979..46d26f8052 100644--- a/contrib/hstore/Makefile+++ b/contrib/hstore/Makefile@@ -11,6 +11,8 @@ DATA = hstore--1.4.sql hstore--1.4--1.5.sql \
hstore--unpackaged--1.0.sql
PGFILEDESC = "hstore - key/value pair data type"
+HEADERS = hstore.h+
REGRESS = hstore
ifdef USE_PGXS
diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgmlindex 348ae71423..a3cb064131 100644--- a/doc/src/sgml/extend.sgml+++ b/doc/src/sgml/extend.sgml@@ -1100,13 +1100,15 @@ include $(PGXS)
and include the global <acronym>PGXS</acronym> makefile.
Here is an example that builds an extension module named
<literal>isbn_issn</literal>, consisting of a shared library containing
- some C code, an extension control file, a SQL script, and a documentation- text file:+ some C code, an extension control file, a SQL script, an include file+ (only needed if other modules might need to access the extension functions+ without going via SQL), and a documentation text file:
<programlisting>
MODULES = isbn_issn
EXTENSION = isbn_issn
DATA = isbn_issn--1.0.sql
DOCS = README.isbn_issn
+HEADERS_isbn_issn = isbn_issn.h
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
@@ -1221,6 +1223,28 @@ include $(PGXS)
</varlistentry>
<varlistentry>
+ <term><varname>HEADERS</varname></term>+ <listitem>+ <para>+ files to install under+ <literal><replaceable>prefix</replaceable>/include/server/$MODULEDIR/$MODULE_big</literal>+ </para>+ </listitem>+ </varlistentry>++ <varlistentry>+ <term><varname>HEADERS_$MODULE</varname></term>+ <listitem>+ <para>+ files to install under+ <literal><replaceable>prefix</replaceable>/include/server/$MODULEDIR/$MODULE</literal>,+ where <literal>$MODULE</literal> must be a module name used+ in <literal>MODULES</literal> or <literal>MODULE_big</literal>+ </para>+ </listitem>+ </varlistentry>++ <varlistentry>
<term><varname>SCRIPTS</varname></term>
<listitem>
<para>
diff --git a/src/makefiles/pgxs.mk b/src/makefiles/pgxs.mkindex bfae02f90c..158581b3f5 100644--- a/src/makefiles/pgxs.mk+++ b/src/makefiles/pgxs.mk@@ -38,6 +38,10 @@
# SCRIPTS -- script files (not binaries) to install into $PREFIX/bin
# SCRIPTS_built -- script files (not binaries) to install into $PREFIX/bin,
# which need to be built first
+# HEADERS -- files to install into $(includedir_server)/$MODULEDIR/$MODULE_big+# HEADERS_$(MODULE) -- files to install into+# $(includedir_server)/$MODULEDIR/$MODULE; the value of $MODULE must be+# listed in MODULES or MODULE_big
# REGRESS -- list of regression test cases (without suffix)
# REGRESS_OPTS -- additional switches to pass to pg_regress
# NO_INSTALLCHECK -- don't define an installcheck target, useful e.g. if
@@ -94,13 +98,16 @@ endif
ifdef MODULEDIR
datamoduledir := $(MODULEDIR)
docmoduledir := $(MODULEDIR)
+incmoduledir := $(MODULEDIR)
else
ifdef EXTENSION
datamoduledir := extension
docmoduledir := extension
+incmoduledir := extension
else
datamoduledir := contrib
docmoduledir := contrib
+incmoduledir := contrib
endif
endif
@@ -108,6 +115,43 @@ ifdef PG_CPPFLAGS
override CPPFLAGS := $(PG_CPPFLAGS) $(CPPFLAGS)
endif
+HEADER_alldirs := $(patsubst HEADERS_%,%,$(filter HEADERS_%, $(.VARIABLES)))++# HEADERS is an error in the absence of MODULE_big to provide a dir name+ifdef MODULE_big+ifdef HEADERS+HEADER_dirs := $(MODULE_big)+HEADERS_$(MODULE_big) = $(HEADERS)+else+HEADER_dirs := $(filter $(MODULE_big),$(HEADER_alldirs))+endif+else+ifdef HEADERS+$(error HEADERS requires MODULE_big to be set)+endif+HEADER_dirs := $(filter $(MODULES),$(HEADER_alldirs))+endif++# HEADERS_foo requires that "foo" is in MODULES as a sanity check+ifneq ($(filter-out $(HEADER_dirs),$(HEADER_alldirs)),)+$(error $(patsubst %,HEADERS_%,$(filter-out $(HEADER_dirs),$(HEADER_alldirs))) defined with no module)+endif++# Functions for generating install/uninstall commands; the blank lines+# before the "endef" are required, don't lose them+# $(call install_headers,dir,headers)+define install_headers+$(MKDIR_P) '$(DESTDIR)$(includedir_server)/$(incmoduledir)/$(1)/'+$(INSTALL_DATA) $(addprefix $(srcdir)/, $(2)) '$(DESTDIR)$(includedir_server)/$(incmoduledir)/$(1)/'++endef+# $(call uninstall_headers,dir,headers)+define uninstall_headers+rm -f $(addprefix '$(DESTDIR)$(includedir_server)/$(incmoduledir)/$(1)'/, $(notdir $(2)))++endef++
all: $(PROGRAM) $(DATA_built) $(SCRIPTS_built) $(addsuffix $(DLSUFFIX), $(MODULES)) $(addsuffix .control, $(EXTENSION))
ifeq ($(with_llvm), yes)
@@ -154,6 +198,9 @@ endif # SCRIPTS
ifdef SCRIPTS_built
$(INSTALL_SCRIPT) $(SCRIPTS_built) '$(DESTDIR)$(bindir)/'
endif # SCRIPTS_built
+ifneq ($(strip $(HEADER_dirs)),)+ $(foreach dir,$(HEADER_dirs),$(if $(HEADERS_$(dir)),$(call install_headers,$(dir),$(HEADERS_$(dir)))))+endif # HEADERS
ifdef MODULE_big
ifeq ($(with_llvm), yes)
$(call install_llvm_module,$(MODULE_big),$(OBJS))
@@ -218,6 +265,9 @@ endif
ifdef SCRIPTS_built
rm -f $(addprefix '$(DESTDIR)$(bindir)'/, $(SCRIPTS_built))
endif
+ifneq ($(strip $(HEADER_dirs)),)+ $(foreach dir,$(HEADER_dirs),$(if $(HEADERS_$(dir)),$(call uninstall_headers,$(dir),$(HEADERS_$(dir)))))+endif # HEADERS
ifdef MODULE_big
ifeq ($(with_llvm), yes)
diff --git a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pmindex 429608fde6..60b5639df8 100644--- a/src/tools/msvc/Install.pm+++ b/src/tools/msvc/Install.pm@@ -554,6 +554,49 @@ sub CopySubdirFiles
}
}
+ {+ $flist = '';+ if ($mf =~ /^HEADERS\s*=\s*(.*)$/m) { $flist .= $1 }+ my @modlist = ();+ my %fmodlist = ();+ while ($mf =~ /^HEADERS_([^\s=]+)\s*=\s*(.*)$/mg) { $fmodlist{$1} .= $2 }++ if ($mf =~ /^MODULE_big\s*=\s*(.*)$/m)+ {+ push @modlist, $1;+ if ($flist ne '')+ {+ $fmodlist{$1} = $flist;+ $flist = '';+ }+ }+ elsif ($mf =~ /^MODULES\s*=\s*(.*)$/m)+ {+ push @modlist, split /\s+/, $1;+ }++ croak "HEADERS requires MODULE_big in $subdir $module"+ if $flist ne '';++ foreach my $mod (keys %fmodlist)+ {+ croak "HEADERS_$mod for unknown module in $subdir $module"+ unless grep { $_ eq $mod } @modlist;+ $flist = ParseAndCleanRule($fmodlist{$mod}, $mf);+ EnsureDirectories($target,+ "include", "include/server",+ "include/server/$moduledir",+ "include/server/$moduledir/$mod");+ foreach my $f (split /\s+/, $flist)+ {+ lcopy("$subdir/$module/$f",+ "$target/include/server/$moduledir/$mod/" . basename($f))+ || croak("Could not copy file $f in $subdir $module");+ print '.';+ }+ }+ }+
$flist = '';
if ($mf =~ /^DOCS\s*=\s*(.*)$/mg) { $flist .= $1 }
if ($flist ne '')
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: andrew@tao11.riddles.org.uk, tgl@sss.pgh.pa.us, peter.eisentraut@2ndquadrant.com, andres@anarazel.de
Subject: Re: Should contrib modules install .h files?
In-Reply-To: <87a7r5n4n2.fsf@news-spur.riddles.org.uk>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox