1
1
openmpi/ompi/tools/ompi_info/version.cc
George Bosilca 06563b5dec Last set of explicit conversions. We are now close to the zero warnings on
all platforms. The only exceptions (and I will not deal with them
anytime soon) are on Windows:
- the write functions which require the length to be an int when it's
  a size_t on all UNIX variants.
- all iovec manipulation functions where the iov_len is again an int
  when it's a size_t on most of the UNIXes.
As these only happens on Windows, so I think we're set for now :)

This commit was SVN r12215.
2006-10-20 03:57:44 +00:00

322 строки
9.2 KiB
C++

//
// Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
// University Research and Technology
// Corporation. All rights reserved.
// Copyright (c) 2004-2006 The University of Tennessee and The University
// of Tennessee Research Foundation. All rights
// reserved.
// Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
// University of Stuttgart. All rights reserved.
// Copyright (c) 2004-2005 The Regents of the University of California.
// All rights reserved.
// $COPYRIGHT$
//
// Additional copyrights may follow
//
// $HEADER$
//
#include "ompi_config.h"
#include <iostream>
#include <string>
#include <stdio.h>
#include "opal/version.h"
#include "orte/version.h"
#include "ompi/version.h"
#include "opal/mca/base/base.h"
#include "ompi/tools/ompi_info/ompi_info.h"
#include "opal/util/printf.h"
using namespace std;
using namespace ompi_info;
//
// Public variables
//
const string ompi_info::ver_full = "full";
const string ompi_info::ver_major = "major";
const string ompi_info::ver_minor = "minor";
const string ompi_info::ver_release = "release";
const string ompi_info::ver_greek = "greek";
const string ompi_info::ver_svn = "svn";
//
// Private variables
//
static const string ver_all = "all";
static const string ver_mca = "mca";
static const string ver_type = "type";
static const string ver_component = "component";
//
// Private functions
//
static void show_mca_version(const mca_base_component_t *component,
const string& scope, const string& ver_type);
static string make_version_str(const string& scope,
int major, int minor, int release,
const string& greek,
bool want_svn, const string& svn);
//
// do_version
//
// Determines the version information related to the ompi components
// being used.
// Accepts:
// - want_all: True if all components' info is required.
// - cmd_line: The constructed command line argument
//
void ompi_info::do_version(bool want_all, opal_cmd_line_t *cmd_line)
{
unsigned int count;
ompi_info::type_vector_t::size_type i;
string arg1, scope, type, component;
string::size_type pos;
open_components();
if (want_all) {
show_ompi_version(ver_full);
for (i = 0; i < mca_types.size(); ++i) {
show_component_version(mca_types[i], component_all, ver_full, type_all);
}
} else {
count = opal_cmd_line_get_ninsts(cmd_line, "version");
for (i = 0; i < count; ++i) {
arg1 = opal_cmd_line_get_param(cmd_line, "version", (int)i, 0);
scope = opal_cmd_line_get_param(cmd_line, "version", (int)i, 1);
// Version of Open MPI
if (type_ompi == arg1) {
show_ompi_version(scope);
}
// Specific type and component
else if (string::npos != (pos = arg1.find(':'))) {
type = arg1.substr(0, pos - 1);
component = arg1.substr(pos);
show_component_version(type, component, scope, ver_all);
}
// All components of a specific type
else {
show_component_version(arg1, component_all, scope, ver_all);
}
}
}
}
//
// Show the version of Open MPI
//
void ompi_info::show_ompi_version(const string& scope)
{
out("Open MPI", type_ompi + ":version:full",
make_version_str(scope,
OMPI_MAJOR_VERSION, OMPI_MINOR_VERSION,
OMPI_RELEASE_VERSION,
OMPI_GREEK_VERSION,
OMPI_WANT_SVN, OMPI_SVN_R));
out("Open MPI SVN revision", type_ompi + ":version:svn",
OMPI_SVN_R);
out("Open RTE", type_orte + ":version:full",
make_version_str(scope,
ORTE_MAJOR_VERSION, ORTE_MINOR_VERSION,
ORTE_RELEASE_VERSION,
ORTE_GREEK_VERSION,
ORTE_WANT_SVN, ORTE_SVN_R));
out("Open RTE SVN revision", type_orte + ":version:svn",
ORTE_SVN_R);
out("OPAL", type_opal + ":version:full",
make_version_str(scope,
OPAL_MAJOR_VERSION, OPAL_MINOR_VERSION,
OPAL_RELEASE_VERSION,
OPAL_GREEK_VERSION,
OPAL_WANT_SVN, OPAL_SVN_R));
out("OPAL SVN revision", type_opal + ":version:svn",
OPAL_SVN_R);
}
//
// Show all the components of a specific type/component combo (component may be
// a wildcard)
//
void ompi_info::show_component_version(const string& type_name,
const string& component_name,
const string& scope, const string& ver_type)
{
ompi_info::type_vector_t::size_type i;
bool want_all_components = (type_all == component_name);
bool found;
opal_list_item_t *item;
mca_base_component_list_item_t *cli;
const mca_base_component_t *component;
opal_list_t *components;
// Check to see if the type is valid
for (found = false, i = 0; i < mca_types.size(); ++i) {
if (mca_types[i] == type_name) {
found = true;
break;
}
}
if (!found) {
#if 0
show_help("ompi_info", "usage");
#endif
exit(1);
}
// Now that we have a valid type, find the right component list
components = component_map[type_name];
if (NULL != components) {
if (opal_list_get_size(components) > 0){
for (item = opal_list_get_first(components);
opal_list_get_end(components) != item;
item = opal_list_get_next(item)) {
cli = (mca_base_component_list_item_t *) item;
component = cli->cli_component;
if (want_all_components ||
component->mca_component_name == component_name) {
show_mca_version(component, scope, ver_type);
}
}
}
}
}
//
// Given a component, display its relevant version(s)
//
static void show_mca_version(const mca_base_component_t* component,
const string& scope, const string& ver_type)
{
bool printed;
bool want_mca = (ver_all == ver_type || ver_type == ver_mca);
bool want_type = (ver_all == ver_type || ver_type == ver_type);
bool want_component = (ver_all == ver_type || ver_type == ver_component);
string message, content;
string mca_version;
string api_version;
string component_version;
string empty;
mca_version = make_version_str(scope, component->mca_major_version,
component->mca_minor_version,
component->mca_release_version, "",
false, "");
api_version = make_version_str(scope, component->mca_type_major_version,
component->mca_type_minor_version,
component->mca_type_release_version, "",
false, "");
component_version = make_version_str(scope, component->mca_component_major_version,
component->mca_component_minor_version,
component->mca_component_release_version,
"", false, "");
if (pretty) {
message = "MCA ";
message += component->mca_type_name;
printed = false;
content = component->mca_component_name + string(" (");
if (want_mca) {
content += "MCA v" + mca_version;
printed = true;
}
if (want_type) {
if (printed)
content += ", ";
content += "API v" + api_version;
printed = true;
}
if (want_component) {
if (printed)
content += ", ";
content += "Component v" + component_version;
printed = true;
}
out(message, empty, content + ")");
} else {
message = "mca:";
message += component->mca_type_name;
message += ":";
message += component->mca_component_name;
message += ":version";
if (want_mca)
out(empty, message, "mca:" + mca_version);
if (want_type)
out(empty, message, "api:" + api_version);
if (want_component)
out(empty, message, "component:" + component_version);
}
}
static string make_version_str(const string& scope,
int major, int minor, int release,
const string &greek,
bool want_svn, const string& svn)
{
string str;
char temp[BUFSIZ];
temp[BUFSIZ - 1] = '\0';
if (scope == ver_full) {
snprintf(temp, BUFSIZ - 1, "%d.%d", major, minor);
str = temp;
if (release > 0) {
snprintf(temp, BUFSIZ - 1, ".%d", release);
str += temp;
}
if (!greek.empty()) {
str += greek;
}
if (want_svn && !svn.empty()) {
str += svn;
}
} else if (scope == ver_major) {
snprintf(temp, BUFSIZ - 1, "%d", major);
} else if (scope == ver_minor) {
snprintf(temp, BUFSIZ - 1, "%d", minor);
} else if (scope == ver_release) {
snprintf(temp, BUFSIZ - 1, "%d", release);
} else if (scope == ver_greek) {
str = greek;
} else if (scope == ver_svn) {
str = svn;
} else {
#if 0
show_help("ompi_info", "usage");
#endif
exit(1);
}
if (str.empty()) {
str = temp;
}
return str;
}