PostgreSQL Source Code  git master
pg_config.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * pg_config.c
4  *
5  * This program reports various pieces of information about the
6  * installed version of PostgreSQL. Packages that interface to
7  * PostgreSQL can use it to configure their build.
8  *
9  * This is a C implementation of the previous shell script written by
10  * Peter Eisentraut <peter_e@gmx.net>, with adjustments made to
11  * accommodate the possibility that the installation has been relocated from
12  * the place originally configured.
13  *
14  * author of C translation: Andrew Dunstan mailto:andrew@dunslane.net
15  *
16  * This code is released under the terms of the PostgreSQL License.
17  *
18  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
19  *
20  * src/bin/pg_config/pg_config.c
21  *
22  *-------------------------------------------------------------------------
23  */
24 
25 #include "postgres_fe.h"
26 
27 #include "common/config_info.h"
28 #include "port.h"
29 
30 static const char *progname;
31 
32 /*
33  * Table of known information items
34  *
35  * Be careful to keep this in sync with the help() display.
36  */
37 typedef struct
38 {
39  const char *switchname;
40  const char *configname;
41 } InfoItem;
42 
43 static const InfoItem info_items[] = {
44  {"--bindir", "BINDIR"},
45  {"--docdir", "DOCDIR"},
46  {"--htmldir", "HTMLDIR"},
47  {"--includedir", "INCLUDEDIR"},
48  {"--pkgincludedir", "PKGINCLUDEDIR"},
49  {"--includedir-server", "INCLUDEDIR-SERVER"},
50  {"--libdir", "LIBDIR"},
51  {"--pkglibdir", "PKGLIBDIR"},
52  {"--localedir", "LOCALEDIR"},
53  {"--mandir", "MANDIR"},
54  {"--sharedir", "SHAREDIR"},
55  {"--sysconfdir", "SYSCONFDIR"},
56  {"--pgxs", "PGXS"},
57  {"--configure", "CONFIGURE"},
58  {"--cc", "CC"},
59  {"--cppflags", "CPPFLAGS"},
60  {"--cflags", "CFLAGS"},
61  {"--cflags_sl", "CFLAGS_SL"},
62  {"--ldflags", "LDFLAGS"},
63  {"--ldflags_ex", "LDFLAGS_EX"},
64  {"--ldflags_sl", "LDFLAGS_SL"},
65  {"--libs", "LIBS"},
66  {"--version", "VERSION"},
67  {NULL, NULL}
68 };
69 
70 
71 static void
72 help(void)
73 {
74  printf(_("\n%s provides information about the installed version of PostgreSQL.\n\n"), progname);
75  printf(_("Usage:\n"));
76  printf(_(" %s [OPTION]...\n\n"), progname);
77  printf(_("Options:\n"));
78  printf(_(" --bindir show location of user executables\n"));
79  printf(_(" --docdir show location of documentation files\n"));
80  printf(_(" --htmldir show location of HTML documentation files\n"));
81  printf(_(" --includedir show location of C header files of the client\n"
82  " interfaces\n"));
83  printf(_(" --pkgincludedir show location of other C header files\n"));
84  printf(_(" --includedir-server show location of C header files for the server\n"));
85  printf(_(" --libdir show location of object code libraries\n"));
86  printf(_(" --pkglibdir show location of dynamically loadable modules\n"));
87  printf(_(" --localedir show location of locale support files\n"));
88  printf(_(" --mandir show location of manual pages\n"));
89  printf(_(" --sharedir show location of architecture-independent support files\n"));
90  printf(_(" --sysconfdir show location of system-wide configuration files\n"));
91  printf(_(" --pgxs show location of extension makefile\n"));
92  printf(_(" --configure show options given to \"configure\" script when\n"
93  " PostgreSQL was built\n"));
94  printf(_(" --cc show CC value used when PostgreSQL was built\n"));
95  printf(_(" --cppflags show CPPFLAGS value used when PostgreSQL was built\n"));
96  printf(_(" --cflags show CFLAGS value used when PostgreSQL was built\n"));
97  printf(_(" --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"));
98  printf(_(" --ldflags show LDFLAGS value used when PostgreSQL was built\n"));
99  printf(_(" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"));
100  printf(_(" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"));
101  printf(_(" --libs show LIBS value used when PostgreSQL was built\n"));
102  printf(_(" --version show the PostgreSQL version\n"));
103  printf(_(" -?, --help show this help, then exit\n"));
104  printf(_("\nWith no arguments, all known items are shown.\n\n"));
105  printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
106  printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
107 }
108 
109 static void
110 advice(void)
111 {
112  fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
113 }
114 
115 static void
116 show_item(const char *configname,
117  ConfigData *configdata,
118  size_t configdata_len)
119 {
120  int i;
121 
122  for (i = 0; i < configdata_len; i++)
123  {
124  if (strcmp(configname, configdata[i].name) == 0)
125  printf("%s\n", configdata[i].setting);
126  }
127 }
128 
129 int
130 main(int argc, char **argv)
131 {
132  ConfigData *configdata;
133  size_t configdata_len;
134  char my_exec_path[MAXPGPATH];
135  int i;
136  int j;
137 
138  set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_config"));
139 
140  progname = get_progname(argv[0]);
141 
142  /* check for --help */
143  for (i = 1; i < argc; i++)
144  {
145  if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-?") == 0)
146  {
147  help();
148  exit(0);
149  }
150  }
151 
152  if (find_my_exec(argv[0], my_exec_path) < 0)
153  {
154  fprintf(stderr, _("%s: could not find own program executable\n"), progname);
155  exit(1);
156  }
157 
158  configdata = get_configdata(my_exec_path, &configdata_len);
159  /* no arguments -> print everything */
160  if (argc < 2)
161  {
162  for (i = 0; i < configdata_len; i++)
163  printf("%s = %s\n", configdata[i].name, configdata[i].setting);
164  exit(0);
165  }
166 
167  /* otherwise print requested items */
168  for (i = 1; i < argc; i++)
169  {
170  for (j = 0; info_items[j].switchname != NULL; j++)
171  {
172  if (strcmp(argv[i], info_items[j].switchname) == 0)
173  {
174  show_item(info_items[j].configname,
175  configdata, configdata_len);
176  break;
177  }
178  }
179  if (info_items[j].switchname == NULL)
180  {
181  fprintf(stderr, _("%s: invalid argument: %s\n"),
182  progname, argv[i]);
183  advice();
184  exit(1);
185  }
186  }
187 
188  return 0;
189 }
int main(int argc, char **argv)
Definition: pg_config.c:130
static void advice(void)
Definition: pg_config.c:110
static const InfoItem info_items[]
Definition: pg_config.c:43
static void help(void)
Definition: pg_config.c:72
static const char * progname
Definition: pg_config.c:30
static void show_item(const char *configname, ConfigData *configdata, size_t configdata_len)
Definition: pg_config.c:116
#define PG_TEXTDOMAIN(domain)
Definition: c.h:1201
int find_my_exec(const char *argv0, char *retpath)
Definition: exec.c:160
void set_pglocale_pgservice(const char *argv0, const char *app)
Definition: exec.c:448
ConfigData * get_configdata(const char *my_exec_path, size_t *configdata_len)
Definition: config_info.c:33
#define _(x)
Definition: elog.c:90
char my_exec_path[MAXPGPATH]
Definition: globals.c:78
int j
Definition: isn.c:74
int i
Definition: isn.c:73
exit(1)
#define MAXPGPATH
const char * get_progname(const char *argv0)
Definition: path.c:574
#define fprintf
Definition: port.h:242
#define printf(...)
Definition: port.h:244
const char * configname
Definition: pg_config.c:40
const char * switchname
Definition: pg_config.c:39
const char * name