pg_config - Mailing list pgsql-patches
| From | Andrew Dunstan |
|---|---|
| Subject | pg_config |
| Date | |
| Msg-id | 40FD7C72.7060401@dunslane.net Whole thread Raw |
| List | pgsql-patches |
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;
}
pgsql-patches by date: