提交 df163230 编写于 作者: A Andrew Gierth

Provide for contrib and pgxs modules to install include files.

This allows out-of-tree PLs and similar code to get access to
definitions needed to work with extension data types.

The following existing modules now install headers: contrib/cube,
contrib/hstore, contrib/isn, contrib/ltree, contrib/seg.

Discussion: https://postgr.es/m/87y3euomjh.fsf%40news-spur.riddles.org.uk
上级 f3eb76b3
...@@ -9,6 +9,8 @@ DATA = cube--1.2.sql cube--1.2--1.3.sql cube--1.3--1.4.sql \ ...@@ -9,6 +9,8 @@ DATA = cube--1.2.sql cube--1.2--1.3.sql cube--1.3--1.4.sql \
cube--unpackaged--1.0.sql cube--unpackaged--1.0.sql
PGFILEDESC = "cube - multidimensional cube data type" PGFILEDESC = "cube - multidimensional cube data type"
HEADERS = cubedata.h
REGRESS = cube REGRESS = cube
EXTRA_CLEAN = y.tab.c y.tab.h EXTRA_CLEAN = y.tab.c y.tab.h
......
...@@ -11,6 +11,8 @@ DATA = hstore--1.4.sql hstore--1.4--1.5.sql \ ...@@ -11,6 +11,8 @@ DATA = hstore--1.4.sql hstore--1.4--1.5.sql \
hstore--unpackaged--1.0.sql hstore--unpackaged--1.0.sql
PGFILEDESC = "hstore - key/value pair data type" PGFILEDESC = "hstore - key/value pair data type"
HEADERS = hstore.h
REGRESS = hstore REGRESS = hstore
ifdef USE_PGXS ifdef USE_PGXS
......
...@@ -7,6 +7,9 @@ DATA = isn--1.1.sql isn--1.1--1.2.sql \ ...@@ -7,6 +7,9 @@ DATA = isn--1.1.sql isn--1.1--1.2.sql \
isn--1.0--1.1.sql isn--unpackaged--1.0.sql isn--1.0--1.1.sql isn--unpackaged--1.0.sql
PGFILEDESC = "isn - data types for international product numbering standards" PGFILEDESC = "isn - data types for international product numbering standards"
# the other .h files are data tables, we don't install those
HEADERS_isn = isn.h
REGRESS = isn REGRESS = isn
ifdef USE_PGXS ifdef USE_PGXS
......
...@@ -9,6 +9,8 @@ EXTENSION = ltree ...@@ -9,6 +9,8 @@ EXTENSION = ltree
DATA = ltree--1.1.sql ltree--1.0--1.1.sql ltree--unpackaged--1.0.sql DATA = ltree--1.1.sql ltree--1.0--1.1.sql ltree--unpackaged--1.0.sql
PGFILEDESC = "ltree - hierarchical label data type" PGFILEDESC = "ltree - hierarchical label data type"
HEADERS = ltree.h
REGRESS = ltree REGRESS = ltree
ifdef USE_PGXS ifdef USE_PGXS
......
...@@ -8,6 +8,8 @@ DATA = seg--1.1.sql seg--1.1--1.2.sql seg--1.2--1.3.sql \ ...@@ -8,6 +8,8 @@ DATA = seg--1.1.sql seg--1.1--1.2.sql seg--1.2--1.3.sql \
seg--1.0--1.1.sql seg--unpackaged--1.0.sql seg--1.0--1.1.sql seg--unpackaged--1.0.sql
PGFILEDESC = "seg - line segment data type" PGFILEDESC = "seg - line segment data type"
HEADERS = segdata.h
REGRESS = seg REGRESS = seg
EXTRA_CLEAN = y.tab.c y.tab.h EXTRA_CLEAN = y.tab.c y.tab.h
......
...@@ -1100,13 +1100,15 @@ include $(PGXS) ...@@ -1100,13 +1100,15 @@ include $(PGXS)
and include the global <acronym>PGXS</acronym> makefile. and include the global <acronym>PGXS</acronym> makefile.
Here is an example that builds an extension module named Here is an example that builds an extension module named
<literal>isbn_issn</literal>, consisting of a shared library containing <literal>isbn_issn</literal>, consisting of a shared library containing
some C code, an extension control file, a SQL script, and a documentation some C code, an extension control file, a SQL script, an include file
text file: (only needed if other modules might need to access the extension functions
without going via SQL), and a documentation text file:
<programlisting> <programlisting>
MODULES = isbn_issn MODULES = isbn_issn
EXTENSION = isbn_issn EXTENSION = isbn_issn
DATA = isbn_issn--1.0.sql DATA = isbn_issn--1.0.sql
DOCS = README.isbn_issn DOCS = README.isbn_issn
HEADERS_isbn_issn = isbn_issn.h
PG_CONFIG = pg_config PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs) PGXS := $(shell $(PG_CONFIG) --pgxs)
...@@ -1220,6 +1222,28 @@ include $(PGXS) ...@@ -1220,6 +1222,28 @@ include $(PGXS)
</listitem> </listitem>
</varlistentry> </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> <varlistentry>
<term><varname>SCRIPTS</varname></term> <term><varname>SCRIPTS</varname></term>
<listitem> <listitem>
......
...@@ -38,6 +38,10 @@ ...@@ -38,6 +38,10 @@
# SCRIPTS -- script files (not binaries) to install into $PREFIX/bin # SCRIPTS -- script files (not binaries) to install into $PREFIX/bin
# SCRIPTS_built -- 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 # 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 -- list of regression test cases (without suffix)
# REGRESS_OPTS -- additional switches to pass to pg_regress # REGRESS_OPTS -- additional switches to pass to pg_regress
# NO_INSTALLCHECK -- don't define an installcheck target, useful e.g. if # NO_INSTALLCHECK -- don't define an installcheck target, useful e.g. if
...@@ -94,13 +98,16 @@ endif ...@@ -94,13 +98,16 @@ endif
ifdef MODULEDIR ifdef MODULEDIR
datamoduledir := $(MODULEDIR) datamoduledir := $(MODULEDIR)
docmoduledir := $(MODULEDIR) docmoduledir := $(MODULEDIR)
incmoduledir := $(MODULEDIR)
else else
ifdef EXTENSION ifdef EXTENSION
datamoduledir := extension datamoduledir := extension
docmoduledir := extension docmoduledir := extension
incmoduledir := extension
else else
datamoduledir := contrib datamoduledir := contrib
docmoduledir := contrib docmoduledir := contrib
incmoduledir := contrib
endif endif
endif endif
...@@ -108,6 +115,43 @@ ifdef PG_CPPFLAGS ...@@ -108,6 +115,43 @@ ifdef PG_CPPFLAGS
override CPPFLAGS := $(PG_CPPFLAGS) $(CPPFLAGS) override CPPFLAGS := $(PG_CPPFLAGS) $(CPPFLAGS)
endif 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)) all: $(PROGRAM) $(DATA_built) $(SCRIPTS_built) $(addsuffix $(DLSUFFIX), $(MODULES)) $(addsuffix .control, $(EXTENSION))
ifeq ($(with_llvm), yes) ifeq ($(with_llvm), yes)
...@@ -154,6 +198,9 @@ endif # SCRIPTS ...@@ -154,6 +198,9 @@ endif # SCRIPTS
ifdef SCRIPTS_built ifdef SCRIPTS_built
$(INSTALL_SCRIPT) $(SCRIPTS_built) '$(DESTDIR)$(bindir)/' $(INSTALL_SCRIPT) $(SCRIPTS_built) '$(DESTDIR)$(bindir)/'
endif # SCRIPTS_built 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 ifdef MODULE_big
ifeq ($(with_llvm), yes) ifeq ($(with_llvm), yes)
$(call install_llvm_module,$(MODULE_big),$(OBJS)) $(call install_llvm_module,$(MODULE_big),$(OBJS))
...@@ -218,6 +265,9 @@ endif ...@@ -218,6 +265,9 @@ endif
ifdef SCRIPTS_built ifdef SCRIPTS_built
rm -f $(addprefix '$(DESTDIR)$(bindir)'/, $(SCRIPTS_built)) rm -f $(addprefix '$(DESTDIR)$(bindir)'/, $(SCRIPTS_built))
endif endif
ifneq ($(strip $(HEADER_dirs)),)
$(foreach dir,$(HEADER_dirs),$(if $(HEADERS_$(dir)),$(call uninstall_headers,$(dir),$(HEADERS_$(dir)))))
endif # HEADERS
ifdef MODULE_big ifdef MODULE_big
ifeq ($(with_llvm), yes) ifeq ($(with_llvm), yes)
......
...@@ -554,6 +554,49 @@ sub CopySubdirFiles ...@@ -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 = ''; $flist = '';
if ($mf =~ /^DOCS\s*=\s*(.*)$/mg) { $flist .= $1 } if ($mf =~ /^DOCS\s*=\s*(.*)$/mg) { $flist .= $1 }
if ($flist ne '') if ($flist ne '')
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册