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 }