This source file includes following definitions.
- options_data_init
- options_data_free
- options_data_expand
- find_options_index
- expand_flags
- data_callback
- data_init
- data_finalize
- print_flags
- load_env_data
- load_env_data_argv
- main
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 #include "opal_config.h"
  27 
  28 #include <stdio.h>
  29 #include <errno.h>
  30 #include <stdlib.h>
  31 #ifdef HAVE_SYS_STAT_H
  32 #include <sys/stat.h>
  33 #endif  
  34 #ifdef HAVE_SYS_TYPES_H
  35 #include <sys/types.h>
  36 #endif  
  37 #ifdef HAVE_REGEX_H
  38 #include <regex.h>
  39 #endif
  40 #ifdef HAVE_SYS_WAIT_H
  41 #include <sys/wait.h>
  42 #endif  
  43 #include <string.h>
  44 
  45 #include "opal/mca/installdirs/installdirs.h"
  46 #include "opal/runtime/opal.h"
  47 #include "opal/constants.h"
  48 #include "opal/util/argv.h"
  49 #include "opal/util/error.h"
  50 #include "opal/util/keyval_parse.h"
  51 #include "opal/util/opal_environ.h"
  52 #include "opal/util/show_help.h"
  53 #include "opal/util/path.h"
  54 #include "opal/util/few.h"
  55 #include "opal/util/basename.h"
  56 #include "opal/util/os_path.h"
  57 #include "opal/util/printf.h"
  58 
  59 #define OPAL_INCLUDE_FLAG  "-I"
  60 #define OPAL_LIBDIR_FLAG   "-L"
  61 
  62 struct options_data_t {
  63     char **compiler_args;
  64     char *language;
  65     char *project;
  66     char *project_short;
  67     char *version;
  68     char *compiler_env;
  69     char *compiler_flags_env;
  70     char *compiler;
  71     char **preproc_flags;
  72     char **comp_flags;
  73     char **comp_flags_prefix;
  74     char **link_flags;
  75     char **libs;
  76     char **libs_static;
  77     char *dyn_lib_file;
  78     char *static_lib_file;
  79     char *req_file;
  80     char *path_includedir;
  81     char *path_libdir;
  82     char *path_opalincludedir;
  83     char *path_opallibdir;
  84 };
  85 
  86 static struct options_data_t *options_data = NULL;
  87 
  88 static int parse_options_idx = -1;
  89 
  90 static int user_data_idx = -1;
  91 
  92 static int default_data_idx = -1;
  93 
  94 #define COMP_DRY_RUN       0x001
  95 #define COMP_SHOW_ERROR    0x002
  96 #define COMP_WANT_COMMAND  0x004
  97 #define COMP_WANT_PREPROC  0x008
  98 #define COMP_WANT_COMPILE  0x010
  99 #define COMP_WANT_LINK     0x020
 100 #define COMP_WANT_PMPI     0x040
 101 #define COMP_WANT_STATIC   0x080
 102 #define COMP_WANT_LINKALL  0x100
 103 
 104 static void
 105 options_data_init(struct options_data_t *data)
 106 {
 107     data->compiler_args = (char **) malloc(sizeof(char*));
 108     data->compiler_args[0] = NULL;
 109     data->language = NULL;
 110     data->compiler = NULL;
 111     data->project = NULL;
 112     data->project_short = NULL;
 113     data->version = NULL;
 114     data->compiler_env = NULL;
 115     data->compiler_flags_env = NULL;
 116     data->preproc_flags = (char **) malloc(sizeof(char*));
 117     data->preproc_flags[0] = NULL;
 118     data->comp_flags = (char **) malloc(sizeof(char*));
 119     data->comp_flags[0] = NULL;
 120     data->comp_flags_prefix = (char **) malloc(sizeof(char*));
 121     data->comp_flags_prefix[0] = NULL;
 122     data->link_flags = (char **) malloc(sizeof(char*));
 123     data->link_flags[0] = NULL;
 124     data->libs = (char **) malloc(sizeof(char*));
 125     data->libs[0] = NULL;
 126     data->libs_static = (char **) malloc(sizeof(char*));
 127     data->libs_static[0] = NULL;
 128     data->dyn_lib_file = NULL;
 129     data->static_lib_file = NULL;
 130     data->req_file = NULL;
 131     data->path_includedir = NULL;
 132     data->path_libdir = NULL;
 133     data->path_opalincludedir = NULL;
 134     data->path_opallibdir = NULL;
 135 }
 136 
 137 static void
 138 options_data_free(struct options_data_t *data)
 139 {
 140     if (NULL != data->compiler_args) {
 141         opal_argv_free(data->compiler_args);
 142     }
 143     if (NULL != data->language) free(data->language);
 144     if (NULL != data->compiler) free(data->compiler);
 145     if (NULL != data->project) free(data->project);
 146     if (NULL != data->project_short) free(data->project_short);
 147     if (NULL != data->version) free(data->version);
 148     if (NULL != data->compiler_env) free(data->compiler_env);
 149     if (NULL != data->compiler_flags_env) free(data->compiler_flags_env);
 150     opal_argv_free(data->preproc_flags);
 151     opal_argv_free(data->comp_flags);
 152     opal_argv_free(data->comp_flags_prefix);
 153     opal_argv_free(data->link_flags);
 154     opal_argv_free(data->libs);
 155     opal_argv_free(data->libs_static);
 156     if (NULL != data->dyn_lib_file) free(data->dyn_lib_file);
 157     if (NULL != data->static_lib_file) free(data->static_lib_file);
 158     if (NULL != data->req_file) free(data->req_file);
 159     if (NULL != data->path_includedir) free(data->path_includedir);
 160     if (NULL != data->path_libdir) free(data->path_libdir);
 161     if (NULL != data->path_opalincludedir) free(data->path_opalincludedir);
 162     if (NULL != data->path_opallibdir) free(data->path_opallibdir);
 163 }
 164 
 165 static void
 166 options_data_expand(const char *value)
 167 {
 168     
 169     parse_options_idx++;
 170     options_data = (struct options_data_t *) realloc(options_data, sizeof(struct options_data_t) * (parse_options_idx + 1));
 171     options_data_init(&(options_data[parse_options_idx]));
 172 
 173     
 174 
 175     if (NULL != value && 0 != strcmp(value, "")) {
 176         char **values = opal_argv_split(value, ';');
 177         opal_argv_insert(&(options_data[parse_options_idx].compiler_args),
 178                          opal_argv_count(options_data[parse_options_idx].compiler_args),
 179                          values);
 180         opal_argv_free(values);
 181     } else {
 182         free(options_data[parse_options_idx].compiler_args);
 183         options_data[parse_options_idx].compiler_args = NULL;
 184         
 185         default_data_idx = parse_options_idx;
 186     }
 187 }
 188 
 189 
 190 static int
 191 find_options_index(const char *arg)
 192 {
 193     int i, j;
 194 #ifdef HAVE_REGEXEC
 195     int args_count;
 196     regex_t res;
 197 #endif
 198 
 199     for (i = 0 ; i <= parse_options_idx ; ++i) {
 200         if (NULL == options_data[i].compiler_args) {
 201             continue;
 202         }
 203 
 204 #ifdef HAVE_REGEXEC
 205         args_count = opal_argv_count(options_data[i].compiler_args);
 206         for (j = 0 ; j < args_count ; ++j) {
 207             if (0 != regcomp(&res, options_data[i].compiler_args[j], REG_NOSUB)) {
 208                 return -1;
 209             }
 210 
 211             if (0 == regexec(&res, arg, (size_t) 0, NULL, 0)) {
 212                 regfree(&res);
 213                 return i;
 214             }
 215 
 216             regfree(&res);
 217         }
 218 #else
 219         for (j = 0 ; j < opal_argv_count(options_data[i].compiler_args) ; ++j) {
 220             if (0 == strcmp(arg, options_data[i].compiler_args[j])) {
 221                 return i;
 222             }
 223         }
 224 #endif
 225     }
 226 
 227     return -1;
 228 }
 229 
 230 
 231 static void
 232 expand_flags(char **argv)
 233 {
 234     int i;
 235     char *tmp;
 236 
 237     for (i = 0 ; argv[i] != NULL ; ++i) {
 238         tmp = opal_install_dirs_expand(argv[i]);
 239         if (tmp != argv[i]) {
 240             free(argv[i]);
 241             argv[i] = tmp;
 242         }
 243     }
 244 }
 245 
 246 
 247 static void
 248 data_callback(const char *key, const char *value)
 249 {
 250     
 251 
 252     if (parse_options_idx < 0 && 0 != strcmp(key, "compiler_args")) {
 253         options_data_expand(NULL);
 254     }
 255 
 256     if (0 == strcmp(key, "compiler_args")) {
 257         options_data_expand(value);
 258     } else if (0 == strcmp(key, "language")) {
 259         if (NULL != value) options_data[parse_options_idx].language = strdup(value);
 260     } else if (0 == strcmp(key, "compiler")) {
 261         if (NULL != value) options_data[parse_options_idx].compiler = strdup(value);
 262     } else if (0 == strcmp(key, "project")) {
 263         if (NULL != value) options_data[parse_options_idx].project = strdup(value);
 264     } else if (0 == strcmp(key, "version")) {
 265         if (NULL != value) options_data[parse_options_idx].version = strdup(value);
 266     } else if (0 == strcmp(key, "preprocessor_flags")) {
 267         char **values = opal_argv_split(value, ' ');
 268         opal_argv_insert(&options_data[parse_options_idx].preproc_flags,
 269                          opal_argv_count(options_data[parse_options_idx].preproc_flags),
 270                          values);
 271         expand_flags(options_data[parse_options_idx].preproc_flags);
 272         opal_argv_free(values);
 273     } else if (0 == strcmp(key, "compiler_flags")) {
 274         char **values = opal_argv_split(value, ' ');
 275         opal_argv_insert(&options_data[parse_options_idx].comp_flags,
 276                          opal_argv_count(options_data[parse_options_idx].comp_flags),
 277                          values);
 278         expand_flags(options_data[parse_options_idx].comp_flags);
 279         opal_argv_free(values);
 280     } else if (0 == strcmp(key, "compiler_flags_prefix")) {
 281         char **values = opal_argv_split(value, ' ');
 282         opal_argv_insert(&options_data[parse_options_idx].comp_flags_prefix,
 283                          opal_argv_count(options_data[parse_options_idx].comp_flags_prefix),
 284                          values);
 285         expand_flags(options_data[parse_options_idx].comp_flags_prefix);
 286         opal_argv_free(values);
 287     } else if (0 == strcmp(key, "linker_flags")) {
 288         char **values = opal_argv_split(value, ' ');
 289         opal_argv_insert(&options_data[parse_options_idx].link_flags,
 290                          opal_argv_count(options_data[parse_options_idx].link_flags),
 291                          values);
 292         expand_flags(options_data[parse_options_idx].link_flags);
 293         opal_argv_free(values);
 294     } else if (0 == strcmp(key, "libs")) {
 295         char **values = opal_argv_split(value, ' ');
 296         opal_argv_insert(&options_data[parse_options_idx].libs,
 297                          opal_argv_count(options_data[parse_options_idx].libs),
 298                          values);
 299         opal_argv_free(values);
 300     } else if (0 == strcmp(key, "libs_static")) {
 301         char **values = opal_argv_split(value, ' ');
 302         opal_argv_insert(&options_data[parse_options_idx].libs_static,
 303                          opal_argv_count(options_data[parse_options_idx].libs_static),
 304                          values);
 305         opal_argv_free(values);
 306     } else if (0 == strcmp(key, "dyn_lib_file")) {
 307         if (NULL != value) options_data[parse_options_idx].dyn_lib_file = strdup(value);
 308     } else if (0 == strcmp(key, "static_lib_file")) {
 309         if (NULL != value) options_data[parse_options_idx].static_lib_file = strdup(value);
 310     } else if (0 == strcmp(key, "required_file")) {
 311         if (NULL != value) options_data[parse_options_idx].req_file = strdup(value);
 312     } else if (0 == strcmp(key, "project_short")) {
 313         if (NULL != value) options_data[parse_options_idx].project_short = strdup(value);
 314     } else if (0 == strcmp(key, "compiler_env")) {
 315         if (NULL != value) options_data[parse_options_idx].compiler_env = strdup(value);
 316     } else if (0 == strcmp(key, "compiler_flags_env")) {
 317         if (NULL != value) options_data[parse_options_idx].compiler_flags_env = strdup(value);
 318     } else if (0 == strcmp(key, "includedir")) {
 319         if (NULL != value) {
 320             options_data[parse_options_idx].path_includedir =
 321                 opal_install_dirs_expand(value);
 322             if (0 != strcmp(options_data[parse_options_idx].path_includedir, "/usr/include") ||
 323                 0 == strncmp(options_data[parse_options_idx].language, "Fortran", strlen("Fortran"))) {
 324                 char *line;
 325                 opal_asprintf(&line, OPAL_INCLUDE_FLAG"%s",
 326                          options_data[parse_options_idx].path_includedir);
 327                 opal_argv_append_nosize(&options_data[parse_options_idx].preproc_flags, line);
 328                 free(line);
 329             }
 330         }
 331     } else if (0 == strcmp(key, "libdir")) {
 332         if (NULL != value) options_data[parse_options_idx].path_libdir =
 333                                opal_install_dirs_expand(value);
 334         if (0 != strcmp(options_data[parse_options_idx].path_libdir, "/usr/lib")) {
 335             char *line;
 336             opal_asprintf(&line, OPAL_LIBDIR_FLAG"%s",
 337                      options_data[parse_options_idx].path_libdir);
 338             opal_argv_append_nosize(&options_data[parse_options_idx].link_flags, line);
 339             free(line);
 340         }
 341     } else if (0 == strcmp(key, "opalincludedir")) {
 342         printf("EXPANDING!\n");
 343         if (NULL != value) {
 344             options_data[parse_options_idx].path_opalincludedir =
 345                 opal_install_dirs_expand(value);
 346             if (0 != strcmp(options_data[parse_options_idx].path_opalincludedir, "/usr/include") ||
 347                 0 == strncmp(options_data[parse_options_idx].language, "Fortran", strlen("Fortran"))) {
 348                 char *line;
 349                 opal_asprintf(&line, OPAL_INCLUDE_FLAG"%s",
 350                          options_data[parse_options_idx].path_opalincludedir);
 351                 opal_argv_append_nosize(&options_data[parse_options_idx].preproc_flags, line);
 352                 free(line);
 353             }
 354         }
 355     } else if (0 == strcmp(key, "opallibdir")) {
 356         if (NULL != value) options_data[parse_options_idx].path_opallibdir =
 357                                opal_install_dirs_expand(value);
 358         if (0 != strcmp(options_data[parse_options_idx].path_opallibdir, "/usr/lib")) {
 359             char *line;
 360             opal_asprintf(&line, OPAL_LIBDIR_FLAG"%s",
 361                      options_data[parse_options_idx].path_opallibdir);
 362             opal_argv_append_nosize(&options_data[parse_options_idx].link_flags, line);
 363             free(line);
 364         }
 365     }
 366 }
 367 
 368 
 369 static int
 370 data_init(const char *appname)
 371 {
 372     int ret;
 373     char *datafile;
 374 
 375     
 376     opal_asprintf(&datafile, "%s%s%s-wrapper-data.txt",
 377              opal_install_dirs.opaldatadir, OPAL_PATH_SEP, appname);
 378     if (NULL == datafile) return OPAL_ERR_TEMP_OUT_OF_RESOURCE;
 379 
 380     ret = opal_util_keyval_parse(datafile, data_callback);
 381     if( OPAL_SUCCESS != ret ) {
 382         fprintf(stderr, "Cannot open configuration file %s\n", datafile );
 383     }
 384     free(datafile);
 385 
 386     return ret;
 387 }
 388 
 389 
 390 static int
 391 data_finalize(void)
 392 {
 393     int i;
 394 
 395     for (i = 0 ; i <= parse_options_idx ; ++i) {
 396         options_data_free(&(options_data[i]));
 397     }
 398     free(options_data);
 399 
 400     return OPAL_SUCCESS;
 401 }
 402 
 403 
 404 static void
 405 print_flags(char **args, char *pattern)
 406 {
 407     int i;
 408     bool found = false;
 409 
 410     for (i = 0 ; args[i] != NULL ; ++i) {
 411         if (0 == strncmp(args[i], pattern, strlen(pattern))) {
 412             if (found)  printf(" ");
 413             printf("%s", args[i] + strlen(pattern));
 414             found = true;
 415         }
 416     }
 417 
 418     if (found) printf("\n");
 419 }
 420 
 421 
 422 static void
 423 load_env_data(const char *project, const char *flag, char **data)
 424 {
 425     char *envname;
 426     char *envvalue;
 427 
 428     if (NULL == project || NULL == flag) return;
 429 
 430     opal_asprintf(&envname, "%s_MPI%s", project, flag);
 431     if (NULL == (envvalue = getenv(envname))) {
 432         free(envname);
 433         opal_asprintf(&envname, "%s_%s", project, flag);
 434         if (NULL == (envvalue = getenv(envname))) {
 435             free(envname);
 436             return;
 437         }
 438     }
 439     free(envname);
 440 
 441     if (NULL != *data) free(*data);
 442     *data = strdup(envvalue);
 443 }
 444 
 445 
 446 static void
 447 load_env_data_argv(const char *project, const char *flag, char ***data)
 448 {
 449     char *envname;
 450     char *envvalue;
 451 
 452     if (NULL == project || NULL == flag) return;
 453 
 454     opal_asprintf(&envname, "%s_MPI%s", project, flag);
 455     if (NULL == (envvalue = getenv(envname))) {
 456         free(envname);
 457         opal_asprintf(&envname, "%s_%s", project, flag);
 458         if (NULL == (envvalue = getenv(envname))) {
 459             free(envname);
 460             return;
 461         }
 462     }
 463     free(envname);
 464 
 465     if (NULL != *data) opal_argv_free(*data);
 466 
 467     *data = opal_argv_split(envvalue, ' ');
 468 }
 469 
 470 
 471 int
 472 main(int argc, char *argv[])
 473 {
 474     int exit_status = 0, ret, flags = 0, i;
 475     int exec_argc = 0, user_argc = 0;
 476     char **exec_argv = NULL, **user_argv = NULL;
 477     char *exec_command, *base_argv0 = NULL;
 478     bool disable_flags = true;
 479     bool real_flag = false;
 480 
 481     if (OPAL_SUCCESS != (ret = opal_init_util(&argc, &argv))) {
 482         return ret;
 483     }
 484 
 485     
 486 
 487 
 488 
 489 
 490 
 491     base_argv0 = opal_basename(argv[0]);
 492 #if defined(EXEEXT)
 493     if( 0 != strlen(EXEEXT) ) {
 494         char extension[] = EXEEXT;
 495         char* temp = strstr( base_argv0, extension );
 496         char* old_match = temp;
 497         while( NULL != temp ) {
 498             old_match = temp;
 499             temp = strstr( temp + 1, extension );
 500         }
 501         
 502         if ( NULL != old_match ) {
 503             *old_match = '\0';
 504         }
 505     }
 506 #endif  
 507 
 508     if (OPAL_SUCCESS != (ret = data_init(base_argv0))) {
 509         fprintf(stderr, "Error parsing data file %s: %s\n", base_argv0, opal_strerror(ret));
 510         return ret;
 511     }
 512 
 513     for (i = 1 ; i < argc && user_data_idx < 0 ; ++i) {
 514         user_data_idx = find_options_index(argv[i]);
 515     }
 516     
 517     if (user_data_idx < 0) {
 518         user_data_idx = default_data_idx;
 519     }
 520     
 521     if (user_data_idx < 0) {
 522         char *flat = opal_argv_join(argv, ' ');
 523         opal_show_help("help-opal-wrapper.txt", "no-options-support", true,
 524                        base_argv0, flat, NULL);
 525         free(flat);
 526         exit(1);
 527     }
 528 
 529     
 530     load_env_data(options_data[user_data_idx].project_short, options_data[user_data_idx].compiler_env, &options_data[user_data_idx].compiler);
 531 
 532     
 533     load_env_data_argv(options_data[user_data_idx].project_short, "CPPFLAGS", &options_data[user_data_idx].preproc_flags);
 534 
 535     
 536     load_env_data_argv(options_data[user_data_idx].project_short, options_data[user_data_idx].compiler_flags_env,
 537                        &options_data[user_data_idx].comp_flags);
 538 
 539     
 540     load_env_data_argv(options_data[user_data_idx].project_short, "LDFLAGS", &options_data[user_data_idx].link_flags);
 541 
 542     
 543     load_env_data_argv(options_data[user_data_idx].project_short, "LIBS", &options_data[user_data_idx].libs);
 544 
 545 
 546     
 547 
 548 
 549 
 550 
 551 
 552     if (NULL != options_data[user_data_idx].req_file) {
 553         
 554         if (0 == strcmp(options_data[user_data_idx].req_file, "not supported")) {
 555             opal_show_help("help-opal-wrapper.txt", "no-language-support", true,
 556                            options_data[user_data_idx].language, base_argv0, NULL);
 557             exit_status = 1;
 558             goto cleanup;
 559         }
 560 
 561         if (options_data[user_data_idx].req_file[0] != '\0') {
 562             char *filename;
 563             struct stat buf;
 564             filename = opal_os_path( false, options_data[user_data_idx].path_libdir, options_data[user_data_idx].req_file, NULL );
 565             if (0 != stat(filename, &buf)) {
 566                 opal_show_help("help-opal-wrapper.txt", "file-not-found", true,
 567                                base_argv0, options_data[user_data_idx].req_file, options_data[user_data_idx].language, NULL);
 568             }
 569         }
 570     }
 571 
 572     
 573 
 574 
 575 
 576 
 577     flags = COMP_WANT_COMMAND|COMP_WANT_PREPROC|
 578         COMP_WANT_COMPILE|COMP_WANT_LINK;
 579 
 580     user_argv = opal_argv_copy(argv + 1);
 581     user_argc = opal_argv_count(user_argv);
 582 
 583     for (i = 0 ; i < user_argc ; ++i) {
 584         if (0 == strncmp(user_argv[i], "-showme", strlen("-showme")) ||
 585             0 == strncmp(user_argv[i], "--showme", strlen("--showme")) ||
 586             0 == strncmp(user_argv[i], "-show", strlen("-show")) ||
 587             0 == strncmp(user_argv[i], "--show", strlen("--show"))) {
 588             bool done_now = false;
 589 
 590             
 591 
 592 
 593 
 594             if (0 == strncmp(user_argv[i], "-showme:command", strlen("-showme:command")) ||
 595                 0 == strncmp(user_argv[i], "--showme:command", strlen("--showme:command"))) {
 596                 flags = COMP_WANT_COMMAND;
 597                 
 598                 done_now = true;
 599             } else if (0 == strncmp(user_argv[i], "-showme:compile", strlen("-showme:compile")) ||
 600                 0 == strncmp(user_argv[i], "--showme:compile", strlen("--showme:compile"))) {
 601                 flags = COMP_WANT_PREPROC|COMP_WANT_COMPILE;
 602                 
 603                 done_now = true;
 604             } else if (0 == strncmp(user_argv[i], "-showme:link", strlen("-showme:link")) ||
 605                        0 == strncmp(user_argv[i], "--showme:link", strlen("--showme:link"))) {
 606                 flags = COMP_WANT_COMPILE|COMP_WANT_LINK;
 607                 
 608                 done_now = true;
 609             } else if (0 == strncmp(user_argv[i], "-showme:incdirs", strlen("-showme:incdirs")) ||
 610                        0 == strncmp(user_argv[i], "--showme:incdirs", strlen("--showme:incdirs"))) {
 611                 print_flags(options_data[user_data_idx].preproc_flags, OPAL_INCLUDE_FLAG);
 612                 goto cleanup;
 613             } else if (0 == strncmp(user_argv[i], "-showme:libdirs", strlen("-showme:libdirs")) ||
 614                        0 == strncmp(user_argv[i], "--showme:libdirs", strlen("--showme:libdirs"))) {
 615                 print_flags(options_data[user_data_idx].link_flags, OPAL_LIBDIR_FLAG);
 616                 goto cleanup;
 617             } else if (0 == strncmp(user_argv[i], "-showme:libs", strlen("-showme:libs")) ||
 618                        0 == strncmp(user_argv[i], "--showme:libs", strlen("--showme:libs"))) {
 619                 print_flags(options_data[user_data_idx].libs, "-l");
 620                 goto cleanup;
 621             } else if (0 == strncmp(user_argv[i], "-showme:version", strlen("-showme:version")) ||
 622                        0 == strncmp(user_argv[i], "--showme:version", strlen("--showme:version"))) {
 623                 char * str;
 624                 str = opal_show_help_string("help-opal-wrapper.txt",
 625                                             "version", false,
 626                                             argv[0], options_data[user_data_idx].project, options_data[user_data_idx].version, options_data[user_data_idx].language, NULL);
 627                 if (NULL != str) {
 628                     printf("%s", str);
 629                     free(str);
 630                 }
 631                 goto cleanup;
 632             } else if (0 == strncmp(user_argv[i], "-showme:help", strlen("-showme:help")) ||
 633                        0 == strncmp(user_argv[i], "--showme:help", strlen("--showme:help"))) {
 634                 char *str;
 635                 str = opal_show_help_string("help-opal-wrapper.txt", "usage",
 636                                             false, argv[0],
 637                                             options_data[user_data_idx].project,
 638                                             NULL);
 639                 if (NULL != str) {
 640                     printf("%s", str);
 641                     free(str);
 642                 }
 643 
 644                 exit_status = 0;
 645                 goto cleanup;
 646             } else if (0 == strncmp(user_argv[i], "-showme:", strlen("-showme:")) ||
 647                        0 == strncmp(user_argv[i], "--showme:", strlen("--showme:"))) {
 648                 fprintf(stderr, "%s: unrecognized option: %s\n", argv[0],
 649                         user_argv[i]);
 650                 fprintf(stderr, "Type '%s --showme:help' for usage.\n",
 651                         argv[0]);
 652                 exit_status = 1;
 653                 goto cleanup;
 654             }
 655 
 656             flags |= (COMP_DRY_RUN|COMP_SHOW_ERROR);
 657             
 658             opal_argv_delete(&user_argc, &user_argv, i, 1);
 659             --i;
 660 
 661             if (done_now) {
 662                 disable_flags = false;
 663                 break;
 664             }
 665 
 666         } else if (0 == strcmp(user_argv[i], "-c")) {
 667             flags &= ~COMP_WANT_LINK;
 668             real_flag = true;
 669         } else if (0 == strcmp(user_argv[i], "-E") ||
 670                    0 == strcmp(user_argv[i], "-M")) {
 671             flags &= ~(COMP_WANT_COMPILE | COMP_WANT_LINK);
 672             real_flag = true;
 673         } else if (0 == strcmp(user_argv[i], "-S")) {
 674             flags &= ~COMP_WANT_LINK;
 675             real_flag = true;
 676         } else if (0 == strcmp(user_argv[i], "-lpmpi")) {
 677             flags |= COMP_WANT_PMPI;
 678 
 679             
 680             opal_argv_delete(&user_argc, &user_argv, i, 1);
 681             --i;
 682         } else if (0 == strcmp(user_argv[i], "-static") ||
 683                    0 == strcmp(user_argv[i], "--static") ||
 684                    0 == strcmp(user_argv[i], "-Bstatic") ||
 685                    0 == strcmp(user_argv[i], "-Wl,-static") ||
 686                    0 == strcmp(user_argv[i], "-Wl,--static") ||
 687                    0 == strcmp(user_argv[i], "-Wl,-Bstatic")) {
 688             flags |= COMP_WANT_STATIC;
 689         } else if (0 == strcmp(user_argv[i], "-dynamic") ||
 690                    0 == strcmp(user_argv[i], "--dynamic") ||
 691                    0 == strcmp(user_argv[i], "-Bdynamic") ||
 692                    0 == strcmp(user_argv[i], "-Wl,-dynamic") ||
 693                    0 == strcmp(user_argv[i], "-Wl,--dynamic") ||
 694                    0 == strcmp(user_argv[i], "-Wl,-Bdynamic")) {
 695             flags &= ~COMP_WANT_STATIC;
 696         } else if (0 == strcmp(user_argv[i], "--openmpi:linkall")) {
 697             
 698 
 699 
 700 
 701 
 702 
 703 
 704 
 705 
 706 
 707 
 708 
 709 
 710 
 711 
 712 
 713 
 714 
 715             flags |= COMP_WANT_LINKALL;
 716 
 717             
 718             opal_argv_delete(&user_argc, &user_argv, i, 1);
 719         } else if ('-' != user_argv[i][0]) {
 720             disable_flags = false;
 721             flags |= COMP_SHOW_ERROR;
 722             real_flag = true;
 723         } else {
 724             
 725 
 726 
 727             if (find_options_index(user_argv[i]) < 0) {
 728                 real_flag = true;
 729             }
 730         }
 731     }
 732 
 733     
 734 
 735 
 736 
 737 
 738 
 739 
 740 
 741 
 742 
 743 
 744 
 745 
 746 
 747     if (disable_flags && !((flags & COMP_DRY_RUN) && !real_flag)) {
 748         flags &= ~(COMP_WANT_PREPROC|COMP_WANT_COMPILE|COMP_WANT_LINK);
 749     }
 750 
 751     
 752 
 753 
 754 
 755 
 756 
 757     
 758     if (flags & COMP_WANT_COMMAND) {
 759         exec_argv = opal_argv_split(options_data[user_data_idx].compiler, ' ');
 760         exec_argc = opal_argv_count(exec_argv);
 761     } else {
 762         exec_argv = (char **) malloc(sizeof(char*));
 763         exec_argv[0] = NULL;
 764         exec_argc = 0;
 765     }
 766 
 767     
 768 
 769     if (NULL == exec_argv) {
 770         opal_show_help("help-opal-wrapper.txt", "no-compiler-specified", true);
 771         return 1;
 772     }
 773 
 774     if (flags & COMP_WANT_COMPILE) {
 775         opal_argv_insert(&exec_argv, exec_argc,
 776                          options_data[user_data_idx].comp_flags_prefix);
 777         exec_argc = opal_argv_count(exec_argv);
 778     }
 779 
 780     
 781 
 782     opal_argv_insert(&exec_argv, exec_argc, user_argv);
 783     exec_argc = opal_argv_count(exec_argv);
 784 
 785     
 786     if (flags & COMP_WANT_PREPROC) {
 787         opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].preproc_flags);
 788         exec_argc = opal_argv_count(exec_argv);
 789     }
 790 
 791     
 792     if (flags & COMP_WANT_COMPILE) {
 793         opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].comp_flags);
 794         exec_argc = opal_argv_count(exec_argv);
 795     }
 796 
 797     
 798     if (flags & COMP_WANT_LINK) {
 799         bool have_static_lib;
 800         bool have_dyn_lib;
 801         bool use_static_libs;
 802         char *filename1, *filename2;
 803         struct stat buf;
 804 
 805         opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].link_flags);
 806         exec_argc = opal_argv_count(exec_argv);
 807 
 808         
 809 
 810 
 811 
 812 
 813 
 814 
 815 
 816 
 817 
 818 
 819 
 820 
 821 
 822 
 823 
 824         filename1 = opal_os_path( false, options_data[user_data_idx].path_libdir, options_data[user_data_idx].static_lib_file, NULL );
 825         if (0 == stat(filename1, &buf)) {
 826             have_static_lib = true;
 827         } else {
 828             have_static_lib = false;
 829         }
 830 
 831         filename2 = opal_os_path( false, options_data[user_data_idx].path_libdir, options_data[user_data_idx].dyn_lib_file, NULL );
 832         if (0 == stat(filename2, &buf)) {
 833             have_dyn_lib = true;
 834         } else {
 835             have_dyn_lib = false;
 836         }
 837 
 838         
 839 
 840         if (flags & COMP_WANT_LINKALL) {
 841             
 842 
 843 
 844             if (have_static_lib || have_dyn_lib) {
 845                 use_static_libs = true;
 846             } else {
 847                 fprintf(stderr, "The linkall option has failed as we were unable to find either static or dynamic libs\n"
 848                         "Files looked for:\n  Static: %s\n  Dynamic: %s\n",
 849                         filename1, filename2);
 850                 free(filename1);
 851                 free(filename2);
 852                 exit(1);
 853             }
 854         } else if (flags & COMP_WANT_STATIC) {
 855             
 856 
 857 
 858             if (have_static_lib) {
 859                 use_static_libs = true;
 860             } else {
 861                 use_static_libs = false;
 862             }
 863         } else {
 864             
 865 
 866 
 867 
 868             if (have_dyn_lib) {
 869                 use_static_libs = false;
 870             } else {
 871                 use_static_libs = true;
 872             }
 873         }
 874         free(filename1);
 875         free(filename2);
 876 
 877         if (use_static_libs) {
 878             opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].libs_static);
 879         } else {
 880             opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].libs);
 881         }
 882         exec_argc = opal_argv_count(exec_argv);
 883     }
 884 
 885 
 886     
 887 
 888 
 889 
 890 
 891 
 892     if (flags & COMP_DRY_RUN) {
 893         exec_command = opal_argv_join(exec_argv, ' ');
 894         printf("%s\n", exec_command);
 895     } else {
 896         char *tmp;
 897 
 898 #if 0
 899         exec_command = opal_argv_join(exec_argv, ' ');
 900         printf("command: %s\n", exec_command);
 901 #endif
 902 
 903         tmp = opal_path_findv(exec_argv[0], 0, environ, NULL);
 904         if (NULL == tmp) {
 905             opal_show_help("help-opal-wrapper.txt", "no-compiler-found", true,
 906                            exec_argv[0], NULL);
 907             errno = 0;
 908             exit_status = 1;
 909         }  else {
 910             int status;
 911 
 912             free(exec_argv[0]);
 913             exec_argv[0] = tmp;
 914             ret = opal_few(exec_argv, &status);
 915             exit_status = WIFEXITED(status) ? WEXITSTATUS(status) :
 916                               (WIFSIGNALED(status) ? WTERMSIG(status) :
 917                                   (WIFSTOPPED(status) ? WSTOPSIG(status) : 255));
 918             if( (OPAL_SUCCESS != ret) || ((0 != exit_status) && (flags & COMP_SHOW_ERROR)) ) {
 919                 char* exec_command = opal_argv_join(exec_argv, ' ');
 920                 if( OPAL_SUCCESS != ret ) {
 921                     opal_show_help("help-opal-wrapper.txt", "spawn-failed", true,
 922                                    exec_argv[0], strerror(status), exec_command, NULL);
 923                 } else {
 924 #if 0
 925                     opal_show_help("help-opal-wrapper.txt", "compiler-failed", true,
 926                                    exec_argv[0], exit_status, exec_command, NULL);
 927 #endif
 928                 }
 929                 free(exec_command);
 930             }
 931         }
 932     }
 933 
 934     
 935 
 936 
 937 
 938 
 939  cleanup:
 940 
 941     opal_argv_free(exec_argv);
 942     opal_argv_free(user_argv);
 943     if (NULL != base_argv0) free(base_argv0);
 944 
 945     if (OPAL_SUCCESS != (ret = data_finalize())) {
 946         return ret;
 947     }
 948 
 949     if (OPAL_SUCCESS != (ret = opal_finalize_util())) {
 950         return ret;
 951     }
 952 
 953     return exit_status;
 954 }