X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=3ac4b282ad9d19615236714b01cfc75345d55c8c;hb=fcb86bba9e8ea7e3c93f7f1748c0291b307c46ed;hp=e6619b1382ff91b02846117c264af9645b382472;hpb=1c43971ed99fd2f72ae171d6cdafabab74e37f4e;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index e6619b1..3ac4b28 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -56,7 +56,6 @@ Builder::Builder(int argc, char **argv): string work_dir; bool full_paths = false; unsigned max_depth = 4; - StringList cmdline_warn; string prfx; string temp_str; string arch; @@ -68,7 +67,7 @@ Builder::Builder(int argc, char **argv): GetOpt getopt; getopt.add_option('a', "analyze", analyze_mode, GetOpt::REQUIRED_ARG).set_help("Perform dependency analysis.", "MODE"); - getopt.add_option('b', "build", build, GetOpt::NO_ARG).set_help("Perform build even if doing analysis."); + getopt.add_option('b', "build", build, GetOpt::NO_ARG).set_help("Perform build even if also doing something else."); getopt.add_option('c', "clean", clean, GetOpt::NO_ARG).set_help("Clean buildable targets."); getopt.add_option('f', "file", build_file, GetOpt::REQUIRED_ARG).set_help("Read build instructions from FILE.", "FILE"); getopt.add_option('h', "help", help, GetOpt::NO_ARG).set_help("Print this message."); @@ -145,7 +144,7 @@ Builder::Builder(int argc, char **argv): { string::size_type equal = i->find('='); if(equal!=string::npos) - cmdline_options.insert(StringMap::value_type(i->substr(0, equal), i->substr(equal+1))); + cmdline_options.insert(Config::InputOptions::value_type(i->substr(0, equal), i->substr(equal+1))); else cmdline_targets.push_back(*i); } @@ -158,6 +157,10 @@ Builder::Builder(int argc, char **argv): cwd = FS::getcwd(); + package_manager.append_package_path(cwd); + package_manager.append_package_path(cwd/".."); + package_manager.append_binary_package_path(FS::get_sys_data_dir(argv[0], "builder")); + package_manager.set_no_externals(no_externals); if(arch.empty()) @@ -165,8 +168,12 @@ Builder::Builder(int argc, char **argv): else current_arch = new Architecture(*this, arch); - load_build_file((FS::get_sys_data_dir(argv[0], "builder")/"builderrc").str()); - load_build_file((FS::get_user_data_dir("builder")/"rc").str()); + list start_files; + start_files.push_back(FS::get_sys_data_dir(argv[0], "builder")/"builderrc"); + start_files.push_back(FS::get_user_data_dir("builder")/"rc"); + for(list::const_iterator i=start_files.begin(); i!=start_files.end(); ++i) + if(FS::exists(*i)) + load_build_file(*i); if(prfx.empty()) { @@ -207,7 +214,8 @@ Builder::~Builder() int Builder::main() { - if(load_build_file(cwd/build_file)) + FS::Path main_file = cwd/build_file; + if(!FS::exists(main_file)) { if(help) { @@ -216,11 +224,13 @@ int Builder::main() } else { - IO::print(IO::cerr, "No build info here.\n"); + IO::print(IO::cerr, "The file %s does not exist.\n", main_file); return 1; } } + load_build_file(main_file); + if(help) { usage(0, "builder", false); @@ -249,7 +259,7 @@ int Builder::main() list package_details; for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) { - if(!i->second || !i->second->is_prepared()) + if(!i->second->is_prepared()) continue; string line = i->second->get_name(); @@ -297,7 +307,7 @@ int Builder::main() if(clean) exit_code = do_clean(); - else if(build) + if(build) exit_code = do_build(); return exit_code; @@ -345,11 +355,8 @@ void Builder::usage(const char *reason, const char *argv0, bool brief) } } -int Builder::load_build_file(const FS::Path &fn) +void Builder::load_build_file(const FS::Path &fn) { - if(!FS::exists(fn)) - return -1; - IO::BufferedFile in(fn.str()); logger.log("files", format("Reading %s", fn)); @@ -357,8 +364,6 @@ int Builder::load_build_file(const FS::Path &fn) DataFile::Parser parser(in, fn.str()); Loader loader(*this); loader.load(parser); - - return 0; } bool Builder::prepare_build() @@ -378,7 +383,7 @@ bool Builder::prepare_build() // Make the cmdline target depend on all targets mentioned on the command line Target *cmdline = new VirtualTarget(*this, "cmdline"); - for(list::iterator i=cmdline_targets.begin(); i!=cmdline_targets.end(); ++i) + for(NameList::iterator i=cmdline_targets.begin(); i!=cmdline_targets.end(); ++i) { Target *tgt = get_target(*i); if(!tgt) @@ -397,7 +402,7 @@ bool Builder::prepare_build() cmdline->prepare(); // Apply what-ifs - for(StringList::iterator i=what_if.begin(); i!=what_if.end(); ++i) + for(NameList::iterator i=what_if.begin(); i!=what_if.end(); ++i) { FileTarget *tgt = vfs.get_target(cwd/ *i); if(!tgt) @@ -565,8 +570,8 @@ void Builder::package_help() const Config::OptionMap &options = config.get_options(); IO::print("Required packages:\n "); - const PackageList &requires = main_pkg->get_required_packages(); - for(PackageList::const_iterator i=requires.begin(); i!=requires.end(); ++i) + const Package::Requirements &requires = main_pkg->get_required_packages(); + for(Package::Requirements::const_iterator i=requires.begin(); i!=requires.end(); ++i) { if(i!=requires.begin()) IO::print(", ");