- GetOpt getopt;
- getopt.add_option(GetOpt::Option('a', "analyze", GetOpt::REQUIRED));
- getopt.add_option(GetOpt::Option('b', "build", GetOpt::NONE));
- getopt.add_option(GetOpt::Option('c', "clean", GetOpt::NONE));
- getopt.add_option(GetOpt::Option('f', "file", GetOpt::REQUIRED, "Build"));
- getopt.add_option(GetOpt::Option('h', "help", GetOpt::NONE));
- getopt.add_option(GetOpt::Option('j', "jobs", GetOpt::REQUIRED, "1"));
- getopt.add_option(GetOpt::Option('n', "dry-run", GetOpt::NONE));
- getopt.add_option(GetOpt::Option('v', "verbose", GetOpt::NONE));
- getopt.add_option(GetOpt::Option('A', "conf-all", GetOpt::NONE));
- getopt.add_option(GetOpt::Option('B', "build-all", GetOpt::NONE));
- getopt.add_option(GetOpt::Option('C', "chdir", GetOpt::REQUIRED));
- getopt.add_option(GetOpt::Option('W', "what-if", GetOpt::REQUIRED));
- getopt.add_option(GetOpt::Option("chrome", GetOpt::NONE));
- getopt.add_option(GetOpt::Option("full-paths", GetOpt::NONE));
- getopt.add_option(GetOpt::Option("max-depth", GetOpt::REQUIRED));
- int index=getopt(argc, argv);
-
- verbose+=getopt['v'].count();
-
- if(getopt['a'])
- {
- analyzer=new Analyzer(*this);
-
- string mode=getopt['a'].arg();
- if(mode=="deps")
- analyzer->set_mode(Analyzer::DEPS);
- else if(mode=="alldeps")
- analyzer->set_mode(Analyzer::ALLDEPS);
- else if(mode=="rebuild")
- analyzer->set_mode(Analyzer::REBUILD);
- else if(mode=="rdeps")
- analyzer->set_mode(Analyzer::RDEPS);
- else
- throw UsageError("Invalid analysis mode");
-
- if(getopt["max-depth"])
- analyzer->set_max_depth(strtol(getopt["max-depth"].arg()));
- analyzer->set_full_paths(getopt["full-paths"]);
-
- if(!getopt['b'])
- do_build=false;
- }
-
- dry_run=getopt['n'];
- jobs=max(strtol(getopt['j'].arg()), 1L);
- chrome=getopt["chrome"];
- conf_all=getopt['A'];
- build_file=getopt['f'].arg();
- build_all=getopt['B'];
- help=getopt['h'];
-
- if(getopt['C'])
- chdir(getopt['C'].arg().c_str());
-
- for(int i=index; i<argc; ++i)
- {
- string v(argv[i]);
- unsigned equal=v.find('=');
- if(equal!=string::npos)
- cmdline_options.insert(RawOptionMap::value_type(v.substr(0, equal), v.substr(equal+1)));
- else
- cmdline_targets.push_back(argv[i]);
- }
-
- if(cmdline_targets.empty())
- cmdline_targets.push_back("default");
-
- if(getopt['W'])
- what_if.push_back(getopt['W'].arg());
-
- cwd=Path::getcwd();
-}
-
-/**
-Gets a package with the specified name, possibly creating it.
-
-@param n Package name
-
-@return Pointer to the package, or 0 if the package could not be located
-*/
-Package *Builder::get_package(const string &n)
-{
- PackageMap::iterator i=packages.find(n);
- if(i!=packages.end())
- return i->second;
-
- // Try to get source directory with pkgconfig
- list<string> argv;
- argv.push_back("pkg-config");
- argv.push_back("--variable=source");
- argv.push_back(n);
- string srcdir=strip(run_command(argv));
-
- PathList dirs;
- if(!srcdir.empty())
- dirs.push_back(srcdir);
-
- // Make some other guesses about the source directory
- string dirname=n;
- if(!dirname.compare(0, 3, "msp"))
- dirname.erase(0, 3);
- dirs.push_back(cwd/dirname);
- dirs.push_back(cwd/".."/dirname);
-
- // Go through the candidate directories and look for a Build file
- for(PathList::iterator j=dirs.begin(); j!=dirs.end(); ++j)
- if(!load_build_file(*j/"Build"))
- {
- i=packages.find(n);
- if(i!=packages.end())
- return i->second;
- break;
- }
-
- // Package source not found - create a binary package
- Package *pkg=Package::create(*this, n);
- packages.insert(PackageMap::value_type(n, pkg));
- if(pkg)
- new_pkgs.push_back(pkg);
-
- return pkg;
-}
-
-/**
-Returns the target with the given name, or 0 if no such target exists.
-*/
-Target *Builder::get_target(const string &n)
-{
- TargetMap::iterator i=targets.find(n);
- if(i!=targets.end())
- return i->second;
- return 0;