opal_wrapper.c
来自「MPI stands for the Message Passing Inter」· C语言 代码 · 共 759 行 · 第 1/2 页
C
759 行
} free(envname); if (NULL != *data) free(*data); *data = strdup(envvalue);}static voidload_env_data_argv(const char *project, const char *flag, char ***data){ char *envname; char *envvalue; if (NULL == project || NULL == flag) return; asprintf(&envname, "%s_MPI%s", project, flag); if (NULL == (envvalue = getenv(envname))) { free(envname); asprintf(&envname, "%s_%s", project, flag); if (NULL == (envvalue = getenv(envname))) { free(envname); return; } } free(envname); if (NULL != *data) opal_argv_free(*data); *data = opal_argv_split(envvalue, ' ');}intmain(int argc, char *argv[]){ int exit_status = 0, ret, flags = 0, i; int exec_argc = 0, user_argc = 0; char **exec_argv = NULL, **user_argv = NULL; char *exec_command, *base_argv0 = NULL; bool disable_flags = true; bool real_flag = false; if (OPAL_SUCCESS != (ret = opal_init_util())) { return ret; } /**************************************************** * * Setup compiler information * ****************************************************/ base_argv0 = opal_basename(argv[0]);#if defined(EXEEXT) if( 0 != strlen(EXEEXT) ) { char extension[] = EXEEXT; char* temp = strstr( base_argv0, extension ); char* old_match = temp; while( NULL != temp ) { old_match = temp; temp = strstr( temp + 1, extension ); } *old_match = '\0'; }#endif /* defined(EXEEXT) */ if (OPAL_SUCCESS != (ret = data_init(base_argv0))) { fprintf(stderr, "Error parsing data file %s: %s\n", base_argv0, opal_strerror(ret)); return ret; } for (i = 1 ; i < argc && user_data_idx < 0 ; ++i) { user_data_idx = find_options_index(argv[i]); } /* if we didn't find a match, look for the NULL (base case) options */ if (user_data_idx < 0) { user_data_idx = default_data_idx; } /* if we still didn't find a match, abort */ if (user_data_idx < 0) { char *flat = opal_argv_join(argv, ' '); opal_show_help("help-opal-wrapper.txt", "no-options-support", true, base_argv0, flat, NULL); free(flat); exit(1); } /* compiler */ load_env_data(options_data[user_data_idx].project_short, options_data[user_data_idx].compiler_env, &options_data[user_data_idx].compiler); /* preprocessor flags */ load_env_data_argv(options_data[user_data_idx].project_short, "CPPFLAGS", &options_data[user_data_idx].preproc_flags); /* compiler flags */ load_env_data_argv(options_data[user_data_idx].project_short, options_data[user_data_idx].compiler_flags_env, &options_data[user_data_idx].comp_flags); /* linker flags */ load_env_data_argv(options_data[user_data_idx].project_short, "LDFLAGS", &options_data[user_data_idx].link_flags); /* libs */ load_env_data_argv(options_data[user_data_idx].project_short, "LIBS", &options_data[user_data_idx].libs); /**************************************************** * * Sanity Checks * ****************************************************/ if (NULL != options_data[user_data_idx].req_file) { /* make sure the language is supported */ if (0 == strcmp(options_data[user_data_idx].req_file, "not supported")) { opal_show_help("help-opal-wrapper.txt", "no-language-support", true, options_data[user_data_idx].language, base_argv0, NULL); exit_status = 1; goto cleanup; } if (options_data[user_data_idx].req_file[0] != '\0') { char *filename; struct stat buf; filename = opal_os_path( false, options_data[user_data_idx].path_libdir, options_data[user_data_idx].req_file, NULL ); if (0 != stat(filename, &buf)) { opal_show_help("help-opal-wrapper.txt", "file-not-found", true, base_argv0, options_data[user_data_idx].req_file, options_data[user_data_idx].language, NULL); } } } /**************************************************** * * Parse user flags * ****************************************************/ flags = COMP_WANT_COMMAND|COMP_WANT_PREPROC| COMP_WANT_COMPILE|COMP_WANT_LINK; user_argv = opal_argv_copy(argv + 1); user_argc = opal_argv_count(user_argv); for (i = 0 ; i < user_argc ; ++i) { if (0 == strncmp(user_argv[i], "-showme", strlen("-showme")) || 0 == strncmp(user_argv[i], "--showme", strlen("--showme")) || 0 == strncmp(user_argv[i], "-show", strlen("-show")) || 0 == strncmp(user_argv[i], "--show", strlen("--show"))) { bool done_now = false; /* check for specific things we want to see. First three still invoke all the building routines. Last set want to parse out certain flags, so we don't go through the normal build routine - skip to cleanup. */ if (0 == strncmp(user_argv[i], "-showme:command", strlen("-showme:command")) || 0 == strncmp(user_argv[i], "--showme:command", strlen("--showme:command"))) { flags = COMP_WANT_COMMAND; /* we know what we want, so don't process any more args */ done_now = true; } else if (0 == strncmp(user_argv[i], "-showme:compile", strlen("-showme:compile")) || 0 == strncmp(user_argv[i], "--showme:compile", strlen("--showme:compile"))) { flags = COMP_WANT_PREPROC|COMP_WANT_COMPILE; /* we know what we want, so don't process any more args */ done_now = true; } else if (0 == strncmp(user_argv[i], "-showme:link", strlen("-showme:link")) || 0 == strncmp(user_argv[i], "--showme:link", strlen("--showme:link"))) { flags = COMP_WANT_COMPILE|COMP_WANT_LINK; /* we know what we want, so don't process any more args */ done_now = true; } else if (0 == strncmp(user_argv[i], "-showme:incdirs", strlen("-showme:incdirs")) || 0 == strncmp(user_argv[i], "--showme:incdirs", strlen("--showme:incdirs"))) { print_flags(options_data[user_data_idx].preproc_flags, OPAL_INCLUDE_FLAG); goto cleanup; } else if (0 == strncmp(user_argv[i], "-showme:libdirs", strlen("-showme:libdirs")) || 0 == strncmp(user_argv[i], "--showme:libdirs", strlen("--showme:libdirs"))) { print_flags(options_data[user_data_idx].link_flags, OPAL_LIBDIR_FLAG); goto cleanup; } else if (0 == strncmp(user_argv[i], "-showme:libs", strlen("-showme:libs")) || 0 == strncmp(user_argv[i], "--showme:libs", strlen("--showme:libs"))) { print_flags(options_data[user_data_idx].libs, "-l"); goto cleanup; } else if (0 == strncmp(user_argv[i], "-showme:version", strlen("-showme:version")) || 0 == strncmp(user_argv[i], "--showme:version", strlen("--showme:version"))) { opal_show_help("help-opal-wrapper.txt", "version", false, argv[0], options_data[user_data_idx].project, options_data[user_data_idx].version, options_data[user_data_idx].language, NULL); goto cleanup; } else if (0 == strncmp(user_argv[i], "-showme:", strlen("-showme:")) || 0 == strncmp(user_argv[i], "--showme:", strlen("--showme:"))) { opal_show_help("help-opal-wrapper.txt", "usage", true, argv[0], options_data[user_data_idx].project, NULL); goto cleanup; } flags |= (COMP_DRY_RUN|COMP_SHOW_ERROR); /* remove element from user_argv */ opal_argv_delete(&user_argc, &user_argv, i, 1); --i; if (done_now) { disable_flags = false; break; } } else if (0 == strcmp(user_argv[i], "-c")) { flags &= ~COMP_WANT_LINK; real_flag = true; } else if (0 == strcmp(user_argv[i], "-E") || 0 == strcmp(user_argv[i], "-M")) { flags &= ~(COMP_WANT_COMPILE | COMP_WANT_LINK); real_flag = true; } else if (0 == strcmp(user_argv[i], "-S")) { flags &= ~COMP_WANT_LINK; real_flag = true; } else if (0 == strcmp(user_argv[i], "-lpmpi")) { flags |= COMP_WANT_PMPI; /* remove element from user_argv */ opal_argv_delete(&user_argc, &user_argv, i, 1); --i; } else if ('-' != user_argv[i][0]) { disable_flags = false; flags |= COMP_SHOW_ERROR; real_flag = true; } else { /* if the option flag is one that we use to determine which set of compiler data to use, don't count it as a real option */ if (find_options_index(user_argv[i]) < 0) { real_flag = true; } } } /* clear out the want_flags if we got no arguments not starting with a - (dash) and -showme wasn't given OR -showme was given and we had at least one more non-showme argument that started with a - (dash) and no other non-dash arguments. Some examples: opal_wrapper : clear our flags opal_wrapper -v : clear our flags opal_wrapper -E a.c : don't clear our flags opal_wrapper a.c : don't clear our flags opal_wrapper -showme : don't clear our flags opal_wrapper -showme -v : clear our flags opal_wrapper -showme -E a.c : don't clear our flags opal_wrapper -showme a.c : don't clear our flags */ if (disable_flags && !((flags & COMP_DRY_RUN) && !real_flag)) { flags &= ~(COMP_WANT_PREPROC|COMP_WANT_COMPILE|COMP_WANT_LINK); }#if !OMPI_ENABLE_MPI_PROFILING /* sanity check */ if (flags & COMP_WANT_PMPI) { opal_show_help("help-opal-wrapper.txt", "no-profiling-support", true, argv[0], NULL); }#endif /**************************************************** * * Assemble the command line * ****************************************************/ /* compiler (may be multiple arguments, so split) */ if (flags & COMP_WANT_COMMAND) { exec_argv = opal_argv_split(options_data[user_data_idx].compiler, ' '); exec_argc = opal_argv_count(exec_argv); } else { exec_argv = malloc(sizeof(char*)); exec_argv[0] = NULL; exec_argc = 0; } /* preproc flags */ if (flags & COMP_WANT_PREPROC) { opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].preproc_flags); exec_argc = opal_argv_count(exec_argv); } /* compiler flags */ if (flags & COMP_WANT_COMPILE) { opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].comp_flags); /* Deal with languages like Fortran 90 that have special places and flags for modules or whatever */ if (options_data[user_data_idx].module_option != NULL) { char *line; asprintf(&line, "%s%s", options_data[user_data_idx].module_option, options_data[user_data_idx].path_libdir); opal_argv_append_nosize(&exec_argv, line); free(line); } exec_argc = opal_argv_count(exec_argv); } /* add all the user arguments */ opal_argv_insert(&exec_argv, exec_argc, user_argv); exec_argc = opal_argv_count(exec_argv); /* link flags and libs */ if (flags & COMP_WANT_LINK) { opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].link_flags); exec_argc = opal_argv_count(exec_argv); opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].libs); exec_argc = opal_argv_count(exec_argv); } /**************************************************** * * Execute the command * ****************************************************/ if (flags & COMP_DRY_RUN) { exec_command = opal_argv_join(exec_argv, ' '); printf("%s\n", exec_command); } else { char *tmp;#if 0 exec_command = opal_argv_join(exec_argv, ' '); printf("command: %s\n", exec_command);#endif tmp = opal_path_findv(exec_argv[0], 0, environ, NULL); if (NULL == tmp) { opal_show_help("help-opal-wrapper.txt", "no-compiler-found", true, exec_argv[0], NULL); errno = 0; exit_status = 1; } else { int status; free(exec_argv[0]); exec_argv[0] = tmp; ret = opal_few(exec_argv, &status); exit_status = WIFEXITED(status) ? WEXITSTATUS(status) : (WIFSIGNALED(status) ? WTERMSIG(status) : (WIFSTOPPED(status) ? WSTOPSIG(status) : 255)); if( (OPAL_SUCCESS != ret) || ((0 != exit_status) && (flags & COMP_SHOW_ERROR)) ) { char* exec_command = opal_argv_join(exec_argv, ' '); if( OPAL_SUCCESS != ret ) { opal_show_help("help-opal-wrapper.txt", "spawn-failed", true, exec_argv[0], strerror(status), exec_command, NULL); } else {#if 0 opal_show_help("help-opal-wrapper.txt", "compiler-failed", true, exec_argv[0], exit_status, exec_command, NULL);#endif } free(exec_command); } } } /**************************************************** * * Cleanup * ****************************************************/ cleanup: opal_argv_free(exec_argv); opal_argv_free(user_argv); if (NULL != base_argv0) free(base_argv0); if (OPAL_SUCCESS != (ret = data_finalize())) { return ret; } if (OPAL_SUCCESS != (ret = opal_finalize_util())) { return ret; } return exit_status;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?