-Builder::Builder(int argc, char **argv):
- main_pkg(0),
- analyzer(0),
- build(false),
- clean(0),
- dry_run(false),
- help(false),
- verbose(1),
- chrome(false),
- build_file("Build"),
- jobs(1),
- conf_all(false),
- conf_only(false),
- build_all(false),
- create_makefile(false)
-{
- string analyze_mode;
- string work_dir;
- bool full_paths=false;
- unsigned max_depth=5;
-
- GetOpt getopt;
- getopt.add_option('a', "analyze", analyze_mode, GetOpt::REQUIRED_ARG);
- getopt.add_option('b', "build", build, GetOpt::NO_ARG);
- getopt.add_option('c', "clean", clean, GetOpt::NO_ARG);
- getopt.add_option('f', "file", build_file, GetOpt::REQUIRED_ARG);
- getopt.add_option('h', "help", help, GetOpt::NO_ARG);
- getopt.add_option('j', "jobs", jobs, GetOpt::REQUIRED_ARG);
- getopt.add_option('n', "dry-run", dry_run, GetOpt::NO_ARG);
- getopt.add_option('v', "verbose", verbose, GetOpt::NO_ARG);
- getopt.add_option('A', "conf-all", conf_all, GetOpt::NO_ARG);
- getopt.add_option('B', "build-all", build_all, GetOpt::NO_ARG);
- getopt.add_option('C', "chdir", work_dir, GetOpt::REQUIRED_ARG);
- getopt.add_option('W', "what-if", what_if, GetOpt::REQUIRED_ARG);
- getopt.add_option( "chrome", chrome, GetOpt::NO_ARG);
- getopt.add_option( "conf-only", conf_only, GetOpt::NO_ARG);
- getopt.add_option( "full-paths", full_paths, GetOpt::NO_ARG);
- //getopt.add_option( "makefile", create_makefile, GetOpt::NO_ARG);
- getopt.add_option( "max-depth", max_depth, GetOpt::REQUIRED_ARG);
- getopt(argc, argv);
-
- if(!analyze_mode.empty())
- {
- analyzer=new Analyzer(*this);
-
- if(analyze_mode=="deps")
- analyzer->set_mode(Analyzer::DEPS);
- else if(analyze_mode=="alldeps")
- analyzer->set_mode(Analyzer::ALLDEPS);
- else if(analyze_mode=="rebuild")
- analyzer->set_mode(Analyzer::REBUILD);
- else if(analyze_mode=="rdeps")
- analyzer->set_mode(Analyzer::RDEPS);
- else
- throw UsageError("Invalid analyze mode");
-
- analyzer->set_max_depth(max_depth);
- analyzer->set_full_paths(full_paths);
- }
- else if(!clean && !create_makefile)
- build=true;
-
- const list<string> &args=getopt.get_args();
- for(list<string>::const_iterator i=args.begin(); i!=args.end(); ++i)
- {
- unsigned equal=i->find('=');
- if(equal!=string::npos)
- cmdline_options.insert(StringMap::value_type(i->substr(0, equal), i->substr(equal+1)));
- else
- cmdline_targets.push_back(*i);
- }
-
- if(cmdline_targets.empty())
- cmdline_targets.push_back("default");
-
- if(!work_dir.empty())
- chdir(work_dir.c_str());
-
- cwd=Path::getcwd();
-
- archs.insert(StringMap::value_type("native", ""));
-
- StringMap &native_tools=tools.insert(ToolMap::value_type("native", StringMap())).first->second;
- native_tools.insert(StringMap::value_type("CC", "gcc"));
- native_tools.insert(StringMap::value_type("CXX", "g++"));
- native_tools.insert(StringMap::value_type("LD", "gcc"));
- native_tools.insert(StringMap::value_type("LDXX", "g++"));
- native_tools.insert(StringMap::value_type("AR", "ar"));
-
- const char *home=getenv("HOME");
- if(home)
- load_build_file((Path::Path(home)/".builderrc").str());
-}
-
-/**
-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=BinaryPackage::from_pkgconfig(*this, n);
-
- packages.insert(PackageMap::value_type(n, pkg));
-
- if(!pkg)
- problem(n, "not found");
-
- return pkg;
-}
-
-/**
-Returns the target with the given name, or 0 if no such target exists.
-*/
-Target *Builder::get_target(const string &n) const