]> git.tdb.fi Git - builder.git/blobdiff - source/builder.cpp
Move main package tracking to PackageManager
[builder.git] / source / builder.cpp
index 665983100894acad49db12d8eb478055713c9ad8..813f8ed788deff1c85f8eca5810134e85f8cfb63 100644 (file)
@@ -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())
@@ -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<FS::Path> 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<FS::Path>::const_iterator i=start_files.begin(); i!=start_files.end(); ++i)
+               if(FS::exists(*i))
+                       load_build_file(*i);
 
        if(prfx.empty())
        {
@@ -196,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()
@@ -207,7 +216,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 +226,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 +261,7 @@ int Builder::main()
        list<string> 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();
@@ -329,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)
@@ -345,11 +367,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 +376,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()
@@ -374,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<string>::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 +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)
@@ -540,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();
@@ -561,12 +578,13 @@ int Builder::do_clean()
 
 void Builder::package_help()
 {
-       const Config &config = main_pkg->get_config();
+       SourcePackage &main_pkg = dynamic_cast<SourcePackage &>(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(", ");
@@ -626,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);