X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=393cfc5d62598cf6649c9366fd69ddd904c67371;hb=1d687970cc35e54c3335f4aa2fdef23424fe0a06;hp=ed749f818e464bb7df7ba8d00d44d11e6f16e313;hpb=2ea79c8f3ca8c12907a6c121ec564f5a4d643f52;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index ed749f8..393cfc5 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -17,14 +17,12 @@ #include "binarypackage.h" #include "builder.h" #include "copy.h" -#include "externaltask.h" #include "gnuarchiver.h" #include "gnuccompiler.h" #include "gnucxxcompiler.h" #include "gnulinker.h" #include "installedfile.h" #include "package.h" -#include "pkgconfigfile.h" #include "pkgconfiggenerator.h" #include "sharedlibrary.h" #include "sourcepackage.h" @@ -36,6 +34,7 @@ using namespace std; using namespace Msp; Builder::Builder(int argc, char **argv): + package_manager(*this), main_pkg(0), native_arch(*this, string()), vfs(*this), @@ -60,6 +59,7 @@ Builder::Builder(int argc, char **argv): StringList cmdline_warn; string prfx; string arch; + bool no_externals = false; GetOpt getopt; getopt.add_option('a', "analyze", analyze_mode, GetOpt::REQUIRED_ARG).set_help("Perform analysis. MODE can be deps, alldeps or rebuild.", "MODE"); @@ -125,13 +125,7 @@ Builder::Builder(int argc, char **argv): cwd = FS::getcwd(); - toolchain.add_tool(new GnuCCompiler(*this)); - toolchain.add_tool(new GnuCxxCompiler(*this)); - toolchain.add_tool(new GnuLinker(*this)); - toolchain.add_tool(new GnuArchiver(*this)); - toolchain.add_tool(new Copy(*this)); - toolchain.add_tool(new Tar(*this)); - toolchain.add_tool(new PkgConfigGenerator(*this)); + package_manager.set_no_externals(no_externals); load_build_file((FS::get_sys_data_dir(argv[0], "builder")/"builderrc").str()); load_build_file((FS::get_user_data_dir("builder")/"rc").str()); @@ -151,6 +145,14 @@ Builder::Builder(int argc, char **argv): } } + toolchain.add_tool(new GnuCCompiler(*this)); + toolchain.add_tool(new GnuCxxCompiler(*this)); + toolchain.add_tool(new GnuLinker(*this)); + toolchain.add_tool(new GnuArchiver(*this)); + toolchain.add_tool(new Copy(*this)); + toolchain.add_tool(new Tar(*this)); + toolchain.add_tool(new PkgConfigGenerator(*this)); + if(prfx.empty()) { if(current_arch->is_native()) @@ -171,15 +173,10 @@ Builder::Builder(int argc, char **argv): vector warns = split(*i, ','); warnings.insert(warnings.end(), warns.begin(), warns.end()); } - - pkg_path.push_back(cwd/"."); - pkg_path.push_back(cwd/".."); } Builder::~Builder() { - for(PackageMap::iterator i=packages.begin(); i!=packages.end(); ++i) - delete i->second; for(TargetMap::iterator i=targets.begin(); i!=targets.end(); ++i) delete i->second; delete analyzer; @@ -245,8 +242,9 @@ int Builder::main() if(verbose>=1) { + const PackageManager::PackageMap &packages = package_manager.get_packages(); unsigned n_packages = 0; - for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) + for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) if(i->second && i->second->is_configured()) ++n_packages; IO::print("%d active packages, %d targets\n", n_packages, targets.size()); @@ -254,7 +252,8 @@ int Builder::main() if(verbose>=2) { - for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) + const PackageManager::PackageMap &packages = package_manager.get_packages(); + for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) { if(!i->second->is_configured()) continue; @@ -303,72 +302,6 @@ int Builder::main() return exit_code; } -string Builder::run_pkgconfig(const string &pkg, const string &what) -{ - vector argv; - argv.push_back("pkg-config"); - if(what=="cflags" || what=="libs") - argv.push_back("--"+what); - else if(what=="flags") - { - argv.push_back("--cflags"); - argv.push_back("--libs"); - } - else - argv.push_back("--variable="+what); - argv.push_back(pkg); - - if(verbose>=4) - IO::print("Running %s\n", join(argv.begin(), argv.end())); - - ExternalTask task(argv, FS::Path()); - task.set_stdout(ExternalTask::CAPTURE); - task.set_stderr(ExternalTask::IGNORE); - task.start(); - Task::Status status; - while((status=task.check())==Task::RUNNING) - Time::sleep(10*Time::msec); - if(status==Task::ERROR) - throw runtime_error(format("pkg-config for package %s failed", pkg)); - - return task.get_output(); -} - -Package *Builder::get_package(const string &name) -{ - PackageMap::iterator i = packages.find(format("%s/%s", name, current_arch->get_system())); - if(i==packages.end()) - i = packages.find(name); - if(i!=packages.end()) - return i->second; - - if(!no_externals) - { - FS::Path path = get_package_location(name); - if(!path.empty() && !load_build_file(path/"Build")) - { - i = packages.find(name); - if(i!=packages.end()) - return i->second; - } - } - - Package *pkg = 0; - try - { - // Package source not found - create a binary package - pkg = BinaryPackage::from_pkgconfig(*this, name); - } - catch(...) - { - problem(name, "not found"); - } - - packages.insert(PackageMap::value_type(name, pkg)); - - return pkg; -} - Target *Builder::get_target(const string &n) const { TargetMap::const_iterator i = targets.find(n); @@ -418,52 +351,6 @@ void Builder::usage(const char *reason, const char *argv0, bool brief) } } -FS::Path Builder::get_package_location(const string &name) -{ - if(verbose>=3) - IO::print("Looking for package %s\n", name); - - try - { - // Try to get source directory with pkgconfig - string srcdir = strip(run_pkgconfig(name, "source")); - if(!srcdir.empty()) - return srcdir; - } - catch(...) - { } - - if(pkg_dirs.empty()) - { - for(list::const_iterator i=pkg_path.begin(); i!=pkg_path.end(); ++i) - { - list files = list_files(*i); - for(list::const_iterator j=files.begin(); j!=files.end(); ++j) - { - FS::Path full = *i / *j; - if(FS::exists(full/"Build")) - pkg_dirs.push_back(full); - } - } - if(verbose>=3) - IO::print("%d packages found in path\n", pkg_dirs.size()); - } - - bool msp = !name.compare(0, 3, "msp"); - for(list::const_iterator i=pkg_dirs.begin(); i!=pkg_dirs.end(); ++i) - { - string base = basename(*i); - unsigned dash = base.rfind('-'); - - if(!base.compare(0, dash, name)) - return *i; - else if(msp && !base.compare(0, dash-3, name, 3, string::npos)) - return *i; - } - - return FS::Path(); -} - int Builder::load_build_file(const FS::Path &fn) { if(!FS::exists(fn)) @@ -494,38 +381,10 @@ int Builder::create_targets() Target *tarballs = new VirtualTarget(*this, "tarballs"); world->add_depend(tarballs); - for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) - { - if(!i->second || !i->second->is_configured()) - continue; - - SourcePackage *spkg = dynamic_cast(i->second); - if(!spkg) - continue; - - const ComponentList &components = spkg->get_components(); - for(ComponentList::const_iterator j=components.begin(); j!=components.end(); ++j) - j->create_targets(); - - if(spkg->get_install_flags()&(SourcePackage::LIB|SourcePackage::INCLUDE)) - { - PkgConfigFile *pc = new PkgConfigFile(*this, *spkg); - install->add_depend(toolchain.get_tool("CP").create_target(*pc)); - } - } - - // Apply what-ifs - // XXX This does not currently work with targets found during dependency discovery - for(StringList::iterator i=what_if.begin(); i!=what_if.end(); ++i) - { - FileTarget *tgt = vfs.get_target(cwd/ *i); - if(!tgt) - { - IO::print(IO::cerr, "Unknown what-if target %s\n", *i); - return -1; - } - tgt->touch(); - } + 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(); // Make the cmdline target depend on all targets mentioned on the command line Target *cmdline = new VirtualTarget(*this, "cmdline"); @@ -547,7 +406,26 @@ int Builder::create_targets() cmdline->prepare(); - for(PackageMap::iterator i=packages.begin(); i!=packages.end(); ++i) + // Apply what-ifs + for(StringList::iterator i=what_if.begin(); i!=what_if.end(); ++i) + { + FileTarget *tgt = vfs.get_target(cwd/ *i); + if(!tgt) + { + IO::print(IO::cerr, "Unknown what-if target %s\n", *i); + return -1; + } + tgt->touch(); + } + + if(build_all) + { + for(TargetMap::iterator i=targets.begin(); i!=targets.end(); ++i) + if(i->second->is_buildable() && !i->second->needs_rebuild()) + i->second->force_rebuild(); + } + + for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) if(SourcePackage *spkg = dynamic_cast(i->second)) spkg->get_deps_cache().save(); @@ -714,7 +592,6 @@ void Builder::Loader::binpkg(const string &n) { BinaryPackage *pkg = new BinaryPackage(bld, n); load_sub(*pkg); - bld.packages.insert(PackageMap::value_type(n, pkg)); } void Builder::Loader::cross_prefix(const string &a, const string &p) @@ -737,7 +614,6 @@ void Builder::Loader::package(const string &n) bld.main_pkg = pkg; load_sub(*pkg); - bld.packages.insert(PackageMap::value_type(n, pkg)); }