blob: fdfc1f4925b400acccc63fb8790ed187db6bccbf [file] [log] [blame]
/*-------------------------------------------------------------------------
*
* 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-2009, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/bin/pg_config/pg_config.c,v 1.31 2009/02/25 13:35:18 petere Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres_fe.h"
#include "port.h"
static const char *progname;
static char mypath[MAXPGPATH];
/*
* This function cleans up the paths for use with either cmd.exe or Msys
* on Windows. We need them to use filenames without spaces, for which a
* short filename is the safest equivalent, eg:
* C:/Progra~1/
*/
static void
cleanup_path(char *path)
{
#ifdef WIN32
char *ptr;
/*
* GetShortPathName() will fail if the path does not exist, or short names
* are disabled on this file system. In both cases, we just return the
* original path. This is particularly useful for --sysconfdir, which
* might not exist.
*/
GetShortPathName(path, path, MAXPGPATH - 1);
/* Replace '\' with '/' */
for (ptr = path; *ptr; ptr++)
{
if (*ptr == '\\')
*ptr = '/';
}
#endif
}
/*
* 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';
cleanup_path(path);
printf("%s\n", path);
}
static void
show_docdir(bool all)
{
char path[MAXPGPATH];
if (all)
printf("DOCDIR = ");
get_doc_path(mypath, path);
cleanup_path(path);
printf("%s\n", path);
}
static void
show_htmldir(bool all)
{
char path[MAXPGPATH];
if (all)
printf("HTMLDIR = ");
get_html_path(mypath, path);
cleanup_path(path);
printf("%s\n", path);
}
static void
show_includedir(bool all)
{
char path[MAXPGPATH];
if (all)
printf("INCLUDEDIR = ");
get_include_path(mypath, path);
cleanup_path(path);
printf("%s\n", path);
}
static void
show_pkgincludedir(bool all)
{
char path[MAXPGPATH];
if (all)
printf("PKGINCLUDEDIR = ");
get_pkginclude_path(mypath, path);
cleanup_path(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);
cleanup_path(path);
printf("%s\n", path);
}
static void
show_libdir(bool all)
{
char path[MAXPGPATH];
if (all)
printf("LIBDIR = ");
get_lib_path(mypath, path);
cleanup_path(path);
printf("%s\n", path);
}
static void
show_pkglibdir(bool all)
{
char path[MAXPGPATH];
if (all)
printf("PKGLIBDIR = ");
get_pkglib_path(mypath, path);
cleanup_path(path);
printf("%s\n", path);
}
static void
show_localedir(bool all)
{
char path[MAXPGPATH];
if (all)
printf("LOCALEDIR = ");
get_locale_path(mypath, path);
cleanup_path(path);
printf("%s\n", path);
}
static void
show_mandir(bool all)
{
char path[MAXPGPATH];
if (all)
printf("MANDIR = ");
get_man_path(mypath, path);
cleanup_path(path);
printf("%s\n", path);
}
static void
show_sharedir(bool all)
{
char path[MAXPGPATH];
if (all)
printf("SHAREDIR = ");
get_share_path(mypath, path);
cleanup_path(path);
printf("%s\n", path);
}
static void
show_sysconfdir(bool all)
{
char path[MAXPGPATH];
if (all)
printf("SYSCONFDIR = ");
get_etc_path(mypath, path);
cleanup_path(path);
printf("%s\n", path);
}
static void
show_pgxs(bool all)
{
char path[MAXPGPATH];
if (all)
printf("PGXS = ");
get_pkglib_path(mypath, path);
strlcat(path, "/pgxs/src/makefiles/pgxs.mk", sizeof(path));
cleanup_path(path);
printf("%s\n", path);
}
static void
show_configure(bool all)
{
/*
* we don't show our configure line -- it refers to many paths that are from the build machines, and doesn't make
* _that_ much sense for the customers to view as they take the builds that we produce
*/
if ( all )
return;
fprintf( stderr, _("CONFIGURE value not available\n"));
exit(1);
#ifdef VAL_CONFIGURE
if (all)
printf("CONFIGURE = ");
printf("%s\n", VAL_CONFIGURE);
#else
if (!all)
{
fprintf(stderr, _("not recorded\n"));
exit(1);
}
#endif
}
static void
show_cc(bool all)
{
#ifdef VAL_CC
if (all)
printf("CC = ");
printf("%s\n", VAL_CC);
#else
if (!all)
{
fprintf(stderr, _("not recorded\n"));
exit(1);
}
#endif
}
static void
show_cppflags(bool all)
{
#ifdef VAL_CPPFLAGS
char includePath[MAXPGPATH];
get_include_path(mypath, includePath);
cleanup_path(includePath);
if (all)
printf("CPPFLAGS = ");
if (strlen(VAL_CPPFLAGS) > 0)
printf("%s -I%s\n", VAL_CPPFLAGS, includePath);
else printf("-I%s\n", includePath);
#else
if (!all)
{
fprintf(stderr, _("not recorded\n"));
exit(1);
}
#endif
}
static void
show_cflags(bool all)
{
#ifdef VAL_CFLAGS
char includePath[MAXPGPATH];
get_include_path(mypath, includePath);
cleanup_path(includePath);
if (all)
printf("CFLAGS = ");
printf("%s -I%s\n", VAL_CFLAGS, includePath);
#else
if (!all)
{
fprintf(stderr, _("not recorded\n"));
exit(1);
}
#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)
{
fprintf(stderr, _("not recorded\n"));
exit(1);
}
#endif
}
static void
show_ldflags(bool all)
{
#ifdef VAL_LDFLAGS
char libraryPath[MAXPGPATH];
get_lib_path(mypath, libraryPath);
cleanup_path(libraryPath);
if (all)
printf("LDFLAGS = ");
if (strlen(VAL_LDFLAGS) > 0)
printf("%s -L%s\n", VAL_LDFLAGS, libraryPath);
else printf("-L%s\n", libraryPath);
#else
if (!all)
{
fprintf(stderr, _("not recorded\n"));
exit(1);
}
#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)
{
fprintf(stderr, _("not recorded\n"));
exit(1);
}
#endif
}
static void
show_libs(bool all)
{
#ifdef VAL_LIBS
char libraryPath[MAXPGPATH];
get_lib_path(mypath, libraryPath);
cleanup_path(libraryPath);
if (all)
printf("LIBS = ");
printf("%s -L%s\n", VAL_LIBS, libraryPath);
#else
if (!all)
{
fprintf(stderr, _("not recorded\n"));
exit(1);
}
#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},
{"--docdir", show_docdir},
{"--htmldir", show_htmldir},
{"--includedir", show_includedir},
{"--pkgincludedir", show_pkgincludedir},
{"--includedir-server", show_includedir_server},
{"--libdir", show_libdir},
{"--pkglibdir", show_pkglibdir},
{"--localedir", show_localedir},
{"--mandir", show_mandir},
{"--sharedir", show_sharedir},
{"--sysconfdir", show_sysconfdir},
{"--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(_(" --docdir show location of documentation files\n"));
printf(_(" --htmldir show location of HTML documentation files\n"));
printf(_(" --includedir show location of C header files of the client\n"
" interfaces\n"));
printf(_(" --pkgincludedir show location of other C header files\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(_(" --localedir show location of locale support files\n"));
printf(_(" --mandir show location of manual pages\n"));
printf(_(" --sharedir show location of architecture-independent support files\n"));
printf(_(" --sysconfdir show location of system-wide configuration files\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(_("\nWith no arguments, all known items are shown.\n\n"));
printf(_("Report bugs to <pgsql-bugs@postgresql.org>.\n"));
}
static void
advice(void)
{
fprintf(stderr, _("Try \"%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_TEXTDOMAIN("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 program 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;
}