⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 click-mkmindriver.cc

📁 COPE the first practical network coding scheme which is developped on click
💻 CC
📖 第 1 页 / 共 2 页
字号:
    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 + -