X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=209321224db7c3966195d848cbf712d01211aa50;hb=b0b8e35336104f6e17fb128d794ab1655eb6fee0;hp=c0574e924d51512ba5af04ff11e14517e78bebf0;hpb=30b1243ff16b908ae18b4ab9d70f772c9196b949;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index c0574e9..2093212 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -50,7 +49,8 @@ Builder::Builder(int argc, char **argv): conf_all(false), conf_only(false), build_all(false), - create_makefile(false) + create_makefile(false), + tempdir("temp") { string analyze_mode; string work_dir; @@ -58,6 +58,7 @@ Builder::Builder(int argc, char **argv): unsigned max_depth = 5; StringList cmdline_warn; string prfx; + string temp_str; string arch; bool no_externals = false; unsigned verbose = 1; @@ -83,11 +84,12 @@ Builder::Builder(int argc, char **argv): getopt.add_option('C', "chdir", work_dir, GetOpt::REQUIRED_ARG).set_help("Change to DIR before doing anything else.", "DIR"); getopt.add_option('P', "progress", show_progress, GetOpt::NO_ARG).set_help("Display progress while building."); getopt.add_option('W', "what-if", what_if, GetOpt::REQUIRED_ARG).set_help("Pretend that FILE has changed.", "FILE"); - getopt.add_option( "arch", arch, GetOpt::REQUIRED_ARG).set_help("Architecture to build for.", "ARCH"); + getopt.add_option( "arch", arch, GetOpt::REQUIRED_ARG).set_help("Build for architecture ARCH.", "ARCH"); getopt.add_option( "conf-only", conf_only, GetOpt::NO_ARG).set_help("Stop after configuring packages."); getopt.add_option( "full-paths", full_paths, GetOpt::NO_ARG).set_help("Output full paths in analysis."); - getopt.add_option( "max-depth", max_depth, GetOpt::REQUIRED_ARG).set_help("Maximum depth to show in analysis.", "NUM"); - getopt.add_option( "prefix", prfx, GetOpt::REQUIRED_ARG).set_help("Directory to install things to.", "DIR"); + getopt.add_option( "max-depth", max_depth, GetOpt::REQUIRED_ARG).set_help("Show up to NUM levels in analysis..", "NUM"); + getopt.add_option( "prefix", prfx, GetOpt::REQUIRED_ARG).set_help("Install things to DIR.", "DIR"); + getopt.add_option( "tempdir", temp_str, GetOpt::REQUIRED_ARG).set_help("Store temporary files in DIR.", "DIR"); getopt.add_option( "warnings", cmdline_warn, GetOpt::REQUIRED_ARG).set_help("Compiler warnings to use.", "LIST"); usagemsg = getopt.generate_usage(argv[0])+" [ ...]"; helpmsg = getopt.generate_help(); @@ -185,7 +187,10 @@ Builder::Builder(int argc, char **argv): prefix = (FS::get_home_dir()/"local"/current_arch->get_name()).str(); } else - prefix = FS::getcwd()/prfx; + prefix = cwd/prfx; + + if(!temp_str.empty()) + tempdir = temp_str; if(!build_type_name.empty()) { @@ -224,25 +229,6 @@ Builder::~Builder() int Builder::main() { - if(prefix.str()!="/usr") - { - FS::Path pcdir = prefix/"lib"/"pkgconfig"; - if(const char *pcp = getenv("PKG_CONFIG_PATH")) - { - vector path = split(pcp, ':'); - bool found = false; - for(vector::const_iterator i=path.begin(); (!found && i!=path.end()); ++i) - found = (*i==pcdir.str()); - if(!found) - { - path.push_back(pcdir.str()); - setenv("PKG_CONFIG_PATH", join(path.begin(), path.end(), ":").c_str(), true); - } - } - else - setenv("PKG_CONFIG_PATH", pcdir.str().c_str(), true); - } - if(load_build_file(cwd/build_file)) { if(help) @@ -257,8 +243,6 @@ int Builder::main() } } - main_pkg->configure(cmdline_options, conf_all?2:1); - if(help) { usage(0, "builder", false); @@ -267,15 +251,19 @@ int Builder::main() return 0; } + if(!prepare_build()) + return 1; + if(conf_only) return 0; - if(create_targets()) - return 1; - logger.log("environment", format("Building on %s, for %s%s", native_arch.get_name(), current_arch->get_name(), (current_arch->is_native() ? " (native)" : ""))); logger.log("environment", format("Prefix is %s", prefix)); + if(tempdir.is_absolute()) + logger.log("environment", format("Temporary directory is %s", tempdir)); + else + logger.log("environment", format("Using per-package temporary directory %s", tempdir)); if(build_type) logger.log("environment", format("Build type is %s", build_type->get_name())); @@ -283,7 +271,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_configured()) + if(!i->second || !i->second->is_prepared()) continue; string line = i->second->get_name(); @@ -387,7 +375,7 @@ int Builder::load_build_file(const FS::Path &fn) return 0; } -int Builder::create_targets() +bool Builder::prepare_build() { Target *world = new VirtualTarget(*this, "world"); @@ -400,10 +388,7 @@ int Builder::create_targets() Target *tarballs = new VirtualTarget(*this, "tarballs"); world->add_depend(*tarballs); - const PackageManager::PackageMap &packages = package_manager.get_packages(); - for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) - if(i->second && i->second->is_configured()) - i->second->create_targets(); + main_pkg->prepare(); // Make the cmdline target depend on all targets mentioned on the command line Target *cmdline = new VirtualTarget(*this, "cmdline"); @@ -417,7 +402,7 @@ int Builder::create_targets() if(!tgt) { IO::print("I don't know anything about %s\n", *i); - return -1; + return false; } cmdline->add_depend(*tgt); @@ -432,7 +417,7 @@ int Builder::create_targets() if(!tgt) { IO::print(IO::cerr, "Unknown what-if target %s\n", *i); - return -1; + return false; } tgt->touch(); } @@ -446,11 +431,12 @@ int Builder::create_targets() if(!dry_run) { + const PackageManager::PackageMap &packages = package_manager.get_packages(); for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) i->second->save_caches(); } - return 0; + return true; } int Builder::do_build() @@ -640,7 +626,11 @@ void Builder::Loader::package(const string &n) if(!obj.main_pkg) obj.main_pkg = pkg; - load_sub(*pkg); + if(obj.conf_all || pkg==obj.main_pkg) + load_sub(*pkg, obj.cmdline_options); + else + load_sub(*pkg); + if(obj.build_type) pkg->set_build_type(*obj.build_type); }