📄 click-mkmindriver.cc
字号:
Vector<String> headervec(sourcevec.size(), String()); Vector<String> classvec(sourcevec.size(), String()); // collect header file and C++ element class definitions from emap for (int i = 1; i < emap.size(); i++) { const Traits &elt = emap.traits_at(i); int sourcei = _source_files[elt.source_file]; if (sourcei >= 0) { headervec[sourcei] = elt.header_file; if (elt.name) classvec[sourcei] += " " + elt.cxx + "-" + elt.name; } } // output data time_t now = time(0); const char *date_str = ctime(&now); fprintf(f, "# Generated by 'click-mkmindriver -p %s' on %s", package.c_str(), date_str); for (int i = 0; i < sourcevec.size(); i++) if (headervec[i]) { String classstr(classvec[i].begin() + 1, classvec[i].end()); if (headervec[i][0] != '\"' && headervec[i][0] != '<') fprintf(f, "%s\t\"%s\"\t%s\n", sourcevec[i].c_str(), headervec[i].c_str(), classstr.c_str()); else fprintf(f, "%s\t%s\t%s\n", sourcevec[i].c_str(), headervec[i].c_str(), classstr.c_str()); }}static intprint_makefile(const String &directory, const String &pkg, const StringAccum &sa, ErrorHandler *errh){ String fn = directory + "Makefile." + pkg; errh->message("Creating %s...", fn.c_str()); FILE *f = fopen(fn.c_str(), "w"); if (!f) return errh->error("%s: %s", fn.c_str(), strerror(errno)); fwrite(sa.data(), 1, sa.length(), f); fclose(f); return 0;}static intprint_u_makefile(const String &directory, const String &pkg, bool check, ErrorHandler *errh){ int before = errh->nerrors(); if (check) { String fn = directory + "Makefile"; String text = file_string(fn, errh); if (before != errh->nerrors()) return -1; String expectation = String("\n## Click ") + Driver::requirement(driver) + " driver Makefile ##\n"; if (text.find_left(expectation) < 0) return errh->error("%s does not contain magic string\n(Does this directory have a Makefile for Click's %s driver?)", fn.c_str(), Driver::name(driver)); } StringAccum sa; sa << "INSTALLPROGS = " << pkg << "click\n\include Makefile\n\n"; sa << "elements_" << pkg << ".mk: elements_" << pkg << ".conf $(top_builddir)/click-buildtool\n\ $(top_builddir)/click-buildtool elem2make -x \"$(STD_ELEMENT_OBJS)\" -v ELEMENT_OBJS_" << pkg << " < elements_" << pkg << ".conf > elements_" << pkg << ".mk\n\elements_" << pkg << ".cc: elements_" << pkg << ".conf $(top_builddir)/click-buildtool\n\ $(top_builddir)/click-buildtool elem2export < elements_" << pkg << ".conf > elements_" << pkg << ".cc\n\ @rm -f elements_" << pkg << ".d\n"; sa << "-include elements_" << pkg << ".mk\n"; sa << "OBJS_" << pkg << " = $(ELEMENT_OBJS_" << pkg << ") elements_" << pkg << ".o click.o\n"; sa << pkg << "click: Makefile Makefile." << pkg << " libclick.a $(OBJS_" << pkg << ")\n\ $(CXXLINK) -rdynamic $(OBJS_" << pkg << ") $(LIBS) libclick.a\n"; return print_makefile(directory, pkg, sa, errh);}static intprint_k_makefile(const String &directory, const String &pkg, bool check, ErrorHandler *errh){ int before = errh->nerrors(); if (check) { String fn = directory + "Makefile"; String text = file_string(fn, errh); if (before != errh->nerrors()) return -1; String expectation = String("\n## Click ") + Driver::requirement(driver) + " driver Makefile ##\n"; if (text.find_left(expectation) < 0) return errh->error("%s does not contain magic string\n(Does this directory have a Makefile for Click's %s driver?)", fn.c_str(), Driver::name(driver)); } StringAccum sa; sa << "INSTALLOBJS = " << pkg << "click.o\n\include Makefile\n\n"; sa << "elements_" << pkg << ".mk: elements_" << pkg << ".conf $(top_builddir)/click-buildtool\n\ $(top_builddir)/click-buildtool elem2make -x \"$(STD_ELEMENT_OBJS)\" -v ELEMENT_OBJS_" << pkg << " < elements_" << pkg << ".conf > elements_" << pkg << ".mk\n\elements_" << pkg << ".cc: elements_" << pkg << ".conf $(top_builddir)/click-buildtool\n\ $(top_builddir)/click-buildtool elem2export < elements_" << pkg << ".conf > elements_" << pkg << ".cc\n\ @rm -f elements_" << pkg << ".d\n"; sa << "-include elements_" << pkg << ".mk\n"; sa << "OBJS_" << pkg << " = $(GENERIC_OBJS) $(ELEMENT_OBJS_" << pkg << ") $(LINUXMODULE_OBJS) elements_" << pkg << ".o\n"; sa << pkg << "click.o: Makefile Makefile." << pkg << " $(OBJS_" << pkg << ")\n\ $(LD) -r -o " << pkg << "click.o $(OBJS_" << pkg << ")\n\ $(STRIP) -g " << pkg << "click.o\n"; return print_makefile(directory, pkg, sa, errh);}intmain(int argc, char **argv){ click_static_initialize(); CLICK_DEFAULT_PROVIDES; ErrorHandler *errh = ErrorHandler::default_handler(); LandmarkErrorHandler arg_lerrh(errh, "argument requirements"); // read command line arguments Clp_Parser *clp = Clp_NewParser(argc, argv, sizeof(options) / sizeof(options[0]), options); Clp_SetOptionChar(clp, '+', Clp_ShortNegated); program_name = Clp_ProgramName(clp); Vector<String> router_filenames; String specifier = "x"; const char *package_name = 0; String directory; bool need_file = true; bool check = true; Mindriver md; while (1) { int opt = Clp_Next(clp); switch (opt) { case HELP_OPT: usage(); exit(0); break; case VERSION_OPT: printf("click-mkmindriver (Click) %s\n", CLICK_VERSION); printf("Copyright (c) 2001 Massachusetts Institute of Technology\n\Copyright (c) 2001 International Computer Science Institute\n\This is free software; see the source for copying conditions.\n\There is NO warranty, not even for merchantability or fitness for a\n\particular purpose.\n"); exit(0); break; case CLICKPATH_OPT: set_clickpath(clp->arg); break; case KERNEL_OPT: driver = Driver::LINUXMODULE; break; case USERLEVEL_OPT: driver = Driver::USERLEVEL; break; case PACKAGE_OPT: package_name = clp->arg; break; case DIRECTORY_OPT: directory = clp->arg; if (directory.length() && directory.back() != '/') directory += "/"; break; case ALL_OPT: specifier = (clp->negated ? "x" : "a"); break; case ELEMENT_OPT: { Vector<String> elements; cp_spacevec(clp->arg, elements); for (String *e = elements.begin(); e < elements.end(); e++) md.require(*e, &arg_lerrh); break; } case ALIGN_OPT: md.require("Align", &arg_lerrh); break; case CHECK_OPT: check = !clp->negated; break; case VERBOSE_OPT: verbose = !clp->negated; break; case ROUTER_OPT: case Clp_NotOption: if (clp->negated) need_file = false; else router_filenames.push_back(specifier + String("f") + clp->arg); break; case EXPRESSION_OPT: router_filenames.push_back(specifier + String("e") + clp->arg); break; case Clp_BadOption: short_usage(); exit(1); break; case Clp_Done: goto done; } } done: if (driver < 0) driver = Driver::USERLEVEL; if (!router_filenames.size() && need_file) router_filenames.push_back(specifier + "f-"); if (!package_name) errh->fatal("fatal error: no package name specified\nPlease supply the '-p PKG' option."); ElementMap default_emap; if (!default_emap.parse_default_file(CLICK_SHAREDIR, errh)) default_emap.report_file_not_found(CLICK_SHAREDIR, false, errh); for (int i = 0; i < router_filenames.size(); i++) handle_router(md, router_filenames[i], default_emap, errh); // add types that are always required { LandmarkErrorHandler lerrh(errh, "default requirements"); md.require("AddressInfo", &lerrh); md.require("AlignmentInfo", &lerrh); md.require("DriverManager", &lerrh); md.require("Error", &lerrh); md.require("PortInfo", &lerrh); md.require("ScheduleInfo", &lerrh); if (driver == Driver::USERLEVEL) md.require("ControlSocket", &lerrh); } // add initial provisions default_emap.set_driver(driver); md.provide(Driver::requirement(driver), errh); // all default provisions are stored in elementmap index 0 md.add_traits(default_emap.traits_at(0), default_emap, errh); // now, loop over requirements until closure while (1) { HashMap<String, int> old_reqs(-1); old_reqs.swap(md._requirements); for (HashMap<String, int>::iterator iter = old_reqs.begin(); iter; iter++) md.resolve_requirement(iter.key(), default_emap, errh); if (!md._requirements.size()) break; } // print files if (errh->nerrors() > 0) exit(1); // first, print Makefile.PKG if (driver == Driver::USERLEVEL) print_u_makefile(directory, package_name, check, errh); else if (driver == Driver::LINUXMODULE) print_k_makefile(directory, package_name, check, errh); else errh->fatal("%s driver support unimplemented", Driver::name(driver)); // Then, print elements_PKG.conf if (errh->nerrors() == 0) { String fn = directory + String("elements_") + package_name + ".conf"; errh->message("Creating %s...", fn.c_str()); FILE *f = fopen(fn.c_str(), "w"); if (!f) errh->fatal("%s: %s", fn.c_str(), strerror(errno)); md.print_elements_conf(f, package_name, default_emap); fclose(f); } // Final message if (errh->nerrors() == 0) { if (driver == Driver::USERLEVEL) errh->message("Build '%sclick' with 'make -f Makefile.%s'.", package_name, package_name); else errh->message("Build '%sclick.o' with 'make -f Makefile.%s'.", package_name, package_name); return 0; } else exit(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -