compile_pass (systemtap_session& s)
{
// fill in a quick Makefile
- if (1)
+ string makefile_nm = s.tmpdir + "/Makefile";
+ ofstream o (makefile_nm.c_str());
+ int rc = 0;
+
+ // Create makefile
+ if (s.test_mode)
+ {
+ string module_dir = string("/lib/modules/")
+ + s.kernel_release + "/build";
+ o << "CFLAGS += -I \"" << module_dir << "/include\"" << endl;
+ o << "CFLAGS += -I \"" << s.runtime_path << "/user\"" << endl;
+ o << "CFLAGS += -I \"" << s.runtime_path << "\"" << endl;
+ o << "CFLAGS += -I \"" << module_dir << "/include/asm/mach-default\"" << endl;
+ o << s.module_name << ": " << s.translated_source << endl;
+ o << "\t$(CC) $(CFLAGS) -o " << s.module_name
+ << " " << s.translated_source << endl;
+ o.close ();
+ }
+ else
{
// Assumes linux 2.6 kbuild
- string makefile_nm = s.tmpdir + "/Makefile";
- ofstream o (makefile_nm.c_str());
o << "CFLAGS += -Werror" << endl;
- if (s.test_mode)
- o << "CFLAGS += -I \"" << s.runtime_path << "/user\"" << endl;
- o << "CFLAGS += -I \"" << s.runtime_path << "\"" << endl;
o << "CFLAGS += -I \"" << s.runtime_path << "/relayfs\"" << endl;
o << "obj-m := " << s.module_name << ".o" << endl;
+ o.close ();
}
- // run module make
- string module_dir = string("/lib/modules/") + s.kernel_release + "/build";
- string make_cmd = string("make")
- + string (" -C \"") + module_dir + string("\"");
- make_cmd += string(" M=\"") + s.tmpdir + string("\" modules");
- if (! s.verbose)
- make_cmd += " -s >/dev/null 2>&1";
-
- if (s.verbose) clog << "Running " << make_cmd << endl;
- int rc = system (make_cmd.c_str());
-
+ // Run make
+ if (s.test_mode)
+ {
+ string make_cmd = string("/usr/bin/make -C \"") + s.tmpdir + "\"";
- if (s.verbose) clog << "Pass 4: compiled into \""
- << s.module_name << ".ko"
- << "\"" << endl;
+ if (! s.verbose)
+ make_cmd += " -s >/dev/null 2>&1";
+
+ if (s.verbose) clog << "Running " << make_cmd << endl;
+ rc = system (make_cmd.c_str());
+
+ if (s.verbose) clog << "Pass 4: compiled into \""
+ << s.module_name
+ << "\"" << endl;
+ }
+ else
+ {
+ string module_dir = string("/lib/modules/")
+ + s.kernel_release + "/build";
+ string make_cmd = string("/usr/bin/make")
+ + string (" -C \"") + module_dir + string("\"");
+ make_cmd += string(" M=\"") + s.tmpdir + string("\" modules");
+
+ if (! s.verbose)
+ make_cmd += " -s >/dev/null 2>&1";
+
+ if (s.verbose) clog << "Running " << make_cmd << endl;
+ rc = system (make_cmd.c_str());
+
+
+ if (s.verbose) clog << "Pass 4: compiled into \""
+ << s.module_name << ".ko"
+ << "\"" << endl;
+ }
return rc;
}
int
run_pass (systemtap_session& s)
{
+ int rc = 0;
+
if (s.test_mode)
- return 1; // XXX: don't know how to do this yet
+ {
+ string run_cmd = s.tmpdir + "/" + s.module_name;
+
+ if (s.verbose) clog << "Running " << run_cmd << endl;
+ rc = system (run_cmd.c_str ());
+ }
else // real run
{
// leave parent process alone
+ string(PKGLIBDIR) + "/stpd "
+ (s.verbose ? "" : "-q ")
+ s.tmpdir + "/" + s.module_name + ".ko";
+
if (s.verbose) clog << "Running " << stpd_cmd << endl;
- int rc = system (stpd_cmd.c_str ());
+ rc = system (stpd_cmd.c_str ());
signal (SIGINT, oldsig);
- return rc;
}
+
+ return rc;
}
void
c_unparser::emit_common_header ()
{
- o->newline() << "#include <linux/string.h>";
// XXX: tapsets.cxx should be able to add additional definitions
o->newline() << "#define NR_CPU 1";
o->newline() << "int rc;";
// XXX: yuck runtime
+ o->newline() << "#if !TEST_MODE";
o->newline() << "TRANSPORT_OPEN;";
+ o->newline() << "#endif";
for (unsigned i=0; i<session->globals.size(); i++)
{
o->newline() << "anyrc |= rc;";
}
// XXX: uninitialize globals
+
+
+ // XXX: yuck runtime
+ o->newline() << "#if !TEST_MODE";
o->newline() << "_stp_transport_close ();";
+ o->newline() << "#endif";
+
// XXX: if anyrc, log badness
o->newline(-1) << "}" << endl;
}
try
{
s.op->line() << "#define TEST_MODE " << (s.test_mode ? 1 : 0) << endl;
+
+ s.op->newline() << "#if TEST_MODE";
+ s.op->newline() << "#include \"runtime.h\"";
+ s.op->newline() << "#else";
s.op->newline() << "#include \"runtime.h\"";
+ s.op->newline() << "#include <linux/string.h>";
+ s.op->newline() << "#endif";
s.up->emit_common_header ();
s.op->newline() << "/* test mode mainline */";
s.op->newline() << "int main () {";
s.op->newline(1) << "int rc = systemtap_module_init ();";
- s.op->newline() << "if (!rc) rc = systemtap_module_exit ();";
+ s.op->newline() << "if (!rc) systemtap_module_exit ();";
s.op->newline() << "return rc;";
s.op->newline(-1) << "}";