On 1/15/13 6:53 PM, Tom Lane wrote:
> Peter Eisentraut <pete...@gmx.net> writes:
>> I'll take another stab at providing pkg-config files for the client-side
>> libraries.
> 
> This bit:
> 
>> +    echo 'Libs.private: $(filter-out 
>> $(PKG_CONFIG_REQUIRES_PRIVATE:lib%=-l%),$(filter-out -L..%, $(SHLIB_LINK)))' 
>> >>$@
> 
> appears to assume that SHLIB_LINK contains nothing except -L and -l
> switches.  I don't think I trust that a whole lot --- in fact, it
> looks guaranteed to fail on HPUX because of -print-libgcc-file-name.
> There might be other platform-specific bogosity on other platforms;
> PTHREAD_LIBS seems like a likely source for instance.

Updated patch addressing this concern.  Also added comments and
documentation.

diff --git a/.gitignore b/.gitignore
index 4df314c..8e227a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,6 +22,7 @@ lcov.info
 win32ver.rc
 *.exe
 lib*dll.def
+lib*.pc
 
 # Local excludes in root directory
 /GNUmakefile
diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml
index 4d904cd..68bcb13 100644
--- a/doc/src/sgml/ecpg.sgml
+++ b/doc/src/sgml/ecpg.sgml
@@ -5715,6 +5715,15 @@ <title>Processing Embedded SQL Programs</title>
   </para>
 
   <para>
+   You can
+   use 
<command>pg_config</command><indexterm><primary>pg_config</primary><secondary 
sortas="ecpg">with
+   ecpg</secondary></indexterm>
+   or 
<command>pkg-config</command><indexterm><primary>pkg-config</primary><secondary 
sortas="ecpg">with
+   ecpg</secondary></indexterm> with package name <literal>libecpg</literal> to
+   get the paths for your installation.
+  </para>
+
+  <para>
    If you manage the build process of a larger project using
    <application>make</application>, it might be convenient to include
    the following implicit rule to your makefiles:
diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml
index aa2ec2a..1794f9b 100644
--- a/doc/src/sgml/libpq.sgml
+++ b/doc/src/sgml/libpq.sgml
@@ -7641,6 +7641,18 @@ <title>Building <application>libpq</application> 
Programs</title>
      </para>
 
      <para>
+      If you
+      have 
<command>pkg-config</command><indexterm><primary>pkg-config</primary><secondary 
sortas="libpq">with
+      libpq</secondary></indexterm> installed, you can run instead:
+<screen>
+<prompt>$</prompt> pkg-config --cflags libpq
+<computeroutput>-I/usr/local/include</computeroutput>
+</screen>
+      Note that this will already include the <option>-I</option> in front of
+      the path.
+     </para>
+
+     <para>
       Failure to specify the correct option to the compiler will
       result in an error message such as:
 <screen>
@@ -7675,6 +7687,15 @@ <title>Building <application>libpq</application> 
Programs</title>
      </para>
 
      <para>
+      Or again use <command>pkg-config</command>:
+<screen>
+<prompt>$</prompt> pkg-config --libs libpq
+<computeroutput>-L/usr/local/pgsql/lib -lpq</computeroutput>
+</screen>
+      Note again that this prints the full options, not only the path.
+     </para>
+
+     <para>
       Error messages that point to problems in this area could look like
       the following:
 <screen>
diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index 4da2f10..2527fe9 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -87,6 +87,7 @@ shlib_bare    = lib$(NAME)$(DLSUFFIX)
 # Testing the soname variable is a reliable way to determine whether a
 # linkable library is being built.
 soname         = $(shlib_major)
+pkgconfigdir = $(libdir)/pkgconfig
 else
 # Naming convention for dynamically loadable modules
 shlib          = $(NAME)$(DLSUFFIX)
@@ -305,6 +306,7 @@ all-lib: all-shared-lib
 ifdef soname
 # no static library when building a dynamically loadable module
 all-lib: all-static-lib
+all-lib: lib$(NAME).pc
 endif
 
 all-static-lib: $(stlib)
@@ -388,6 +390,25 @@ $(stlib): $(shlib) $(DLL_DEFFILE) | $(SHLIB_PREREQS)
 endif # PORTNAME == cygwin || PORTNAME == win32
 
 
+%.pc: $(MAKEFILE_LIST)
+       echo 'Name: lib$(NAME)' >$@
+       echo 'Description: PostgreSQL lib$(NAME) library' >>$@
+       echo 'Url: http://www.postgresql.org/' >>$@
+       echo 'Version: $(VERSION)' >>$@
+       echo 'Requires: ' >>$@
+       echo 'Requires.private: $(PKG_CONFIG_REQUIRES_PRIVATE)' >>$@
+# Record -I flags that the user might have passed in to the PostgreSQL
+# build to locate third-party libraries (e.g., ldap, ssl).  Filter out
+# those that point inside the build or source tree.  Use sort to
+# remove duplicates.
+       echo 'Cflags: -I$(includedir) $(sort $(filter-out -I.% 
-I$(top_srcdir)/%,$(filter -I%,$(CPPFLAGS))))' >>$@
+       echo 'Libs: -L$(libdir) -l$(NAME)' >>$@
+# Record -L flags, as above for Cflags.  Also record the -l flags
+# necessary for static linking, but not those already covered by
+# Requires.private.
+       echo 'Libs.private: $(sort $(filter-out -L.% -L$(top_srcdir)/%,$(filter 
-L%,$(LDFLAGS) $(SHLIB_LINK)))) $(filter-out 
$(PKG_CONFIG_REQUIRES_PRIVATE:lib%=-l%),$(filter -l%,$(SHLIB_LINK)))' >>$@
+
+
 # We need several not-quite-identical variants of .DEF files to build
 # DLLs for Windows.  These are made from the single source file
 # exports.txt.  Since we can't assume that Windows boxes will have
@@ -430,8 +451,12 @@ endif # SHLIB_EXPORTS
 install-lib: install-lib-shared
 ifdef soname
 install-lib: install-lib-static
+install-lib: install-lib-pc
 endif
 
+install-lib-pc: lib$(NAME).pc installdirs-lib
+       $(INSTALL_DATA) $< '$(DESTDIR)$(pkgconfigdir)/lib$(NAME).pc'
+
 install-lib-static: $(stlib) installdirs-lib
        $(INSTALL_STLIB) $< '$(DESTDIR)$(libdir)/$(stlib)'
 ifeq ($(PORTNAME), darwin)
@@ -467,7 +492,7 @@ endif
 
 installdirs-lib:
 ifdef soname
-       $(MKDIR_P) '$(DESTDIR)$(libdir)'
+       $(MKDIR_P) '$(DESTDIR)$(libdir)' '$(DESTDIR)$(pkgconfigdir)'
 else
        $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'
 endif
@@ -483,7 +508,8 @@ ifdef soname
        rm -f '$(DESTDIR)$(libdir)/$(stlib)'
        rm -f '$(DESTDIR)$(libdir)/$(shlib_bare)' \
          '$(DESTDIR)$(libdir)/$(shlib_major)' \
-         '$(DESTDIR)$(libdir)/$(shlib)'
+         '$(DESTDIR)$(libdir)/$(shlib)' \
+         '$(DESTDIR)$(pkgconfigdir)/lib$(NAME).pc'
 else # no soname
        rm -f '$(DESTDIR)$(pkglibdir)/$(shlib)'
 endif # no soname
@@ -495,7 +521,7 @@ endif # no soname
 
 .PHONY: clean-lib
 clean-lib:
-       rm -f $(shlib) $(shlib_bare) $(shlib_major) $(stlib) $(exports_file)
+       rm -f $(shlib) $(shlib_bare) $(shlib_major) $(stlib) $(exports_file) 
lib$(NAME).pc
 
 ifneq (,$(SHLIB_EXPORTS))
 maintainer-clean-lib:
diff --git a/src/interfaces/ecpg/compatlib/Makefile 
b/src/interfaces/ecpg/compatlib/Makefile
index 00adcdb..6ae1493 100644
--- a/src/interfaces/ecpg/compatlib/Makefile
+++ b/src/interfaces/ecpg/compatlib/Makefile
@@ -18,10 +18,10 @@ SO_MAJOR_VERSION= 3
 SO_MINOR_VERSION= 5
 
 override CPPFLAGS := -I../include -I$(top_srcdir)/src/interfaces/ecpg/include \
-       -I$(libpq_srcdir) -I$(top_srcdir)/src/include/utils $(CPPFLAGS)
+       -I$(top_srcdir)/src/include/utils $(CPPFLAGS)
 override CFLAGS += $(PTHREAD_CFLAGS)
 
-SHLIB_LINK = -L../ecpglib -lecpg -L../pgtypeslib -lpgtypes $(libpq) \
+SHLIB_LINK = -L../ecpglib -lecpg -L../pgtypeslib -lpgtypes \
        $(filter -lintl -lm, $(LIBS)) $(PTHREAD_LIBS)
 SHLIB_PREREQS = submake-ecpglib submake-pgtypeslib
 
@@ -32,6 +32,8 @@ LIBS := $(filter-out -lpgport, $(LIBS))
 
 OBJS= informix.o $(filter snprintf.o, $(LIBOBJS))
 
+PKG_CONFIG_REQUIRES_PRIVATE = libecpg libpgtypes
+
 all: all-lib
 
 .PHONY: submake-ecpglib submake-pgtypeslib
diff --git a/src/interfaces/ecpg/ecpglib/Makefile 
b/src/interfaces/ecpg/ecpglib/Makefile
index 59d9caf..90d4b3e 100644
--- a/src/interfaces/ecpg/ecpglib/Makefile
+++ b/src/interfaces/ecpg/ecpglib/Makefile
@@ -43,6 +43,8 @@ ifeq ($(PORTNAME), win32)
 SHLIB_LINK += -lshfolder
 endif
 
+PKG_CONFIG_REQUIRES_PRIVATE = libpq libpgtypes
+
 all: all-lib
 
 .PHONY: submake-pgtypeslib
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to