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: