1 // %NO_EDIT_WARNING%
2
3 ////////////////////////////////////////////////////////////////////////
4 //
5 // Copyright (C) 2008-2021 The Octave Project Developers
6 //
7 // See the file COPYRIGHT.md in the top-level directory of this
8 // distribution or <https://octave.org/copyright/>.
9 //
10 // This file is part of Octave.
11 //
12 // Octave is free software: you can redistribute it and/or modify it
13 // under the terms of the GNU General Public License as published by
14 // the Free Software Foundation, either version 3 of the License, or
15 // (at your option) any later version.
16 //
17 // Octave is distributed in the hope that it will be useful, but
18 // WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 // GNU General Public License for more details.
21 //
22 // You should have received a copy of the GNU General Public License
23 // along with Octave; see the file COPYING. If not, see
24 // <https://www.gnu.org/licenses/>.
25 //
26 ////////////////////////////////////////////////////////////////////////
27
28 #if defined (HAVE_CONFIG_H)
29 # include "config.h"
30 #endif
31
32 #include <string>
33 #include <map>
34 #include <iostream>
35 #include <algorithm>
36 #include <cstdlib>
37
38 #if ! defined (OCTAVE_PREFIX)
39 # define OCTAVE_PREFIX %OCTAVE_PREFIX%
40 #endif
41
42 #if ! defined (OCTAVE_EXEC_PREFIX)
43 # define OCTAVE_EXEC_PREFIX %OCTAVE_EXEC_PREFIX%
44 #endif
45
46 #ifndef OCTAVE_UNUSED
47 # define OCTAVE_UNUSED
48 #endif
49
50 #include "shared-fcns.h"
51
52 static std::map<std::string,std::string> vars;
53
54 static std::string usage_msg = "usage: octave-config [options]";
55
56 static std::string help_msg =
57 "\n"
58 "Options:\n"
59 "\n"
60 " -h, -?, --help Print this message.\n"
61 "\n"
62 " --m-site-dir Print the name of the directory where Octave\n"
63 " expects to find locally installed .m files.\n"
64 "\n"
65 " --oct-site-dir Print the name of the directory where Octave\n"
66 " expects to find locally installed .oct files.\n"
67 "\n"
68 " -p VAR, --print VAR Print the value of the given configuration\n"
69 " variable VAR. Recognized variables are:\n"
70 "\n"
71 " API_VERSION LOCALFCNFILEDIR\n"
72 " ARCHLIBDIR LOCALOCTFILEDIR\n"
73 " BINDIR LOCALSTARTUPFILEDIR\n"
74 " CANONICAL_HOST_TYPE LOCALVERARCHLIBDIR\n"
75 " DATADIR LOCALVERFCNFILEDIR\n"
76 " DATAROOTDIR LOCALVEROCTFILEDIR\n"
77 " DEFAULT_PAGER MAN1DIR\n"
78 " EXEC_PREFIX MAN1EXT\n"
79 " EXEEXT MANDIR\n"
80 " FCNFILEDIR OCTAVE_EXEC_HOME\n"
81 " IMAGEDIR OCTAVE_HOME\n"
82 " INCLUDEDIR OCTDATADIR\n"
83 " INFODIR OCTDOCDIR\n"
84 " INFOFILE OCTFILEDIR\n"
85 " LIBDIR OCTFONTSDIR\n"
86 " LIBEXECDIR OCTINCLUDEDIR\n"
87 " LOCALAPIARCHLIBDIR OCTLIBDIR\n"
88 " LOCALAPIFCNFILEDIR STARTUPFILEDIR\n"
89 " LOCALAPIOCTFILEDIR VERSION\n"
90 " LOCALARCHLIBDIR\n"
91 "\n"
92 " -v, --version Print the Octave version number.\n"
93 "\n";
94
95 static void
initialize(void)96 initialize (void)
97 {
98 set_octave_home ();
99
100 vars["OCTAVE_HOME"] = Voctave_home;
101 vars["OCTAVE_EXEC_HOME"] = Voctave_exec_home;
102
103 vars["API_VERSION"] = %OCTAVE_API_VERSION%;
104 vars["CANONICAL_HOST_TYPE"] = %OCTAVE_CANONICAL_HOST_TYPE%;
105 vars["DEFAULT_PAGER"] = %OCTAVE_DEFAULT_PAGER%;
106 vars["EXEEXT"] = %OCTAVE_EXEEXT%;
107 vars["MAN1EXT"] = %OCTAVE_MAN1EXT%;
108 vars["VERSION"] = %OCTAVE_VERSION%;
109
110 vars["ARCHLIBDIR"] = prepend_octave_exec_home (%OCTAVE_ARCHLIBDIR%);
111 vars["BINDIR"] = prepend_octave_exec_home (%OCTAVE_BINDIR%);
112 vars["DATADIR"] = prepend_octave_home (%OCTAVE_DATADIR%);
113 vars["DATAROOTDIR"] = prepend_octave_home (%OCTAVE_DATAROOTDIR%);
114 vars["FCNFILEDIR"] = prepend_octave_home (%OCTAVE_FCNFILEDIR%);
115 vars["IMAGEDIR"] = prepend_octave_home (%OCTAVE_IMAGEDIR%);
116 vars["INCLUDEDIR"] = prepend_octave_home (%OCTAVE_INCLUDEDIR%);
117 vars["INFODIR"] = prepend_octave_home (%OCTAVE_INFODIR%);
118 vars["INFOFILE"] = prepend_octave_home (%OCTAVE_INFOFILE%);
119 vars["LIBDIR"] = prepend_octave_exec_home (%OCTAVE_LIBDIR%);
120 vars["LIBEXECDIR"] = prepend_octave_exec_home (%OCTAVE_LIBEXECDIR%);
121 vars["LOCALAPIARCHLIBDIR"] = prepend_octave_exec_home (%OCTAVE_LOCALAPIARCHLIBDIR%);
122 vars["LOCALAPIFCNFILEDIR"] = prepend_octave_home (%OCTAVE_LOCALAPIFCNFILEDIR%);
123 vars["LOCALAPIOCTFILEDIR"] = prepend_octave_exec_home (%OCTAVE_LOCALAPIOCTFILEDIR%);
124 vars["LOCALARCHLIBDIR"] = prepend_octave_exec_home (%OCTAVE_LOCALARCHLIBDIR%);
125 vars["LOCALFCNFILEDIR"] = prepend_octave_home (%OCTAVE_LOCALFCNFILEDIR%);
126 vars["LOCALOCTFILEDIR"] = prepend_octave_exec_home (%OCTAVE_LOCALOCTFILEDIR%);
127 vars["LOCALSTARTUPFILEDIR"] = prepend_octave_home (%OCTAVE_LOCALSTARTUPFILEDIR%);
128 vars["LOCALVERARCHLIBDIR"] = prepend_octave_exec_home (%OCTAVE_LOCALVERARCHLIBDIR%);
129 vars["LOCALVERFCNFILEDIR"] = prepend_octave_home (%OCTAVE_LOCALVERFCNFILEDIR%);
130 vars["LOCALVEROCTFILEDIR"] = prepend_octave_exec_home (%OCTAVE_LOCALVEROCTFILEDIR%);
131 vars["MAN1DIR"] = prepend_octave_home (%OCTAVE_MAN1DIR%);
132 vars["MANDIR"] = prepend_octave_home (%OCTAVE_MANDIR%);
133 vars["OCTDATADIR"] = prepend_octave_home (%OCTAVE_OCTDATADIR%);
134 vars["OCTDOCDIR"] = prepend_octave_home (%OCTAVE_OCTDOCDIR%);
135 vars["OCTFILEDIR"] = prepend_octave_exec_home (%OCTAVE_OCTFILEDIR%);
136 vars["OCTFONTSDIR"] = prepend_octave_home (%OCTAVE_OCTFONTSDIR%);
137 vars["OCTINCLUDEDIR"] = prepend_octave_home (%OCTAVE_OCTINCLUDEDIR%);
138 vars["OCTLIBDIR"] = prepend_octave_exec_home (%OCTAVE_OCTLIBDIR%);
139 vars["STARTUPFILEDIR"] = prepend_octave_home (%OCTAVE_STARTUPFILEDIR%);
140 }
141
142 int
main(int argc,char ** argv)143 main (int argc, char **argv)
144 {
145 initialize ();
146
147 if (argc == 1)
148 {
149 std::cout << usage_msg << std::endl;
150 return 1;
151 }
152
153 for (int i = 1; i < argc; i++)
154 {
155 std::string arg (argv[i]);
156
157 if (arg == "-h" || arg == "-?" || arg == "--help")
158 {
159 std::cout << usage_msg << std::endl;
160 std::cout << help_msg;
161 return 0;
162 }
163 else if (arg == "--m-site-dir")
164 std::cout << vars["LOCALVERFCNFILEDIR"] << std::endl;
165 else if (arg == "--oct-site-dir")
166 std::cout << vars["LOCALVEROCTFILEDIR"] << std::endl;
167 else if (arg == "-v" || arg == "--version")
168 std::cout << vars["VERSION"] << std::endl;
169 else if (arg == "-p" || arg == "--print")
170 {
171 if (i < argc-1)
172 {
173 arg = argv[++i];
174 std::cout << vars[arg] << std::endl;
175 }
176 else
177 {
178 std::cerr << "octave-config: " << arg
179 << " options requires argument" << std::endl;
180 return 1;
181 }
182 }
183 else
184 {
185 std::cerr << "octave-config: unrecognized argument " << arg
186 << std::endl;
187 return 1;
188 }
189 }
190
191 return 0;
192 }
193