/**
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)
{
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);
}
}
+/**
+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());
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");
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)
{
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")
{
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;
}
}
+ // Find dependencies until no new targets are created
while(!new_tgts.empty())
{
Target *tgt=new_tgts.front();
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)
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);
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());
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)
return fail?-1:0;
}
+/**
+Prints out information about the default package.
+*/
void Builder::package_help()
{
const Config &config=default_pkg->get_config();