Migrate most of main() and and all option parsing to python
configs/test/fs.py:
configs/test/test.py:
update for the new way that m5 deals with options
src/python/SConscript:
Compile AUTHORS, LICENSE, README, and RELEASE_NOTES into the
python stuff.
src/python/m5/__init__.py:
redo the way options work.
Move them all to main.py
src/sim/main.cc:
Migrate more functionality for main() into python.
Namely option parsing
src/python/m5/attrdict.py:
A dictionary object that overrides attribute access to
do item access.
src/python/m5/main.py:
The new location for M5's option parsing, and the main()
routine to set up the simulation.
--HG--
extra : convert_revision : c86b87a9f508bde1994088e23fd470c7753ee4c1
This commit is contained in:
160
src/sim/main.cc
160
src/sim/main.cc
@@ -115,70 +115,11 @@ abortHandler(int sigtype)
|
||||
#endif
|
||||
}
|
||||
|
||||
/// Simulator executable name
|
||||
char *myProgName = "";
|
||||
|
||||
/// Show brief help message.
|
||||
void
|
||||
showBriefHelp(ostream &out)
|
||||
{
|
||||
char *prog = basename(myProgName);
|
||||
|
||||
ccprintf(out, "Usage:\n");
|
||||
ccprintf(out,
|
||||
"%s [-p <path>] [-i ] [-h] <config file>\n"
|
||||
"\n"
|
||||
" -p, --path <path> prepends <path> to PYTHONPATH instead of using\n"
|
||||
" built-in zip archive. Useful when developing/debugging\n"
|
||||
" changes to built-in Python libraries, as the new Python\n"
|
||||
" can be tested without building a new m5 binary.\n\n"
|
||||
" -i, --interactive forces entry into interactive mode after the supplied\n"
|
||||
" script is executed (just like the -i option to the\n"
|
||||
" Python interpreter).\n\n"
|
||||
" -h Prints this help\n\n"
|
||||
" <configfile> config file name which ends in .py. (Normally you can\n"
|
||||
" run <configfile> --help to get help on that config files\n"
|
||||
" parameters.\n\n",
|
||||
prog);
|
||||
|
||||
}
|
||||
|
||||
const char *briefCopyright =
|
||||
"Copyright (c) 2001-2006\n"
|
||||
"The Regents of The University of Michigan\n"
|
||||
"All Rights Reserved\n";
|
||||
|
||||
/// Print welcome message.
|
||||
void
|
||||
sayHello(ostream &out)
|
||||
{
|
||||
extern const char *compileDate; // from date.cc
|
||||
|
||||
ccprintf(out, "M5 Simulator System\n");
|
||||
// display copyright
|
||||
ccprintf(out, "%s\n", briefCopyright);
|
||||
ccprintf(out, "M5 compiled %d\n", compileDate);
|
||||
ccprintf(out, "M5 started %s\n", Time::start);
|
||||
|
||||
char *host = getenv("HOSTNAME");
|
||||
if (!host)
|
||||
host = getenv("HOST");
|
||||
|
||||
if (host)
|
||||
ccprintf(out, "M5 executing on %s\n", host);
|
||||
}
|
||||
|
||||
|
||||
extern "C" { void init_cc_main(); }
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
// Saze off program name
|
||||
myProgName = argv[0];
|
||||
|
||||
sayHello(cerr);
|
||||
|
||||
signal(SIGFPE, SIG_IGN); // may occur on misspeculated paths
|
||||
signal(SIGTRAP, SIG_IGN);
|
||||
signal(SIGUSR1, dumpStatsHandler); // dump intermediate stats
|
||||
@@ -189,72 +130,18 @@ main(int argc, char **argv)
|
||||
Py_SetProgramName(argv[0]);
|
||||
|
||||
// default path to m5 python code is the currently executing
|
||||
// file... Python ZipImporter will find embedded zip archive
|
||||
char *pythonpath = argv[0];
|
||||
|
||||
bool interactive = false;
|
||||
bool show_help = false;
|
||||
bool getopt_done = false;
|
||||
int opt_index = 0;
|
||||
|
||||
static struct option long_options[] = {
|
||||
{"python", 1, 0, 'p'},
|
||||
{"interactive", 0, 0, 'i'},
|
||||
{"help", 0, 0, 'h'},
|
||||
{0,0,0,0}
|
||||
};
|
||||
|
||||
do {
|
||||
switch (getopt_long(argc, argv, "+p:ih", long_options, &opt_index)) {
|
||||
// -p <path> prepends <path> to PYTHONPATH instead of
|
||||
// using built-in zip archive. Useful when
|
||||
// developing/debugging changes to built-in Python
|
||||
// libraries, as the new Python can be tested without
|
||||
// building a new m5 binary.
|
||||
case 'p':
|
||||
pythonpath = optarg;
|
||||
break;
|
||||
|
||||
// -i forces entry into interactive mode after the
|
||||
// supplied script is executed (just like the -i option to
|
||||
// the Python interpreter).
|
||||
case 'i':
|
||||
interactive = true;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
show_help = true;
|
||||
break;
|
||||
case -1:
|
||||
getopt_done = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
fatal("Unrecognized option %c\n", optopt);
|
||||
}
|
||||
} while (!getopt_done);
|
||||
|
||||
if (show_help) {
|
||||
showBriefHelp(cerr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Fix up argc & argv to hide arguments we just processed.
|
||||
// getopt() sets optind to the index of the first non-processed
|
||||
// argv element.
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
// Set up PYTHONPATH to make sure the m5 module is found
|
||||
string newpath(pythonpath);
|
||||
// file... Python ZipImporter will find embedded zip archive.
|
||||
// The M5_ARCHIVE environment variable can be used to override this.
|
||||
char *m5_archive = getenv("M5_ARCHIVE");
|
||||
string pythonpath = m5_archive ? m5_archive : argv[0];
|
||||
|
||||
char *oldpath = getenv("PYTHONPATH");
|
||||
if (oldpath != NULL) {
|
||||
newpath += ":";
|
||||
newpath += oldpath;
|
||||
pythonpath += ":";
|
||||
pythonpath += oldpath;
|
||||
}
|
||||
|
||||
if (setenv("PYTHONPATH", newpath.c_str(), true) == -1)
|
||||
if (setenv("PYTHONPATH", pythonpath.c_str(), true) == -1)
|
||||
fatal("setenv: %s\n", strerror(errno));
|
||||
|
||||
// initialize embedded Python interpreter
|
||||
@@ -264,37 +151,8 @@ main(int argc, char **argv)
|
||||
// initialize SWIG 'cc_main' module
|
||||
init_cc_main();
|
||||
|
||||
if (argc > 0) {
|
||||
// extra arg(s): first is script file, remaining ones are args
|
||||
// to script file
|
||||
char *filename = argv[0];
|
||||
FILE *fp = fopen(filename, "r");
|
||||
if (!fp) {
|
||||
fatal("cannot open file '%s'\n", filename);
|
||||
}
|
||||
|
||||
PyRun_AnyFile(fp, filename);
|
||||
} else {
|
||||
// no script file argument... force interactive prompt
|
||||
interactive = true;
|
||||
}
|
||||
|
||||
if (interactive) {
|
||||
// The following code to import readline was copied from Python
|
||||
// 2.4.3's Modules/main.c.
|
||||
// Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006
|
||||
// Python Software Foundation; All Rights Reserved
|
||||
// We should only enable this if we're actually using an
|
||||
// interactive prompt.
|
||||
PyObject *v;
|
||||
v = PyImport_ImportModule("readline");
|
||||
if (v == NULL)
|
||||
PyErr_Clear();
|
||||
else
|
||||
Py_DECREF(v);
|
||||
|
||||
PyRun_InteractiveLoop(stdin, "stdin");
|
||||
}
|
||||
PyRun_SimpleString("import m5");
|
||||
PyRun_SimpleString("m5.main()");
|
||||
|
||||
// clean up Python intepreter.
|
||||
Py_Finalize();
|
||||
|
||||
Reference in New Issue
Block a user