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:

Previous
From: Peter Eisentraut
Date:
Subject: Re: logfile subprocess and Fancy File Functions
Next
From: Bruce Momjian
Date:
Subject: Re: win32 readline