This source file includes following definitions.
- mca_base_cmd_line_setup
- mca_base_cmd_line_process_args
- process_arg
- add_to_env
- mca_base_cmd_line_wrap_args
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include "opal_config.h"
23
24 #include <stdio.h>
25 #include <string.h>
26
27 #include "opal/util/cmd_line.h"
28 #include "opal/util/argv.h"
29 #include "opal/util/opal_environ.h"
30 #include "opal/util/show_help.h"
31 #include "opal/util/printf.h"
32 #include "opal/mca/base/base.h"
33 #include "opal/constants.h"
34
35
36
37
38
39
40
41
42
43 static int process_arg(const char *param, const char *value,
44 char ***params, char ***values);
45 static void add_to_env(char **params, char **values, char ***env);
46
47
48
49
50
51 int mca_base_cmd_line_setup(opal_cmd_line_t *cmd)
52 {
53 int ret = OPAL_SUCCESS;
54
55 ret = opal_cmd_line_make_opt3(cmd, '\0', OPAL_MCA_CMD_LINE_ID, OPAL_MCA_CMD_LINE_ID, 2,
56 "Pass context-specific MCA parameters; they are considered global if --g"OPAL_MCA_CMD_LINE_ID" is not used and only one context is specified (arg0 is the parameter name; arg1 is the parameter value)");
57 if (OPAL_SUCCESS != ret) {
58 return ret;
59 }
60
61 ret = opal_cmd_line_make_opt3(cmd, '\0', "g"OPAL_MCA_CMD_LINE_ID, "g"OPAL_MCA_CMD_LINE_ID, 2,
62 "Pass global MCA parameters that are applicable to all contexts (arg0 is the parameter name; arg1 is the parameter value)");
63
64 if (OPAL_SUCCESS != ret) {
65 return ret;
66 }
67
68 {
69 opal_cmd_line_init_t entry =
70 {"mca_base_param_file_prefix", '\0', "am", NULL, 1,
71 NULL, OPAL_CMD_LINE_TYPE_STRING,
72 "Aggregate MCA parameter set file list",
73 OPAL_CMD_LINE_OTYPE_LAUNCH
74 };
75 ret = opal_cmd_line_make_opt_mca(cmd, entry);
76 if (OPAL_SUCCESS != ret) {
77 return ret;
78 }
79 }
80
81 {
82 opal_cmd_line_init_t entry =
83 {"mca_base_envar_file_prefix", '\0', "tune", NULL, 1,
84 NULL, OPAL_CMD_LINE_TYPE_STRING,
85 "Application profile options file list",
86 OPAL_CMD_LINE_OTYPE_DEBUG
87 };
88 ret = opal_cmd_line_make_opt_mca(cmd, entry);
89 if (OPAL_SUCCESS != ret) {
90 return ret;
91 }
92 }
93
94 return ret;
95 }
96
97
98
99
100
101 int mca_base_cmd_line_process_args(opal_cmd_line_t *cmd,
102 char ***context_env, char ***global_env)
103 {
104 int i, num_insts, rc;
105 char **params;
106 char **values;
107
108
109
110 if (!opal_cmd_line_is_taken(cmd, OPAL_MCA_CMD_LINE_ID) &&
111 !opal_cmd_line_is_taken(cmd, "g"OPAL_MCA_CMD_LINE_ID)) {
112 return OPAL_SUCCESS;
113 }
114
115
116
117 num_insts = opal_cmd_line_get_ninsts(cmd, OPAL_MCA_CMD_LINE_ID);
118 params = values = NULL;
119 for (i = 0; i < num_insts; ++i) {
120 if (OPAL_SUCCESS != (rc = process_arg(opal_cmd_line_get_param(cmd, OPAL_MCA_CMD_LINE_ID, i, 0),
121 opal_cmd_line_get_param(cmd, OPAL_MCA_CMD_LINE_ID, i, 1),
122 ¶ms, &values))) {
123 return rc;
124 }
125 }
126 if (NULL != params) {
127 add_to_env(params, values, context_env);
128 opal_argv_free(params);
129 opal_argv_free(values);
130 }
131
132
133
134 num_insts = opal_cmd_line_get_ninsts(cmd, "g"OPAL_MCA_CMD_LINE_ID);
135 params = values = NULL;
136 for (i = 0; i < num_insts; ++i) {
137 if (OPAL_SUCCESS != (rc = process_arg(opal_cmd_line_get_param(cmd, "g"OPAL_MCA_CMD_LINE_ID, i, 0),
138 opal_cmd_line_get_param(cmd, "g"OPAL_MCA_CMD_LINE_ID, i, 1),
139 ¶ms, &values))) {
140 return rc;
141 }
142 }
143 if (NULL != params) {
144 add_to_env(params, values, global_env);
145 opal_argv_free(params);
146 opal_argv_free(values);
147 }
148
149
150
151 return OPAL_SUCCESS;
152 }
153
154
155
156
157
158
159 static int process_arg(const char *param, const char *value,
160 char ***params, char ***values)
161 {
162 int i;
163 char *p1;
164
165
166 if ('\"' == value[0] && '\"' == value[strlen(value)-1]) {
167 p1 = strdup(&value[1]);
168 p1[strlen(p1)-1] = '\0';
169 } else {
170 p1 = strdup(value);
171 }
172
173
174
175
176
177 for (i = 0; NULL != *params && NULL != (*params)[i]; ++i) {
178 if (0 == strcmp(param, (*params)[i])) {
179
180
181 fprintf(stderr,
182 "---------------------------------------------------------------------------\n"
183 "The following MCA parameter has been listed multiple times on the\n"
184 "command line:\n\n"
185 " MCA param: %s\n\n"
186 "MCA parameters can only be listed once on a command line to ensure there\n"
187 "is no ambiguity as to its value. Please correct the situation and\n"
188 "try again.\n"
189 "---------------------------------------------------------------------------\n",
190 param);
191 free(p1);
192 return OPAL_ERROR;
193 }
194 }
195
196
197
198 opal_argv_append_nosize(params, param);
199 opal_argv_append_nosize(values, p1);
200 free(p1);
201
202 return OPAL_SUCCESS;
203 }
204
205
206 static void add_to_env(char **params, char **values, char ***env)
207 {
208 int i;
209 char *name;
210
211
212
213
214 for (i = 0; NULL != params && NULL != params[i]; ++i) {
215 (void) mca_base_var_env_name (params[i], &name);
216 opal_setenv(name, values[i], true, env);
217 free(name);
218 }
219 }
220
221 void mca_base_cmd_line_wrap_args(char **args)
222 {
223 int i;
224 char *tstr;
225
226 for (i=0; NULL != args && NULL != args[i]; i++) {
227 if (0 == strcmp(args[i], "-"OPAL_MCA_CMD_LINE_ID) ||
228 0 == strcmp(args[i], "--"OPAL_MCA_CMD_LINE_ID)) {
229 if (NULL == args[i+1] || NULL == args[i+2]) {
230
231
232
233 return;
234 }
235 i += 2;
236 opal_asprintf(&tstr, "\"%s\"", args[i]);
237 free(args[i]);
238 args[i] = tstr;
239 }
240 }
241 }