]> git.tdb.fi Git - builder.git/blobdiff - source/builder.cpp
It's no longer necessary to expose the dry_run flag
[builder.git] / source / builder.cpp
index df7edabbd8e0bae1f28782f3f0bc3a4ffe19e8a2..665983100894acad49db12d8eb478055713c9ad8 100644 (file)
@@ -55,7 +55,7 @@ Builder::Builder(int argc, char **argv):
        string analyze_mode;
        string work_dir;
        bool full_paths = false;
-       unsigned max_depth = 5;
+       unsigned max_depth = 4;
        StringList cmdline_warn;
        string prfx;
        string temp_str;
@@ -67,14 +67,14 @@ Builder::Builder(int argc, char **argv):
        string build_type_name;
 
        GetOpt getopt;
-       getopt.add_option('a', "analyze",    analyze_mode,  GetOpt::REQUIRED_ARG).set_help("Perform analysis.  MODE can be deps, alldeps or rebuild.", "MODE");
-       getopt.add_option('b', "build",      build,         GetOpt::NO_ARG).set_help("Perform build even if doing analysis.");
+       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 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 info from FILE instead of Build.", "FILE");
+       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.");
-       getopt.add_option('j', "jobs",       jobs,          GetOpt::REQUIRED_ARG).set_help("Run NUM commands at once, whenever possible.", "NUM");
-       getopt.add_option('l', "log",        log_channels,  GetOpt::REQUIRED_ARG).set_help("Set log channels to be displayed.", "LIST");
-       getopt.add_option('n', "dry-run",    dry_run,       GetOpt::NO_ARG).set_help("Don't actually do anything, only show what would be done.");
+       getopt.add_option('j', "jobs",       jobs,          GetOpt::REQUIRED_ARG).set_help("Run up to NUM tasks in parallel.", "NUM");
+       getopt.add_option('l', "log",        log_channels,  GetOpt::REQUIRED_ARG).set_help("Enable listed log channels.", "LIST");
+       getopt.add_option('n', "dry-run",    dry_run,       GetOpt::NO_ARG).set_help("Show what would be done without actually doing it.");
        getopt.add_option('s', "silent",     silent,        GetOpt::NO_ARG).set_help("Don't print any messages other than errors.");
        getopt.add_option('t', "build-type", build_type_name, GetOpt::REQUIRED_ARG).set_help("Set build type.", "TYPE");
        getopt.add_option('v', "verbose",    verbose,       GetOpt::NO_ARG).set_help("Print more information about what's going on.");
@@ -87,7 +87,7 @@ Builder::Builder(int argc, char **argv):
        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("Show up to NUM levels in analysis..", "NUM");
+       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");
        usagemsg = getopt.generate_usage(argv[0])+" [<target> ...]";
@@ -108,20 +108,10 @@ Builder::Builder(int argc, char **argv):
                logger.enable_channel("commands");
        }
        if(verbose>=3)
-       {
-               logger.enable_channel("packagemgr");
-               logger.enable_channel("configure");
-       }
-       if(verbose>=4)
        {
                logger.enable_channel("files");
                logger.enable_channel("auxcommands");
        }
-       if(verbose>=5)
-       {
-               logger.enable_channel("tools");
-               logger.enable_channel("vfs");
-       }
        for(list<string>::const_iterator i=log_channels.begin(); i!=log_channels.end(); ++i)
        {
                vector<string> parts = split(*i, ',');
@@ -307,7 +297,7 @@ int Builder::main()
 
        if(clean)
                exit_code = do_clean();
-       else if(build)
+       if(build)
                exit_code = do_build();
 
        return exit_code;
@@ -457,10 +447,11 @@ int Builder::do_build()
 
        bool fail = false;
        bool finish = false;
+       bool starved = false;
 
        while(!finish)
        {
-               if(tasks.size()<jobs && !fail)
+               if(tasks.size()<jobs && !fail && !starved)
                {
                        Target *tgt = cmdline->get_buildable_target();
                        if(tgt)
@@ -488,13 +479,20 @@ int Builder::do_build()
                        }
                        else if(tasks.empty())
                                finish = true;
+                       else
+                               starved = true;
                }
                else
                        Time::sleep(10*Time::msec);
 
                for(unsigned i=0; i<tasks.size();)
                {
-                       Task::Status status = tasks[i]->check();
+                       Task::Status status;
+                       if(jobs==1 || (tasks.size()==1 && starved))
+                               status = tasks[i]->wait();
+                       else
+                               status = tasks[i]->check();
+
                        if(status!=Task::RUNNING)
                        {
                                ++count;
@@ -505,6 +503,7 @@ int Builder::do_build()
                                        fail = true;
                                if(tasks.empty() && fail)
                                        finish = true;
+                               starved = false;
                        }
                        else
                                ++i;
@@ -551,9 +550,11 @@ int Builder::do_clean()
        }
 
        for(set<Target *>::iterator i=clean_tgts.begin(); i!=clean_tgts.end(); ++i)
-               if(FileTarget *ft = dynamic_cast<FileTarget *>(*i))
-                       if(ft->get_mtime())
-                               FS::unlink(ft->get_path());
+       {
+               logger.log("tasks", format("RM    %s", (*i)->get_name()));
+               if(!dry_run)
+                       (*i)->clean();
+       }
 
        return 0;
 }