X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=813f8ed788deff1c85f8eca5810134e85f8cfb63;hb=7606161ee4a6fd13c2f5ddca413ba3582df66f03;hp=d598a9f5cb2caa8bc6e5f8d238bdaad9c0ddd86a;hpb=23477a725988c3c896c2853c2417054c1310dabc;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index d598a9f..813f8ed 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -21,6 +21,7 @@ #include "gnucxxcompiler.h" #include "gnulinker.h" #include "installedfile.h" +#include "mingwdlltool.h" #include "package.h" #include "pkgconfiggenerator.h" #include "sharedlibrary.h" @@ -34,7 +35,6 @@ using namespace Msp; Builder::Builder(int argc, char **argv): package_manager(*this), - main_pkg(0), native_arch(*this, string()), build_type(0), vfs(*this), @@ -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; @@ -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()) @@ -200,6 +203,8 @@ Builder::Builder(int argc, char **argv): toolchain.add_tool(new Copy(*this)); toolchain.add_tool(new Tar(*this)); toolchain.add_tool(new PkgConfigGenerator(*this)); + if(current_arch->get_system()=="windows") + toolchain.add_tool(new MingwDllTool(*this, *current_arch)); } Builder::~Builder() @@ -256,7 +261,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(); @@ -336,6 +341,16 @@ void Builder::add_primary_target(Target &t) get_target("default")->add_dependency(t); } +void Builder::add_installed_target(Target &t) +{ + Target *inst_tgt = 0; + if(const Tool *tool = t.get_tool()) + inst_tgt = tool->create_install(t); + if(!inst_tgt) + inst_tgt = toolchain.get_tool("CP").create_target(t); + get_target("install")->add_dependency(*inst_tgt); +} + void Builder::usage(const char *reason, const char *argv0, bool brief) { if(reason) @@ -376,11 +391,11 @@ bool Builder::prepare_build() Target *tarballs = new VirtualTarget(*this, "tarballs"); world->add_dependency(*tarballs); - main_pkg->prepare(); + package_manager.get_main_package().prepare(); // 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) @@ -399,7 +414,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) @@ -542,7 +557,7 @@ int Builder::do_clean() Target *tgt = queue.front(); queue.erase(queue.begin()); - if(tgt->is_buildable() && (tgt->get_package()==main_pkg || clean>=2)) + if(tgt->is_buildable() && (tgt->get_package()==&package_manager.get_main_package() || clean>=2)) clean_tgts.insert(tgt); const Target::Dependencies &deps = tgt->get_dependencies(); @@ -563,12 +578,13 @@ int Builder::do_clean() void Builder::package_help() { - const Config &config = main_pkg->get_config(); + SourcePackage &main_pkg = dynamic_cast(package_manager.get_main_package()); + const Config &config = main_pkg.get_config(); 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(", "); @@ -628,10 +644,8 @@ void Builder::Loader::profile(const string &) void Builder::Loader::package(const string &n) { SourcePackage *pkg = new SourcePackage(obj, n, get_source()); - if(!obj.main_pkg) - obj.main_pkg = pkg; - if(obj.conf_all || pkg==obj.main_pkg) + if(obj.conf_all || pkg==&obj.package_manager.get_main_package()) load_sub(*pkg, obj.cmdline_options); else load_sub(*pkg);