diff --git a/doc/src/sgml/ref/pg_config-ref.sgml b/doc/src/sgml/ref/pg_config-ref.sgml index db09883902fae5783de7652a8f57eeb3e80e4fe5..daf0496290c34597e293f438005f5c9260cec3d1 100644 --- a/doc/src/sgml/ref/pg_config-ref.sgml +++ b/doc/src/sgml/ref/pg_config-ref.sgml @@ -1,4 +1,4 @@ - + @@ -19,16 +19,7 @@ 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: @@ -124,18 +116,93 @@ + + + + + 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 @@ -152,6 +219,13 @@ 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 diff --git a/src/bin/pg_config/Makefile b/src/bin/pg_config/Makefile index 84306b795327be22e66bbcf6503f298cf686096d..e25e111f099d960dad9f18af13d4a0ab3d6e5b62 100644 --- a/src/bin/pg_config/Makefile +++ b/src/bin/pg_config/Makefile @@ -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 diff --git a/src/bin/pg_config/pg_config.c b/src/bin/pg_config/pg_config.c index 28baf2262d09b39265610742d13018efa2d5e3bb..ae1fce770df8c1a17a180fe182b08d0c6e03082f 100644 --- a/src/bin/pg_config/pg_config.c +++ b/src/bin/pg_config/pg_config.c @@ -17,35 +17,267 @@ * * 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; diff --git a/src/bin/pg_config/win32.mak b/src/bin/pg_config/win32.mak index c3a8965f5ee9852a50751338b291c9e2537b73e0..0017e57851e02e0af2dae9fb9d2242d3325a8f5e 100644 --- a/src/bin/pg_config/win32.mak +++ b/src/bin/pg_config/win32.mak @@ -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=.