On Wed, 2013-03-27 at 17:06 -0400, Tom Lane wrote: > Peter Eisentraut <pete...@gmx.net> writes: > > On 3/24/13 1:55 PM, Tom Lane wrote: > >> I experimented a bit with this version of the patch. The hunk that > >> removes -I$(libpq_srcdir) and $(libpq) from the ecpg/compatlib build > >> breaks the build for me, so I took it out. > > > What was the error message? Probably not important, but curious. > > ecpg's #include of libpq-fe.h failed. I speculate that you didn't > notice because you tested on a machine where libpq-fe.h exists in > /usr/include.
Right, we need to keep libpq in CPPFLAGS, but we can remove it from SHLIB_LINK. > >> At least for the libraries we are currently proposing to pkgconfig-ify, > >> it seems to me that we only want a -I for where we are installing our > >> own headers; there is no need for anything else. That is, > >> echo 'Cflags: -I$(includedir)' > >> seems like plenty. We aren't exposing any other packages' headers > >> in the public header files for these libraries, so there's no need > >> to tell client packages about them. > > > libpq exposes at least openssl and gssapi, so we need those at least. > > No, it does not. A client might choose to #include those of its own > accord, but then it's the client's problem. Our exported headers do > not #include anything more exotic than <stdio.h>, and it's not the > business of the pkg-config switches to provide for anything beyond > allowing inclusions of our headers to succeed. I was actually thinking of PQgetssl(), which is documented to require OpenSSL, but that was actually changed a long time ago and the documentation not updated. So actually you are right, we don't need to provided any extra -I flags (if we ignore libpq-int.h). We do need that whole logic for Libs.private however. So here is my updated patch, with the ecpg business changed as explained above, and the extra magic removed from the Cflags lines.
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 1a09c1c..3b6ada0 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..2a0c7a9 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,23 @@ $(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)' >>$@ + echo 'Cflags: -I$(includedir)' >>$@ + echo 'Libs: -L$(libdir) -l$(NAME)' >>$@ +# Record -L 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. 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 +449,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 +490,7 @@ endif installdirs-lib: ifdef soname - $(MKDIR_P) '$(DESTDIR)$(libdir)' + $(MKDIR_P) '$(DESTDIR)$(libdir)' '$(DESTDIR)$(pkgconfigdir)' else $(MKDIR_P) '$(DESTDIR)$(pkglibdir)' endif @@ -483,7 +506,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 +519,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..caa55e6 100644 --- a/src/interfaces/ecpg/compatlib/Makefile +++ b/src/interfaces/ecpg/compatlib/Makefile @@ -21,7 +21,7 @@ override CPPFLAGS := -I../include -I$(top_srcdir)/src/interfaces/ecpg/include \ -I$(libpq_srcdir) -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