]> git.tdb.fi Git - builder.git/commitdiff
Add comments
authorMikko Rasa <tdb@tdb.fi>
Tue, 14 Nov 2006 21:39:43 +0000 (21:39 +0000)
committerMikko Rasa <tdb@tdb.fi>
Tue, 14 Nov 2006 21:39:43 +0000 (21:39 +0000)
41 files changed:
source/action.cpp
source/action.h
source/analyzer.cpp
source/analyzer.h
source/archive.h
source/builder.cpp
source/builder.h
source/buildinfo.cpp
source/buildinfo.h
source/compile.h
source/component.cpp
source/component.h
source/config.cpp
source/config.h
source/copy.cpp
source/copy.h
source/executable.cpp
source/executable.h
source/externalaction.cpp
source/externalaction.h
source/header.h
source/install.h
source/link.h
source/misc.cpp
source/objectfile.cpp
source/objectfile.h
source/option.cpp [deleted file]
source/option.h [deleted file]
source/package.cpp
source/package.h
source/packageref.cpp
source/packageref.h
source/sharedlibrary.h
source/sourcefile.cpp
source/sourcefile.h
source/staticlibrary.h
source/systemlibrary.h
source/target.cpp
source/target.h
source/virtualtarget.cpp
source/virtualtarget.h

index 9ec8087d4b2ffd6200008413d260f998831a5036..782546ae0512568dd8b294d69534d327ed136891 100644 (file)
@@ -5,6 +5,9 @@
 
 using namespace std;
 
+/**
+Annouces the action by printing out the package name, tool and target name.
+*/
 void Action::announce(const string &pkg, const string &tool, const string &tgt)
 {
        ostringstream line;
index 60d14506853387445b0922bd9eeb560af1c040dd..5877e8947d4667270451298b323a6b64cd4eb03b 100644 (file)
@@ -6,12 +6,23 @@
 
 class Builder;
 
+/**
+Actions are executed to rebuild targets.
+*/
 class Action
 {
 public:
+       /// Emitted when the action has finished
        sigc::signal<void> signal_done;
        
+       /**
+       Checks whether the action is done and emits signal_done if it is.
+
+       @return  0 on successful completion, 1 on error, -1 if the action is still
+                executing
+       */
        virtual int check()=0;
+       
        virtual ~Action() { }
 protected:
        Builder &builder;
index 21ed52cec64b2cf463a62a1d9823870ea5917283..e2b25bd6260bfdce4ede32c615dad72a6079b10b 100644 (file)
@@ -14,10 +14,14 @@ using namespace Msp;
 
 Analyzer::Analyzer(Builder &b):
        builder(b),
+       mode(DEPS),
        max_depth(0),
        full_paths(false)
 { }
 
+/**
+Performs the analysis and prints out the resulting dependency tree.
+*/
 void Analyzer::analyze()
 {
        TableRow row;
@@ -32,16 +36,25 @@ void Analyzer::analyze()
        print_table();
 }
 
+/**
+Adds rows to the table for the given target and it' dependencies.
+
+@param   tgt    Target to be processed
+@param   depth  Recursion level of the target (top level is 0)
+*/
 void Analyzer::build_depend_table(Target &tgt, unsigned depth)
 {
        if(mode!=REBUILD && mode!=ALLDEPS)
        {
+               // Skip trivial targets
                if(dynamic_cast<ObjectFile *>(&tgt))
                        return build_depend_table(*tgt.get_depends().front(), depth);
                else if(dynamic_cast<Install *>(&tgt))
                        return build_depend_table(*tgt.get_depends().front(), depth);
        }
        else if(mode==REBUILD && !tgt.get_rebuild())
+               /* All targets that depend on to-be-built targets will be rebuilt
+                  themselves, so we cn stop here. */
                return;
        
        TableRow row;
@@ -74,16 +87,21 @@ void Analyzer::build_depend_table(Target &tgt, unsigned depth)
        if(!max_depth || depth<max_depth-1)
        {
                const TargetList &depends=tgt.get_depends();
+               //XXX If we want to sort the targets, we need to take the value of full_paths into account
                //depends.sort(target_order);
                for(TargetList::const_iterator i=depends.begin(); i!=depends.end(); ++i)
                        build_depend_table(**i, depth+1);
        }
 }
 
+/**
+Prints out the table that resulted from the analysis.
+*/
 void Analyzer::print_table() const
 {
        vector<unsigned> col_width;
 
+       // Determine column widths
        for(Table::const_iterator i=table.begin(); i!=table.end(); ++i)
        {
                if(col_width.size()<i->size())
index 6c7b9dc70790838ba681875ad000729530f60840..c5c6ba2891de6cf8ba144763b488d69f05e1d889 100644 (file)
@@ -8,15 +8,18 @@
 class Builder;
 class Target;
 
+/**
+Performs various kinds of dependency analysis on the build tree.
+*/
 class Analyzer
 {
 public:
        enum Mode
        {
-               DEPS,
-               ALLDEPS,
-               REBUILD,
-               RDEPS
+               DEPS,     /// Skip over "trivial" targets such as Install and Compile
+               ALLDEPS,  /// Print out absolutely every target
+               REBUILD,  /// Print targets that are going to be rebuilt
+               RDEPS     /// Print targets that depend on the given targets (NYI)
        };
 
        Analyzer(Builder &);
index 49b5fe07fcf596c2b70ccd4310cd4f91edcb27eb..e95749ecacefbc135fc6b46b9f8b053a3e94a80d 100644 (file)
@@ -5,6 +5,9 @@
 
 class StaticLibrary;
 
+/**
+Creates an archive of object files, a.k.a. static library.
+*/
 class Archive: public ExternalAction
 {
 public:
index 5a1d624390fa45250bab4451b3196693d5d46dc9..c271c2bb56cf81b211efd8013e4ade5de0e92b59 100644 (file)
@@ -171,7 +171,9 @@ Target *Builder::get_target(const string &n)
 
 /**
 Tries to locate a header included from a given location and with a given include
-path.  Considers known targets as well as existing files.
+path.  Considers known targets as well as existing files.  If a matching target
+is not found but a file exists, a new SystemHeader target will be created and
+returned.
 */
 Target *Builder::get_header(const string &include, const string &from, const list<string> &path)
 {
@@ -201,6 +203,11 @@ Target *Builder::get_header(const string &include, const string &from, const lis
        return 0;
 }
 
+/**
+Tries to locate a library with the given library path.  Considers known targets
+as well as existing files.  If a matching target is not found but a file exists,
+a new SystemLibrary target will be created and returned.
+*/
 Target *Builder::get_library(const string &lib, const list<string> &path)
 {
        string hash(8, 0);
@@ -350,6 +357,13 @@ void Builder::usage(const char *argv0, bool brief)
        }
 }
 
+/**
+Loads the given build file.
+
+@param   fn  Path to the file
+
+@return  0 on success, -1 if the file could not be opened
+*/
 int Builder::load_build_file(const Path::Path &fn)
 {
        ifstream in(fn.str().c_str());
@@ -363,6 +377,12 @@ int Builder::load_build_file(const Path::Path &fn)
        return 0;
 }
 
+/**
+Creates targets for all packages and prepares them for building.
+
+@return  0 if everything went ok, -1 if something bad happened and a build
+         shouldn't be attempted
+*/
 int Builder::create_targets()
 {
        Target *world=new VirtualTarget(*this, "world");
@@ -390,6 +410,7 @@ int Builder::create_targets()
                const ComponentList &components=i->second->get_components();
                for(ComponentList::const_iterator j=components.begin(); j!=components.end(); ++j)
                {
+                       // Collect all files belonging to the component
                        PathList files;
                        const PathList &sources=j->get_sources();
                        for(PathList::const_iterator k=sources.begin(); k!=sources.end(); ++k)
@@ -413,17 +434,15 @@ int Builder::create_targets()
                        {
                                string basename=(*k)[-1];
                                string ext=Path::splitext(basename).ext;
-                               if(ext==".cpp" || ext==".c")
+                               if((ext==".cpp" || ext==".c") && build_exe)
                                {
-                                       if(build_exe)
-                                       {
-                                               SourceFile *src=new SourceFile(*this, &*j, k->str());
-                                               add_target(src);
-                                               
-                                               ObjectFile *obj=new ObjectFile(*this, *j, *src);
-                                               add_target(obj);
-                                               objs.push_back(obj);
-                                       }
+                                       SourceFile *src=new SourceFile(*this, &*j, k->str());
+                                       add_target(src);
+
+                                       // Compile sources
+                                       ObjectFile *obj=new ObjectFile(*this, *j, *src);
+                                       add_target(obj);
+                                       objs.push_back(obj);
                                }
                                else if(ext==".h")
                                {
@@ -433,6 +452,8 @@ int Builder::create_targets()
                                                hdr=new Header(*this, &*j, k->str());
                                                add_target(hdr);
                                        }
+
+                                       // Install headers if requested
                                        if(!j->get_install_headers().empty())
                                        {
                                                Path::Path inst_path=inst_base/"include"/j->get_install_headers()/basename;
@@ -493,6 +514,7 @@ int Builder::create_targets()
                }
        }
 
+       // Find dependencies until no new targets are created
        while(!new_tgts.empty())
        {
                Target *tgt=new_tgts.front();
@@ -502,7 +524,8 @@ int Builder::create_targets()
                        new_tgts.push_back(tgt);
        }
 
-       for(list<string>::iterator i=what_if.begin(); i!=what_if.end(); ++i)
+       // Apply what-ifs
+       for(StringList::iterator i=what_if.begin(); i!=what_if.end(); ++i)
        {
                Target *tgt=get_target((cwd/ *i).str());
                if(!tgt)
@@ -513,6 +536,7 @@ int Builder::create_targets()
                tgt->touch();
        }
 
+       // Make the cmdline target depend on all targets mentioned on the command line
        Target *cmdline=new VirtualTarget(*this, "cmdline");
        add_target(cmdline);
        world->add_depend(cmdline);
@@ -534,6 +558,10 @@ int Builder::create_targets()
        return 0;
 }
 
+/**
+Check if a header exists, either as a target or a file.  Either an existing
+target or a new SystemHeader target will be returned.
+*/
 Target *Builder::check_header(const Msp::Path::Path &fn)
 {
        Target *tgt=get_target(fn.str());
@@ -547,12 +575,18 @@ Target *Builder::check_header(const Msp::Path::Path &fn)
        return 0;
 }
 
+/**
+Adds a target to both the target map and the new target queue.
+*/
 void Builder::add_target(Target *t)
 {
        targets.insert(TargetMap::value_type(t->get_name(), t));
        new_tgts.push_back(t);
 }
 
+/**
+Updates a hash with a string.  This is used from get_header and get_library.
+*/
 void Builder::update_hash(string &hash, const string &value)
 {
        for(unsigned i=0; i<value.size(); ++i)
@@ -633,6 +667,9 @@ int Builder::build()
        return fail?-1:0;
 }
 
+/**
+Prints out information about the default package.
+*/
 void Builder::package_help()
 {
        const Config &config=default_pkg->get_config();
index 786b48c37f8f1752a8fbe17630d80aeacf5196e1..1016498f08b736e3517e45f269079e78b76cc13f 100644 (file)
 class Analyzer;
 class Package;
 
+/**
+The main application class.  Controls and owns everything.  Rules the world.
+*/
 class Builder: public Msp::Application
 {
 public:
        Builder(int, char **);
-       unsigned get_verbose() const { return verbose; }
-       bool     get_dry_run() const { return dry_run; }
+       unsigned get_verbose() const   { return verbose; }
+       bool     get_dry_run() const   { return dry_run; }
        bool     get_build_all() const { return build_all; }
        Package  *get_package(const std::string &);
        Target   *get_target(const std::string &);
index f96820baee83f3886e33189d5900a1a17d346daa..de111e935303bfc2c055fd3617dface673cbd4d3 100644 (file)
@@ -3,6 +3,9 @@
 
 using namespace Msp;
 
+/**
+Adds another BuildInfo to the end of this one.
+*/
 void BuildInfo::add(const BuildInfo &bi)
 {
        cflags.insert(cflags.end(), bi.cflags.begin(), bi.cflags.end());
@@ -13,6 +16,9 @@ void BuildInfo::add(const BuildInfo &bi)
        libs.insert(libs.end(), bi.libs.begin(), bi.libs.end());
 }
 
+/**
+Makes sure there are no duplicate entries in the lists.
+*/
 void BuildInfo::unique()
 {
        unique(cflags);
@@ -23,6 +29,10 @@ void BuildInfo::unique()
        unique(libs);
 }
 
+/**
+Removes any duplicate entries from a list, leaving only the first one.  The
+order of other elements is preserved.  O(n²) efficiency.
+*/
 void BuildInfo::unique(StringList &l)
 {
        StringList l2;
index ccd4b86798db7cc4a8c96eafffaef56c0ea82f82..10fd3bec439c3ad6a16379e6453d1e877325f0d1 100644 (file)
@@ -6,6 +6,10 @@
 #include <msp/parser/loader.h>
 #include "misc.h"
 
+/**
+Stores information about compiler command line parameters in a more abstract
+form.  Allows combining with other BuildInfos to support package dependencies.
+*/
 class BuildInfo
 {
 public:
index 5e0d47f3104ca148ee47e99620f2e7e2b97b51b7..fd6ae8b9adaa78f026f955a8988ed9822eac31b7 100644 (file)
@@ -7,6 +7,9 @@
 class Component;
 class ObjectFile;
 
+/**
+Compiles a source file into an object file.
+*/
 class Compile: public ExternalAction
 {
 public:
index 6d02ad319e690a33be59823edbf4ddc35d85fcb3..97fdacd66ac8f221871052be29e1727ba424b337 100644 (file)
@@ -10,12 +10,18 @@ Component::Component(Package &p, Type t, const string &n):
        install(false)
 { }
 
+/**
+Tries to resolve all references to packages.
+*/
 void Component::resolve_refs()
 {
        for(PkgRefList::iterator i=requires.begin(); i!=requires.end(); ++i)
                i->resolve();
 }
 
+/**
+Prepares the build information for building.
+*/
 void Component::create_build_info()
 {
        build_info.add(pkg.get_build_info());
index ab3906854f79e38ca192fead4ca744f79ff4291f..663132ad3f7ede8c6fc994f6112c77c83c531ee9 100644 (file)
 
 class Package;
 
+/**
+Components specify things to be built.  Each component may build one binary (it
+may also build none), as well as install a bunch of headers.  Components inherit
+dependencies and build info from the package they belong to, and may also add
+their own.
+*/
 class Component
 {
 public:
+       /// Loads a Component from file.  Used from Package::Loader.
        class Loader: public Msp::Parser::Loader
        {
        public:
index 61f7322e742ead72279f2d89a33f1012a4c8f497..99e5981503eb35ab9780711a092cea30a3701776 100644 (file)
@@ -7,11 +7,22 @@
 using namespace std;
 using namespace Msp;
 
+/**
+Adds a configuration option.
+
+@param   n  Option name
+@param   v  Default value
+@param   d  Description
+*/
 void Config::add_option(const string &n, const string &v, const string &d)
 {
        options.insert(OptionMap::value_type(n, Option(n, v, d)));
 }
 
+/**
+Gets the given option from the configuration.  If the option doesn't exist,
+an Exception is thrown.
+*/
 const Config::Option &Config::get_option(const string &name) const
 {
        OptionMap::const_iterator i=options.find(name);
@@ -21,11 +32,23 @@ const Config::Option &Config::get_option(const string &name) const
        return i->second;
 }
 
+/**
+Checks whether an option with the given name exists.
+*/
 bool Config::is_option(const string &name) const
 {
        return options.count(name);
 }
 
+/**
+Processes options from the given raw option map.  Nonexistent options are
+ignored.  If any options were changed, the mtime of the configuration is updated
+to the current time.
+
+@param   opts  A map to process options from
+
+@return  Whether any option values were changed
+*/
 bool Config::process(const RawOptionMap &opts)
 {
        bool changed=false;
@@ -46,6 +69,9 @@ bool Config::process(const RawOptionMap &opts)
        return changed;
 }
 
+/**
+Loads configuration from a file, if it exists.
+*/
 void Config::load(const Path::Path &fn)
 {
        ifstream in(fn.str().c_str());
index 9747d99aae0ee339a1878a8be3e72c7d60489e09..355108fb2c35bcd26f5c012c107dc4d587703212 100644 (file)
@@ -6,13 +6,19 @@
 #include <msp/parser/loader.h>
 #include <msp/path/path.h>
 #include <msp/time/timestamp.h>
-#include "option.h"
 
 typedef std::map<std::string, std::string> RawOptionMap;
 
+/**
+Manages configuration for a package.  A configuration may have an arbitary
+amount of options, as well as a modification time (mtime).
+*/
 class Config
 {
 public:
+       /**
+       A single configuration option.
+       */
        struct Option
        {
                std::string name;
index 0607b5de5b0d59c0bb3c285f9e0e48fee48eb80c..6ad2a5e791d1705509f9bff208b27e3819764044 100644 (file)
@@ -25,7 +25,7 @@ Copy::Copy(Builder &b, const Package &pkg, const Path::Path &s, const Path::Path
 
 int Copy::check()
 {
-       if(!worker)
+       if(!worker)  // True for dry run
        {
                signal_done.emit();
                return 0;
@@ -50,6 +50,7 @@ void Copy::Worker::main()
 {
        Path::mkpath(copy.dest.subpath(0, copy.dest.size()-1), 0755);
        
+       // Remove old file.  Not doing this would cause Bad Stuff when installing libraries.
        if(unlink(copy.dest.str().c_str())<0 && errno!=ENOENT)
        {
                int err=errno;
@@ -74,6 +75,7 @@ void Copy::Worker::main()
                return;
        }
 
+       // Actual transfer loop
        char buf[16384];
        while(!in.eof())
        {
@@ -81,6 +83,7 @@ void Copy::Worker::main()
                out.write(buf, in.gcount());
        }
 
+       // Preserve file permissions
        struct stat st;
        Path::stat(copy.src, st);
        chmod(copy.dest.str().c_str(), st.st_mode&0777);
index 3f92b155f4960038ccc7a5341586d27bb870d7b0..4e232166c0883c1e18575b6a731872c3dead685f 100644 (file)
@@ -7,6 +7,9 @@
 
 class Package;
 
+/**
+Copies a file to another place.  Used by the Install target.
+*/
 class Copy: public Action
 {
 public:
@@ -14,6 +17,9 @@ public:
        int check();
        ~Copy();
 private:
+       /**
+       A worker thread that actually does the data transfer.
+       */
        class Worker: public Msp::Thread
        {
        public:
index fb1edfb2f2193b34b9f46ff35d0b95817a66b8a4..8f8c9a2dc0f2c3d35ff93b0206acc45b6befd26b 100644 (file)
@@ -16,6 +16,9 @@ Executable::Executable(Builder &b, const Component &c, const list<ObjectFile *>
                add_depend(*i);
 }
 
+/**
+Finds and adds any required libraries to the dependencies.
+*/
 void Executable::find_depends()
 {
        const list<string> &libs=comp.get_build_info().libs;
@@ -34,6 +37,10 @@ Action *Executable::build()
        return Target::build(new Link(builder, *this));;
 }
 
+/**
+Returns the name for the executable.  We can't do this in the constructor since
+we need to pass the value to the Target c'tor.
+*/
 string Executable::generate_target_name(const Component &c)
 {
        string prefix,suffix;
index 7fefef7a469326246b706b0f5f72d4a7282f3add..d7d8ebbea909fa3f1c853b1212d3827d1962e51c 100644 (file)
@@ -6,6 +6,10 @@
 class Component;
 class ObjectFile;
 
+/**
+Produces a binary file, which may be either a standalone executable or a shared
+library.
+*/
 class Executable: public Target
 {
 public:
index b86d8028da25636e5677f00e5eb1763df6a17a94..0ae68ff05f30bd297b314de7a77ac3e471192cb0 100644 (file)
@@ -16,7 +16,7 @@ int ExternalAction::check()
        }
        
        if(!pid)
-               return 255;
+               return exit_code;
 
        int status;
        if(waitpid(pid, &status, WNOHANG)==pid)
@@ -26,12 +26,16 @@ int ExternalAction::check()
                        exit_code=WEXITSTATUS(status);
                else
                        exit_code=254;
+               pid=0;
                return exit_code;
        }
        else
                return -1;
 }
 
+/**
+Starts the external program.  Fill in argv before calling this.
+*/
 void ExternalAction::launch()
 {
        if(builder.get_verbose()>=2)
index 86f32753e61f3b323f7a2012a3bd85a3438f8e4a..2ab4ca0e00958432084771e25bbd383ed1ac0556 100644 (file)
@@ -6,6 +6,9 @@
 #include "action.h"
 #include "misc.h"
 
+/**
+Base class for Actions that want to execute an external program.
+*/
 class ExternalAction: public Action
 {
 public:
index c398468a882dc2cb0ded93a493052c4b9e70774b..a22c6ce772b7a59d5eac9a2615688b70c03005c7 100644 (file)
@@ -3,6 +3,9 @@
 
 #include "sourcefile.h"
 
+/**
+Represents a header file.  Mainly exists to give extra information to the user.
+*/
 class Header: public SourceFile
 {
 public:
@@ -10,6 +13,9 @@ public:
        const char *get_type() const { return "Header"; }
 };
 
+/**
+A header file that doesn't belong to any known package.
+*/
 class SystemHeader: public Header
 {
 public:
index 503205a021f0a4223e9bb537078193d130d05444..fd6472fea6fc40d7e4c40d35c09117ffba67002c 100644 (file)
@@ -3,6 +3,9 @@
 
 #include "target.h"
 
+/**
+Represents the installation of a file.
+*/
 class Install: public Target
 {
 public:
index 63ebf356548c8f80fdb06c10f1b7d1fbf77587d2..484838854cfd8f74b8aeb62bb1be1408f04b45e9 100644 (file)
@@ -5,6 +5,9 @@
 
 class Executable;
 
+/**
+Links object files and libraries to produce an executable.
+*/
 class Link: public ExternalAction
 {
 public:
index 37616a95f3dfeba4a5994d6f00eb727f04caaccf..35953a74efb00b4a1ad1e1979469eecd74427c72 100644 (file)
@@ -6,7 +6,11 @@
 using namespace std;
 using namespace Msp;
 
-string run_command(const list<string> &argv)
+/**
+Runs a command and returns its output as a string.  The exit status of the
+command is lost.
+*/
+string run_command(const StringList &argv)
 {
        int pfd[2];
        pipe(pfd);
@@ -17,7 +21,7 @@ string run_command(const list<string> &argv)
        if(pid==0)
        {
                char *argv_[argv.size()+1];
-               for(CountingIterator<const string, list<string>::const_iterator> i=argv.begin(); i!=argv.end(); ++i)
+               for(CountingIterator<const string, StringList::const_iterator> i=argv.begin(); i!=argv.end(); ++i)
                        argv_[i.count()]=strdup(i->c_str());
                argv_[argv.size()]=0;
                close(pfd[0]);
index 874f06925e56343c4e9e7ce5afe0911cd3a025e2..2aab39b430906eec4f2bde29ed1a0357c1af7dab 100644 (file)
@@ -19,6 +19,12 @@ ObjectFile::ObjectFile(Builder &b, const Component &c, SourceFile &src):
        add_depend(&src);
 }
 
+/**
+Processes as many new dependences as possible.  Some may be left unprocessed
+if their own dependencies are not ready, requiring another call to this
+function.  Use the get_deps_ready() function to determine whether this is the
+case.
+*/
 void ObjectFile::find_depends()
 {
        for(TargetList::iterator i=new_deps.begin(); i!=new_deps.end();)
@@ -41,6 +47,9 @@ Action *ObjectFile::build()
        return Target::build(new Compile(builder, *this));
 }
 
+/**
+Recursively looks for header targets and adds them as dependencies.
+*/
 void ObjectFile::find_depends(Target *tgt)
 {
        const string &tname=tgt->get_name();
@@ -65,6 +74,9 @@ void ObjectFile::find_depends(Target *tgt)
        }
 }
 
+/**
+Adds a target to the dependency list as well as the new dependencies list.
+*/
 void ObjectFile::add_depend(Target *tgt)
 {
        Target::add_depend(tgt);
index 8306aea46284ac63d668dc73ebc4dfd62274f0d3..42238e14b546db0c356b3be02b9d3da6a052f4ae 100644 (file)
@@ -6,11 +6,14 @@
 class Component;
 class SourceFile;
 
+/**
+Object files are compiled from source files.
+*/
 class ObjectFile: public Target
 {
 public:
        ObjectFile(Builder &, const Component &, SourceFile &);
-       const char      *get_type() const { return "ObjectFile"; }
+       const char      *get_type() const      { return "ObjectFile"; }
        const Component &get_component() const { return comp; }
        void            find_depends();
        Action          *build();
diff --git a/source/option.cpp b/source/option.cpp
deleted file mode 100644 (file)
index 8f1a6e9..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "option.h"
-
-using namespace std;
-
-Option::Option(const string &n, const string &v, const string &d):
-       name(n),
-       defv(v),
-       descr(d),
-       value(v)
-{ }
diff --git a/source/option.h b/source/option.h
deleted file mode 100644 (file)
index cbf1769..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef OPTION_H_
-#define OPTION_H_
-
-#include <string>
-
-class Option
-{
-public:
-       Option(const std::string &, const std::string &, const std::string &);
-       void set_value(const std::string &v) { value=v; }
-       const std::string &get_value() const { return value; }
-       const std::string &get_name() const { return name; }
-       const std::string &get_default_value() const { return defv; }
-       const std::string &get_description() const { return descr; }
-private:
-       std::string name;
-       std::string defv;
-       std::string descr;
-       std::string value;
-};
-
-#endif
index 14d2321e26964229a04d68cc72716b791bc15978..14ae5f7878ac99781a701eb9fee6ce82052df204 100644 (file)
@@ -9,6 +9,9 @@ using namespace Msp;
 
 #include <iostream>
 
+/**
+Creates a buildable package.
+*/
 Package::Package(Builder &b, const string &n, const Path::Path &s):
        builder(b),
        name(n),
@@ -17,11 +20,18 @@ Package::Package(Builder &b, const string &n, const Path::Path &s):
        build_info_ready(false)
 { }
 
+/**
+Sets the path where the package files were installed.  This is only useful for
+non-buildable packages that don't use pkg-config.
+*/
 void Package::set_path(const Msp::Path::Path &p)
 {
        path=builder.get_cwd()/p;
 }
 
+/**
+Tries to resolve all references to dependency packages.
+*/
 void Package::resolve_refs()
 {
        for(PkgRefList::iterator i=requires.begin(); i!=requires.end(); ++i)
@@ -30,6 +40,9 @@ void Package::resolve_refs()
                i->resolve_refs();
 }
 
+/**
+Fills in build info based on configuration.
+*/
 void Package::create_build_info()
 {
        if(build_info_ready)
@@ -101,12 +114,21 @@ void Package::create_build_info()
        build_info_ready=true;
 }
 
+/**
+Processes configuration options that were most likely obtained from the command
+line.
+*/
 void Package::process_options(const RawOptionMap &opts)
 {
        if(config.process(opts))
                config.save(source/".options.cache");
 }
 
+/**
+Creates a non-buildable package with the given name.  Pkg-config is tried first
+to get build information.  If it fails, a built-in list of known packages is
+consulted.
+*/
 Package *Package::create(Builder &b, const string &name)
 {
        list<string> argv;
@@ -120,6 +142,7 @@ Package *Package::create(Builder &b, const string &name)
        bool need_path=false;
        if(info.empty())
        {
+               //XXX Put these in an external file
                if(name=="opengl")
                        info.push_back("-lGL");
                else if(name=="pthread")
@@ -158,6 +181,9 @@ Package::Package(Builder &b, const string &n, const vector<string> &info):
        }
 }
 
+/**
+Initializes a buildable package.  Mostly adds configuration options.
+*/
 void Package::init_buildable()
 {
        buildable=true;
@@ -187,6 +213,11 @@ void Package::init_buildable()
        config.load(source/".options.cache");
 }
 
+/**
+Checks which kinds of things the components of this package install.
+
+@return  A bitmask of installed things
+*/
 unsigned Package::get_install_flags()
 {
        unsigned flags=0;
index 743a962f52e2750c429c6bd93299208729dde8e0..3d980f26ab19d501adf1486df69a25a6962a8943 100644 (file)
 
 class Builder;
 
+/**
+A package is a distributable piece of software.  They consist of one or more
+Components and may depend on other packages.  Packages also have configuration
+to determine where files are installed and which features to include (features
+NYI).
+*/
 class Package
 {
 public:
+       /// Loads a package from a file.
        class Loader: public Msp::Parser::Loader
        {
        public:
index 0f7dc265fa851032440222da73c4c3154aa8af79..57336a30f2a643887c7132ec85e2ed1d4a6c4a76 100644 (file)
@@ -10,6 +10,11 @@ PackageRef::PackageRef(Builder &b, const string &n):
        package(0)
 { }
 
+/**
+Tries to get the package from Builder if we don't have it already.
+
+@return  The package pointer (0 if the package was not found)
+*/
 Package *PackageRef::resolve()
 {
        if(!package)
index 9698b1e14e0ee4f222c0f7dc79f81b80dd5f1de9..da25f53eea7c684bda15f32b4c7e9b5f4f16b844 100644 (file)
@@ -7,6 +7,9 @@
 class Builder;
 class Package;
 
+/**
+A proxy class that stores a package name and possibly a pointer to the package.
+*/
 class PackageRef
 {
 public:
index 96a38fae0523192d14215af5c4580f6098ba407f..639592d165370500d2dfa7e5dd85df1a61b5caa2 100644 (file)
@@ -3,6 +3,10 @@
 
 #include "executable.h"
 
+/**
+Represents a shared library.  Mainly exists to give extra information to the
+user.
+*/
 class SharedLibrary: public Executable
 {
 public:
index ba37f3f59dc5d11653fe5f5a5dfe4282d6134b17..c4eea79eee84fa2b4c76d18c5f8e3619746513d9 100644 (file)
@@ -14,6 +14,10 @@ SourceFile::SourceFile(Builder &b, const Component *c, const string &n):
        comp(c)
 { }
 
+/**
+Parses include directives from the file and looks up the appropriate targets
+from Builder.
+*/
 void SourceFile::find_depends()
 {
        ifstream in(name.c_str());
index 0bca39055fede799a16eca2c970b1963991fc9df..381d59355977284f5855a5550f3534c19782c160 100644 (file)
@@ -5,12 +5,15 @@
 
 class Component;
 
+/**
+Represents a C or C++ source file.
+*/
 class SourceFile: public Target
 {
 public:
        SourceFile(Builder &, const Component *, const std::string &);
        const StringList &get_includes() const { return includes; }
-       const char       *get_type() const { return "SourceFile"; }
+       const char       *get_type() const     { return "SourceFile"; }
        void             find_depends();
        Action           *build() { return 0; }
 private:
index 0d1242f31d96825dd198b4ed23027202d92c1b35..83ae10594bf30bf7946e40facbcdf9a158cc3990 100644 (file)
@@ -6,6 +6,9 @@
 class Component;
 class ObjectFile;
 
+/**
+A static library target.
+*/
 class StaticLibrary: public Target
 {
 public:
index bd554296b8b8cda181fc480dad907342306b2850..babd494f97a5c5f53b6336619c357f256fa66719 100644 (file)
@@ -3,6 +3,9 @@
 
 #include "target.h"
 
+/**
+A library that doesn't belong to any known package.
+*/
 class SystemLibrary: public Target
 {
 public:
index e03428837838afdbd78447862075f4db66d082b6..1f4ace9d92c1d7b79122129a99b9781814e0f0d5 100644 (file)
@@ -8,6 +8,11 @@
 using namespace std;
 using namespace Msp;
 
+/**
+Tries to locate a target that will help getting this target built.  If all
+dependencies are up-to-date, returns this target.  If there are no targets
+ready to be built (maybe because they are being built right now), returns 0.
+*/
 Target *Target::get_buildable_target()
 {
        bool self_ok=true;
@@ -32,17 +37,28 @@ void Target::add_depend(Target *dep)
        dep->rdepends.push_back(this);
 }
 
+/**
+Prepares the target by recursively preparing dependencies, then checking
+whether rebuilding is needed.  A flag is used to prevent unnecessary
+executions.
+*/
 void Target::prepare()
 {
        if(prepared)
                return;
 
+       prepared=true;
        for(TargetList::iterator i=depends.begin(); i!=depends.end(); ++i)
                (*i)->prepare();
 
        check_rebuild();
+
 }
 
+/**
+Returns the number of targets that need to be rebuilt in order to get this
+target up-to-date.
+*/
 unsigned Target::count_rebuild()
 {
        if(counted)
@@ -55,6 +71,9 @@ unsigned Target::count_rebuild()
        return count;
 }
 
+/**
+Changes the mtime of the target to the current time.
+*/
 void Target::touch()
 {
        mtime=Time::now();
@@ -82,6 +101,9 @@ void Target::mark_rebuild(const std::string &reason)
        rebuild_reason=reason;
 }
 
+/**
+Checks if this target needs to be rebuilt and why.
+*/
 void Target::check_rebuild()
 {
        if(!buildable)
@@ -105,6 +127,10 @@ void Target::check_rebuild()
                mark_rebuild("Package options changed");
 }
 
+/**
+Hooks the target up with the given action, then returns it.  This should be
+called from the public build() function of buildable targets.
+*/
 Action *Target::build(Action *action)
 {
        building=true;
@@ -112,6 +138,9 @@ Action *Target::build(Action *action)
        return action;
 }
 
+/**
+Handles for the build_done signal of Action.
+*/
 void Target::build_done()
 {
        building=false;
index eb46d9fe7116125798f4e7920baf71f5c87c8260..fa744ac75f341fef278d9fe953a6654e0e317387 100644 (file)
@@ -12,6 +12,10 @@ class Package;
 class Target;
 typedef std::list<Target *> TargetList;
 
+/**
+Targets make up the build graph.  This class is a base for all target types and
+handles many common tasks.  Most targets are associated with a file.
+*/
 class Target
 {
 public:
@@ -27,7 +31,12 @@ public:
        void               add_depend(Target *);
        virtual void       find_depends()              { deps_ready=true; }
        virtual void       prepare();
+       
+       /**
+       Creates and returns an Action suitable for building this target.
+       */
        virtual Action     *build()=0;
+       
        void               reset_count()               { counted=false; }
        virtual unsigned   count_rebuild();
        void               touch();
index 074647abfe75a1e4aa3b339bd8b57388487f798b..4a272a7b70de442d3fe5756f3a0733b42040b295 100644 (file)
@@ -3,6 +3,9 @@
 
 using namespace std;
 
+/**
+Virtual targets are only rebuilt if their dependencies need rebuilding.
+*/
 void VirtualTarget::check_rebuild()
 {
        for(TargetList::iterator i=depends.begin(); (i!=depends.end() && !rebuild); ++i)
@@ -10,6 +13,9 @@ void VirtualTarget::check_rebuild()
                        mark_rebuild(Msp::Path::basename((*i)->get_name())+" needs rebuilding");
 }
 
+/**
+Don't count virtual targets since "building" them causes no action.
+*/
 unsigned VirtualTarget::count_rebuild()
 {
        return Target::count_rebuild()-rebuild;
index baccfa63ca536c93005a0ceb91da373f7bb4b44d..65967f2bc5d2a603fc434983f5428b36dcd5bbb8 100644 (file)
@@ -3,10 +3,13 @@
 
 #include "target.h"
 
+/**
+A target that is not associated with any file.
+*/
 class VirtualTarget: public Target
 {
 public:
-       VirtualTarget(Builder &b, const std::string &n): Target(b,0,n) { }
+       VirtualTarget(Builder &b, const std::string &n): Target(b, 0, n) { }
        const char *get_type() const { return "VirtualTarget"; }
        Action     *build()          { rebuild=false; return 0; }
        unsigned   count_rebuild();