Extend pg_config to be able to report the build-time values of CC,
authorTom Lane
Tue, 9 Aug 2005 22:47:03 +0000 (22:47 +0000)
committerTom Lane
Tue, 9 Aug 2005 22:47:03 +0000 (22:47 +0000)
CPPFLAGS, CFLAGS, CFLAGS_SL, LDFLAGS, LDFLAGS_SL, and LIBS.  Change it
so that invoking pg_config with no arguments reports all available
information, rather than just giving an error message.  Per discussion.

doc/src/sgml/ref/pg_config-ref.sgml
src/bin/pg_config/Makefile
src/bin/pg_config/pg_config.c
src/bin/pg_config/win32.mak

index db09883902fae5783de7652a8f57eeb3e80e4fe5..daf0496290c34597e293f438005f5c9260cec3d1 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
  
  
   
    pg_config
-   
-    --bindir
-    --includedir
-    --includedir-server
-    --libdir
-    --pkglibdir
-    --pgxs
-    --configure
-    --version
-   
+   option
   
  
 
@@ -48,7 +39,8 @@
   Options
 
   
-   To use pg_config, supply one or more of the following options:
+   To use pg_config, supply one or more of the following
+   options:
    
     
      
      
     
 
+    
+     
+     
+      
+       Print the value of the CC macro that was used for building
+       PostgreSQL.  This shows the C compiler used.
+      
+     
+    
+
+    
+     
+     
+      
+       Print the value of the CPPFLAGS macro that was used for building
+       PostgreSQL.  This shows C compiler switches needed
+       at preprocessing time (typically, -I switches).
+      
+     
+    
+
+    
+     
+     
+      
+       Print the value of the CFLAGS macro that was used for building
+       PostgreSQL.  This shows C compiler switches.
+      
+     
+    
+
+    
+     
+     
+      
+       Print the value of the CFLAGS_SL macro that was used for building
+       PostgreSQL.  This shows extra C compiler switches
+       used for building shared libraries.
+      
+     
+    
+
+    
+     
+     
+      
+       Print the value of the LDFLAGS macro that was used for building
+       PostgreSQL.  This shows linker switches.
+      
+     
+    
+
+    
+     
+     
+      
+       Print the value of the LDFLAGS_SL macro that was used for building
+       PostgreSQL.  This shows linker switches
+       used for building shared libraries.
+      
+     
+    
+
+    
+     
+     
+      
+       Print the value of the LIBS macro that was used for building
+       PostgreSQL.  This normally contains -l
+       switches for external libraries linked into PostgreSQL.
+      
+     
+    
+
     
      
      
       
-       Print the version of PostgreSQL and exit.
+       Print the version of PostgreSQL.
       
      
     
    
 
-   If more than one option (except for 
-   information is printed in that order, one item per line.
+   If more than one option is given, the information is printed in that order,
+   one item per line.  If no options are given, all available information
+   is printed, with labels.
   
  
 
    exit status to see whether it succeeded.
   
 
+  
+   The options ,
+   ,
+   ,
+   and  are new in PostgreSQL 8.1.
+  
+
   
    In releases prior to PostgreSQL 7.1, before
    pg_config came to be, a method for finding the
index 84306b795327be22e66bbcf6503f298cf686096d..e25e111f099d960dad9f18af13d4a0ab3d6e5b62 100644 (file)
@@ -4,7 +4,7 @@
 #
 # Copyright (c) 1998-2005, PostgreSQL Global Development Group
 #
-# $PostgreSQL: pgsql/src/bin/pg_config/Makefile,v 1.14 2005/01/20 22:54:57 neilc Exp $
+# $PostgreSQL: pgsql/src/bin/pg_config/Makefile,v 1.15 2005/08/09 22:47:03 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -15,7 +15,19 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS=   pg_config.o $(WIN32RES)
 
-override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) -DVAL_CONFIGURE="\"$(configure_args)\"" $(CPPFLAGS)
+# don't include subdirectory-path-dependent -I and -L switches
+STD_CPPFLAGS := $(filter-out -I$(top_srcdir)/src/include -I$(top_builddir)/src/include,$(CPPFLAGS))
+STD_LDFLAGS := $(filter-out -L$(top_builddir)/src/port,$(LDFLAGS))
+
+override CPPFLAGS += -DFRONTEND
+override CPPFLAGS += -DVAL_CONFIGURE="\"$(configure_args)\""
+override CPPFLAGS += -DVAL_CC="\"$(CC)\""
+override CPPFLAGS += -DVAL_CPPFLAGS="\"$(STD_CPPFLAGS)\""
+override CPPFLAGS += -DVAL_CFLAGS="\"$(CFLAGS)\""
+override CPPFLAGS += -DVAL_CFLAGS_SL="\"$(CFLAGS_SL)\""
+override CPPFLAGS += -DVAL_LDFLAGS="\"$(STD_LDFLAGS)\""
+override CPPFLAGS += -DVAL_LDFLAGS_SL="\"$(LDFLAGS_SL)\""
+override CPPFLAGS += -DVAL_LIBS="\"$(LIBS)\""
 
 all: submake-libpgport pg_config
 
index 28baf2262d09b39265610742d13018efa2d5e3bb..ae1fce770df8c1a17a180fe182b08d0c6e03082f 100644 (file)
  *
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/pg_config/pg_config.c,v 1.11 2005/02/22 04:38:40 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_config/pg_config.c,v 1.12 2005/08/09 22:47:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 #include "postgres.h"
+
 #include "port.h"
-#include 
 
 static const char *progname;
+static char        mypath[MAXPGPATH];
+
+
+/*
+ * For each piece of information known to pg_config, we define a subroutine
+ * to print it.  This is probably overkill, but it avoids code duplication
+ * and accidentally omitting items from the "all" display.
+ */
+
+static void
+show_bindir(bool all)
+{
+   char        path[MAXPGPATH];
+   char       *lastsep;
+
+   if (all)
+       printf("BINDIR = ");
+   /* assume we are located in the bindir */
+   strcpy(path, mypath);
+   lastsep = strrchr(path, '/');
+   if (lastsep)
+       *lastsep = '\0';
+   printf("%s\n", path);
+}
+
+static void
+show_includedir(bool all)
+{
+   char        path[MAXPGPATH];
+
+   if (all)
+       printf("INCLUDEDIR = ");
+   get_include_path(mypath, path);
+   printf("%s\n", path);
+}
+
+static void
+show_includedir_server(bool all)
+{
+   char        path[MAXPGPATH];
+
+   if (all)
+       printf("INCLUDEDIR-SERVER = ");
+   get_includeserver_path(mypath, path);
+   printf("%s\n", path);
+}
+
+static void
+show_libdir(bool all)
+{
+   char        path[MAXPGPATH];
+
+   if (all)
+       printf("LIBDIR = ");
+   get_lib_path(mypath, path);
+   printf("%s\n", path);
+}
+
+static void
+show_pkglibdir(bool all)
+{
+   char        path[MAXPGPATH];
+
+   if (all)
+       printf("PKGLIBDIR = ");
+   get_pkglib_path(mypath, path);
+   printf("%s\n", path);
+}
+
+static void
+show_pgxs(bool all)
+{
+   char        path[MAXPGPATH];
+
+   if (all)
+       printf("PGXS = ");
+   get_pkglib_path(mypath, path);
+   strncat(path, "/pgxs/src/makefiles/pgxs.mk", MAXPGPATH - 1);
+   printf("%s\n", path);
+}
+
+static void
+show_configure(bool all)
+{
+#ifdef VAL_CONFIGURE
+   if (all)
+       printf("CONFIGURE = ");
+   printf("%s\n", VAL_CONFIGURE);
+#else
+   if (!all)
+       printf("not recorded\n");
+#endif
+}
+
+static void
+show_cc(bool all)
+{
+#ifdef VAL_CC
+   if (all)
+       printf("CC = ");
+   printf("%s\n", VAL_CC);
+#else
+   if (!all)
+       printf("not recorded\n");
+#endif
+}
+
+static void
+show_cppflags(bool all)
+{
+#ifdef VAL_CPPFLAGS
+   if (all)
+       printf("CPPFLAGS = ");
+   printf("%s\n", VAL_CPPFLAGS);
+#else
+   if (!all)
+       printf("not recorded\n");
+#endif
+}
+
+static void
+show_cflags(bool all)
+{
+#ifdef VAL_CFLAGS
+   if (all)
+       printf("CFLAGS = ");
+   printf("%s\n", VAL_CFLAGS);
+#else
+   if (!all)
+       printf("not recorded\n");
+#endif
+}
+
+static void
+show_cflags_sl(bool all)
+{
+#ifdef VAL_CFLAGS_SL
+   if (all)
+       printf("CFLAGS_SL = ");
+   printf("%s\n", VAL_CFLAGS_SL);
+#else
+   if (!all)
+       printf("not recorded\n");
+#endif
+}
+
+static void
+show_ldflags(bool all)
+{
+#ifdef VAL_LDFLAGS
+   if (all)
+       printf("LDFLAGS = ");
+   printf("%s\n", VAL_LDFLAGS);
+#else
+   if (!all)
+       printf("not recorded\n");
+#endif
+}
+
+static void
+show_ldflags_sl(bool all)
+{
+#ifdef VAL_LDFLAGS_SL
+   if (all)
+       printf("LDFLAGS_SL = ");
+   printf("%s\n", VAL_LDFLAGS_SL);
+#else
+   if (!all)
+       printf("not recorded\n");
+#endif
+}
+
+static void
+show_libs(bool all)
+{
+#ifdef VAL_LIBS
+   if (all)
+       printf("LIBS = ");
+   printf("%s\n", VAL_LIBS);
+#else
+   if (!all)
+       printf("not recorded\n");
+#endif
+}
+
+static void
+show_version(bool all)
+{
+   if (all)
+       printf("VERSION = ");
+   printf("PostgreSQL " PG_VERSION "\n");
+}
+
+
+/*
+ * Table of known information items
+ *
+ * Be careful to keep this in sync with the help() display.
+ */
+typedef struct
+{
+   const char *switchname;
+   void        (*show_func) (bool all);
+} InfoItem;
+
+static const InfoItem info_items[] = {
+   { "--bindir", show_bindir },
+   { "--includedir", show_includedir },
+   { "--includedir-server", show_includedir_server },
+   { "--libdir", show_libdir },
+   { "--pkglibdir", show_pkglibdir },
+   { "--pgxs", show_pgxs },
+   { "--configure", show_configure },
+   { "--cc", show_cc },
+   { "--cppflags", show_cppflags },
+   { "--cflags", show_cflags },
+   { "--cflags_sl", show_cflags_sl },
+   { "--ldflags", show_ldflags },
+   { "--ldflags_sl", show_ldflags_sl },
+   { "--libs", show_libs },
+   { "--version", show_version },
+   { NULL, NULL }
+};
+
 
 static void
 help(void)
 {
    printf(_("\n%s provides information about the installed version of PostgreSQL.\n\n"), progname);
    printf(_("Usage:\n"));
-   printf(_("  %s OPTION...\n\n"), progname);
+   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"
-        "                        interfaces\n"));
+            "                        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(_("  --pgxs                show location of extension makefile\n"));
    printf(_("  --configure           show options given to \"configure\" script when\n"
             "                        PostgreSQL was built\n"));
-   printf(_("  --version             show the PostgreSQL version, then exit\n"));
-   printf(_("  --help                show this help, then exit\n\n"));
+   printf(_("  --cc                  show CC value used when PostgreSQL was built\n"));
+   printf(_("  --cppflags            show CPPFLAGS value used when PostgreSQL was built\n"));
+   printf(_("  --cflags              show CFLAGS value used when PostgreSQL was built\n"));
+   printf(_("  --cflags_sl           show CFLAGS_SL value used when PostgreSQL was built\n"));
+   printf(_("  --ldflags             show LDFLAGS value used when PostgreSQL was built\n"));
+   printf(_("  --ldflags_sl          show LDFLAGS_SL value used when PostgreSQL was built\n"));
+   printf(_("  --libs                show LIBS value used when PostgreSQL was built\n"));
+   printf(_("  --version             show the PostgreSQL version\n"));
+   printf(_("  --help                show this help, then exit\n"));
+   printf(_("With no arguments, all known items are shown.\n\n"));
    printf(_("Report bugs to .\n"));
 }
 
@@ -55,53 +287,36 @@ advice(void)
    fprintf(stderr, _("\nTry \"%s --help\" for more information\n"), progname);
 }
 
+static void
+show_all(void)
+{
+   int         i;
+
+   for (i = 0; info_items[i].switchname != NULL; i++)
+   {
+       (*info_items[i].show_func) (true);
+   }
+}
 
 int
 main(int argc, char **argv)
 {
    int         i;
+   int         j;
    int         ret;
-   char        mypath[MAXPGPATH];
-   char        otherpath[MAXPGPATH];
 
    set_pglocale_pgservice(argv[0], "pg_config");
 
    progname = get_progname(argv[0]);
 
-   if (argc < 2)
-   {
-       fprintf(stderr, _("%s: argument required\n"), progname);
-       advice();
-       exit(1);
-   }
-
+   /* check for --help */
    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], "--pgxs") == 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);
@@ -112,40 +327,30 @@ main(int argc, char **argv)
        exit(1);
    }
 
-   for (i = 1; i < argc; i++)
+   /* no arguments -> print everything */
+   if (argc < 2)
    {
-       if (strcmp(argv[i], "--configure") == 0)
-       {
-           /* the VAL_CONFIGURE macro must be defined by the Makefile */
-           printf("%s\n", VAL_CONFIGURE);
-           continue;
-       }
+       show_all();
+       exit(0);
+   }
 
-       if (strcmp(argv[i], "--bindir") == 0)
+   for (i = 1; i < argc; i++)
+   {
+       for (j = 0; info_items[j].switchname != NULL; j++)
        {
-           /* assume we are located in the bindir */
-           char       *lastsep;
-
-           strcpy(otherpath, mypath);
-           lastsep = strrchr(otherpath, '/');
-           if (lastsep)
-               *lastsep = '\0';
+           if (strcmp(argv[i], info_items[j].switchname) == 0)
+           {
+               (*info_items[j].show_func) (false);
+               break;
+           }
        }
-       else if (strcmp(argv[i], "--includedir") == 0)
-           get_include_path(mypath, otherpath);
-       else if (strcmp(argv[i], "--includedir-server") == 0)
-           get_includeserver_path(mypath, otherpath);
-       else if (strcmp(argv[i], "--libdir") == 0)
-           get_lib_path(mypath, otherpath);
-       else if (strcmp(argv[i], "--pkglibdir") == 0)
-           get_pkglib_path(mypath, otherpath);
-       else if (strcmp(argv[i], "--pgxs") == 0)
+       if (info_items[j].switchname == NULL)
        {
-           get_pkglib_path(mypath, otherpath);
-           strncat(otherpath, "/pgxs/src/makefiles/pgxs.mk", MAXPGPATH - 1);
+           fprintf(stderr, _("%s: invalid argument: %s\n"),
+                   progname, argv[i]);
+           advice();
+           exit(1);
        }
-
-       printf("%s\n", otherpath);
    }
 
    return 0;
index c3a8965f5ee9852a50751338b291c9e2537b73e0..0017e57851e02e0af2dae9fb9d2242d3325a8f5e 100644 (file)
@@ -46,7 +46,7 @@ CLEAN :
 CPP_PROJ=/nologo $(OPT) /W3 /GX /D "WIN32" $(DEBUGDEF) /D "_CONSOLE" /D\
  "_MBCS" /Fp"$(INTDIR)\pg_config.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c \
  /I ..\..\include /I ..\..\interfaces\libpq /I ..\..\include\port\win32 \
- /D "HAVE_STRDUP" /D "FRONTEND" /D VAL_CONFIGURE="\"\""
+ /D "HAVE_STRDUP" /D "FRONTEND"
 
 CPP_OBJS=$(INTDIR)/
 CPP_SBRS=.