Обсуждение: pg_config
Peter Eisentraut wrote:
>Andrew Dunstan wrote:
>
>
>>To that extent is it not broken by relocated installations that we
>>have now made some provision for?
>>
>>
>
>Well, then it should be fixed to take relocated installations into
>account.
>
>Relocatable installations are by nature a pretty broken feature. When
>you use pg_config to locate, say, libpq, then compile your third-party
>package, and then move libpq somewhere else, nothing can save you
>(except moving libpq back). At least on Unix, relocatable
>installations are a walking cane when you need parallel installations
>for upgrades, but they'll never work reliably in general.
>
>
>
Of course, if you rely on pg_config and then move the installation you
will put a very large hole in your foot. But we can't make things
totally idiot-proof - they will just build a better idiot.
Here is an attempt to do the Right Thing (tm) in C.
cheers
andrew
Index: Makefile
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/pg_config/Makefile,v
retrieving revision 1.6
diff -c -r1.6 Makefile
*** Makefile 29 Nov 2003 19:52:04 -0000 1.6
--- Makefile 20 Jul 2004 20:05:12 -0000
***************
*** 4,24 ****
top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
! all: pg_config
! pg_config: pg_config.sh $(top_builddir)/src/Makefile.global Makefile
! sed -e 's,@bindir@,$(bindir),g' \
! -e 's,@includedir@,$(includedir),g' \
! -e 's,@includedir_server@,$(includedir_server),g' \
! -e 's,@libdir@,$(libdir),g' \
! -e 's,@pkglibdir@,$(pkglibdir),g' \
! -e "s|@configure@|$(configure_args)|g" \
! -e 's,@version@,$(VERSION),g' \
! $< >$@
! chmod a+x $@
install: all installdirs
! $(INSTALL_SCRIPT) pg_config $(DESTDIR)$(bindir)/pg_config
installdirs:
$(mkinstalldirs) $(DESTDIR)$(bindir)
--- 4,23 ----
top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
! OBJS= pg_config.o exec.o
! override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) -DVAL_CONFIGURE="\"$(configure_args)\"" $(CPPFLAGS)
!
! all: submake-libpgport pg_config
!
! exec.c: % : $(top_srcdir)/src/port/%
! rm -f $@ && $(LN_S) $< .
!
! pg_config: $(OBJS)
! $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LIBS) -o $@$(X)
install: all installdirs
! $(INSTALL_SCRIPT) pg_config((X) $(DESTDIR)$(bindir)/pg_config$(X)
installdirs:
$(mkinstalldirs) $(DESTDIR)$(bindir)
***************
*** 27,30 ****
rm -f $(DESTDIR)$(bindir)/pg_config
clean distclean maintainer-clean:
! rm -f pg_config
--- 26,29 ----
rm -f $(DESTDIR)$(bindir)/pg_config
clean distclean maintainer-clean:
! rm -f pg_config$(X) $(OBJS)
/*-------------------------------------------------------------------------
*
* pg_config.c
*
* This program reports various pieces of information about the
* installed version of PostgreSQL. Packages that interface to
* PostgreSQL can use it to configure their build.
*
* This is a C implementation of the previous shell script written by
* Peter Eisentraut <peter_e@gmx.net>, with adjustments made to
* accomodate the possibility that the installation has been relocated from
* the place originally configured.
*
* author of C translation: Andrew Dunstan mailto:andrew@dunslane.net
*
* This code is released under the terms of the PostgreSQL License.
*
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
*
* $PostgreSQL:$
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "port.h"
#include <stdio.h>
#define _(x) gettext((x))
char * progname;
static void
help()
{
printf(_("\n%s provides information about the installed version of PostgreSQL.\n\n"),progname);
printf(_("Usage:\n"));
printf(_(" %s OPTION...\n\n"),progname);
printf(_("Options:\n"));
printf(_(" --bindir show location of user executables\n"));
printf(_(" --includedir show location of C header files of the client\n"));
printf(_(" interfaces\n"));
printf(_(" --includedir-server show location of C header files for the server\n"));
printf(_(" --libdir show location of object code libraries\n"));
printf(_(" --pkglibdir show location of dynamically loadable modules\n"));
printf(_(" --configure show options given to 'configure' script when\n"));
printf(_(" PostgreSQL was built\n"));
printf(_(" --version show the PostgreSQL version, then exit\n"));
printf(_(" --help show this help, then exit\n\n"));
printf(_("Report bugs to <pgsql-bugs@postgresql.org>.\n"));
}
static void
advice()
{
fprintf(stderr,_("\nTry \"%s --help\" for more information\n"),progname);
}
int
main (int argc, char ** argv)
{
int i;
int ret;
char mypath[MAXPGPATH];
char otherpath[MAXPGPATH];
progname = (char *)get_progname(argv[0]);
if (argc < 2)
{
fprintf(stderr,_("%s: argument required\n"),progname);
advice();
exit(1);
}
for (i=1; i < argc; i++)
{
if (strcmp(argv[i],"--bindir") == 0 ||
strcmp(argv[i],"--includedir") == 0 ||
strcmp(argv[i],"--includedir-server") == 0 ||
strcmp(argv[i],"--libdir") == 0 ||
strcmp(argv[i],"--pkglibdir") == 0 ||
strcmp(argv[i],"--configure") == 0
)
{
/* come back to these later */
continue;
}
if (strcmp(argv[i],"--version") == 0)
{
printf("PostgreSQL " PG_VERSION "\n");
exit(0);
}
if (strcmp(argv[i],"--help") == 0 || strcmp(argv[i],"-?") == 0)
{
help();
exit(0);
}
fprintf(stderr,_("%s: invalid argument: %s\n"),progname,argv[i]);
advice();
exit(1);
}
ret = find_my_exec(argv[0],mypath);
if (ret)
{
fprintf(stderr,"%s: could not locate my own executable\n",progname);
exit(1);
}
for (i=1; i < argc; i++)
{
if (strcmp(argv[i],"--configure") == 0)
{
/* the VAL_CONFIGURE macro must be defined by the Makefile */
printf("%s\n",VAL_CONFIGURE);
continue;
}
if (strcmp(argv[i],"--bindir") == 0)
{
/* assume we are located in the bindir */
char * lastsep;
strcpy(otherpath,mypath);
lastsep = strrchr(otherpath,'/');
if (lastsep)
*lastsep = '\0';
}
else if (strcmp(argv[i],"--includedir") == 0)
get_include_path(mypath,otherpath);
else if (strcmp(argv[i],"--includedir-server") ==0)
get_pkginclude_path(mypath,otherpath);
else if (strcmp(argv[i],"--libdir") == 0)
get_include_path(mypath,otherpath);
else if (strcmp(argv[i],"--pkglibdir") == 0)
get_pkglib_path(mypath,otherpath);
printf("%s\n",otherpath);
}
return 0;
}
There are a couple of things that need adjustment:
1. typo in the makefile - ((X) should be $(X)
2. these cases need to be fixed:
else if (strcmp(argv[i],"--includedir-server") ==0)
get_pkginclude_path(mypath,otherpath);
else if (strcmp(argv[i],"--libdir") == 0)
get_include_path(mypath,otherpath);
We might actually need one or two functions in port/path.c to handle them.
cheers
andrew
Bruce Momjian wrote:
>Your patch has been added to the PostgreSQL unapplied patches list at:
>
> http://momjian.postgresql.org/cgi-bin/pgpatches
>
>It will be applied as soon as one of the PostgreSQL committers reviews
>and approves it.
>
>
>
>
Andrew Dunstan wrote: > > There are a couple of things that need adjustment: > > 1. typo in the makefile - ((X) should be $(X) OK. > 2. these cases need to be fixed: > > else if (strcmp(argv[i],"--includedir-server") ==0) > get_pkginclude_path(mypath,otherpath); > else if (strcmp(argv[i],"--libdir") == 0) > get_include_path(mypath,otherpath); > > We might actually need one or two functions in port/path.c to handle them. What is the problem here? Why do we need additional port/path functions? I see libdir is mismatched with include_path. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
Bruce Momjian wrote: >Andrew Dunstan wrote: > > >>2. these cases need to be fixed: >> >> else if (strcmp(argv[i],"--includedir-server") ==0) >> get_pkginclude_path(mypath,otherpath); >> else if (strcmp(argv[i],"--libdir") == 0) >> get_include_path(mypath,otherpath); >> >>We might actually need one or two functions in port/path.c to handle them. >> >> > >What is the problem here? Why do we need additional port/path >functions? I see libdir is mismatched with include_path. > > I don't see a function there to report the libdir at all (only pkglibdir), and for includedir-server we would need either to append "/server" or to have a function in path.c that reported it for us correctly. cheers andrew
Andrew Dunstan wrote: > I don't see a function there to report the libdir at all (only > pkglibdir), and for includedir-server we would need either to append > "/server" or to have a function in path.c that reported it for us > correctly. These paths can all be more or less independently (or at least unpredictably) different, so you apparently need to treat each of them individually. -- Peter Eisentraut http://developer.postgresql.org/~petere/
Would someone address this and make a new patch? The files are in the patch queue. Thanks. --------------------------------------------------------------------------- Peter Eisentraut wrote: > Andrew Dunstan wrote: > > I don't see a function there to report the libdir at all (only > > pkglibdir), and for includedir-server we would need either to append > > "/server" or to have a function in path.c that reported it for us > > correctly. > > These paths can all be more or less independently (or at least > unpredictably) different, so you apparently need to treat each of them > individually. > > -- > Peter Eisentraut > http://developer.postgresql.org/~petere/ > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
Patch applied. Thanks. I made all the changes you suggested and the additions to path.c for the new parameters. --------------------------------------------------------------------------- Andrew Dunstan wrote: > > There are a couple of things that need adjustment: > > 1. typo in the makefile - ((X) should be $(X) > 2. these cases need to be fixed: > > else if (strcmp(argv[i],"--includedir-server") ==0) > get_pkginclude_path(mypath,otherpath); > else if (strcmp(argv[i],"--libdir") == 0) > get_include_path(mypath,otherpath); > > We might actually need one or two functions in port/path.c to handle them. > > cheers > > andrew > > > > Bruce Momjian wrote: > > >Your patch has been added to the PostgreSQL unapplied patches list at: > > > > http://momjian.postgresql.org/cgi-bin/pgpatches > > > >It will be applied as soon as one of the PostgreSQL committers reviews > >and approves it. > > > > > > > > > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
Bruce Momjian wrote: > Patch applied. Thanks. > > I made all the changes you suggested and the additions to path.c for > the new parameters. I think you forgot to commit the new source files. -- Peter Eisentraut http://developer.postgresql.org/~petere/
Oops, sorry, done. --------------------------------------------------------------------------- Peter Eisentraut wrote: > Bruce Momjian wrote: > > Patch applied. Thanks. > > > > I made all the changes you suggested and the additions to path.c for > > the new parameters. > > I think you forgot to commit the new source files. > > -- > Peter Eisentraut > http://developer.postgresql.org/~petere/ > > > ---------------------------(end of broadcast)--------------------------- > TIP 8: explain analyze is your friend > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
Bruce Momjian wrote: > Oops, sorry, done. The --pgxs option seems to have gotten lost in the conversion. -- Peter Eisentraut http://developer.postgresql.org/~petere/
Peter Eisentraut wrote: >Bruce Momjian wrote: > > >>Oops, sorry, done. >> >> > >The --pgxs option seems to have gotten lost in the conversion. > > > It wasn't there when I did the conversion. Usual problem of duelling patches. Can you fix it, or do you need me to send in a patch? cheers andrew
OK, addition made, and I added documentation for -pgxs. --------------------------------------------------------------------------- Andrew Dunstan wrote: > > > Peter Eisentraut wrote: > > >Bruce Momjian wrote: > > > > > >>Oops, sorry, done. > >> > >> > > > >The --pgxs option seems to have gotten lost in the conversion. > > > > > > > > It wasn't there when I did the conversion. Usual problem of duelling > patches. Can you fix it, or do you need me to send in a patch? > > cheers > > andrew > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 Index: doc/src/sgml/ref/pg_config-ref.sgml =================================================================== RCS file: /cvsroot/pgsql-server/doc/src/sgml/ref/pg_config-ref.sgml,v retrieving revision 1.17 diff -c -c -r1.17 pg_config-ref.sgml *** doc/src/sgml/ref/pg_config-ref.sgml 29 Nov 2003 19:51:39 -0000 1.17 --- doc/src/sgml/ref/pg_config-ref.sgml 2 Aug 2004 12:31:43 -0000 *************** *** 25,30 **** --- 25,31 ---- <arg>--includedir-server</arg> <arg>--libdir</arg> <arg>--pkglibdir</arg> + <arg>--pgxs</arg> <arg>--configure</arg> <arg>--version</arg> </group> *************** *** 101,106 **** --- 102,116 ---- </varlistentry> <varlistentry> + <term><option>--pgxs</option></> + <listitem> + <para> + Print the location of extension makefiles. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><option>--configure</option></> <listitem> <para> Index: src/bin/pg_config/pg_config.c =================================================================== RCS file: /cvsroot/pgsql-server/src/bin/pg_config/pg_config.c,v retrieving revision 1.2 diff -c -c -r1.2 pg_config.c *** src/bin/pg_config/pg_config.c 1 Aug 2004 14:01:36 -0000 1.2 --- src/bin/pg_config/pg_config.c 2 Aug 2004 12:31:48 -0000 *************** *** 43,48 **** --- 43,49 ---- printf(_(" --includedir-server show location of C header files for the server\n")); printf(_(" --libdir show location of object code libraries\n")); printf(_(" --pkglibdir show location of dynamically loadable modules\n")); + printf(_(" --pgxs show location of extension makefile\n")); printf(_(" --configure show options given to 'configure' script when\n")); printf(_(" PostgreSQL was built\n")); printf(_(" --version show the PostgreSQL version, then exit\n")); *************** *** 81,86 **** --- 82,88 ---- strcmp(argv[i],"--includedir-server") == 0 || strcmp(argv[i],"--libdir") == 0 || strcmp(argv[i],"--pkglibdir") == 0 || + strcmp(argv[i],"--pgxs") == 0 || strcmp(argv[i],"--configure") == 0) { /* come back to these later */ *************** *** 136,141 **** --- 138,148 ---- get_lib_path(mypath,otherpath); else if (strcmp(argv[i],"--pkglibdir") == 0) get_pkglib_path(mypath,otherpath); + else if (strcmp(argv[i],"--pgxs") == 0) + { + get_pkglib_path(mypath,otherpath); + strncat(otherpath, "/pgxs", MAXPGPATH-1); + } printf("%s\n",otherpath); }