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 [EMAIL PROTECTED](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 <[EMAIL PROTECTED]>, 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:[EMAIL PROTECTED] * * 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 <[EMAIL PROTECTED]>.\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; }
---------------------------(end of broadcast)--------------------------- TIP 4: Don't 'kill -9' the postmaster