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

Reply via email to