/*------------------------------------------------------------------------- * * 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 , 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-2005, PostgreSQL Global Development Group * * $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" 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(_("Options:\n")); printf(_(" --bindir show location of user executables\n")); printf(_(" --includedir show location of C header files of the client\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(_(" --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")); } static void 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; set_pglocale_pgservice(argv[0], "pg_config"); progname = get_progname(argv[0]); /* check for --help */ for (i = 1; i < argc; i++) { if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-?") == 0) { help(); exit(0); } } ret = find_my_exec(argv[0], mypath); if (ret) { fprintf(stderr, _("%s: could not find own executable\n"), progname); exit(1); } /* no arguments -> print everything */ if (argc < 2) { show_all(); exit(0); } for (i = 1; i < argc; i++) { for (j = 0; info_items[j].switchname != NULL; j++) { if (strcmp(argv[i], info_items[j].switchname) == 0) { (*info_items[j].show_func) (false); break; } } if (info_items[j].switchname == NULL) { fprintf(stderr, _("%s: invalid argument: %s\n"), progname, argv[i]); advice(); exit(1); } } return 0; }