-/* $Id$
-
-This file is part of builder
-Copyright © 2006-2010 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#include <msp/core/except.h>
+#include <algorithm>
#include <msp/fs/dir.h>
#include <msp/fs/stat.h>
#include <msp/fs/utils.h>
type(t),
name(n),
install(false),
- module_host(0),
- modular(false),
deflt(true)
{ }
+void Component::configure(const StringMap &opts, unsigned flag)
+{
+ for(StringList::iterator i=sources.begin(); i!=sources.end(); ++i)
+ *i = (pkg.get_source()/pkg.expand_string(*i)).str();
+
+ for(PackageList::const_iterator i=requires.begin(); i!=requires.end(); ++i)
+ (*i)->configure(opts, flag&2);
+}
+
void Component::create_build_info()
{
- build_info.add(pkg.get_build_info());
+ const PackageList &pkg_reqs = pkg.get_requires();
+ PackageList direct_reqs = requires;
+ direct_reqs.insert(direct_reqs.end(), pkg_reqs.begin(), pkg_reqs.end());
+
+ PackageList all_reqs = direct_reqs;
+ for(PackageList::iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i)
+ {
+ if(find(direct_reqs.begin(), direct_reqs.end(), *i)!=direct_reqs.end())
+ build_info.add((*i)->get_exported_binfo());
+ else
+ {
+ const BuildInfo &ebi = (*i)->get_exported_binfo();
+ build_info.cflags.insert(build_info.cflags.end(), ebi.cflags.begin(), ebi.cflags.end());
+ build_info.incpath.insert(build_info.incpath.end(), ebi.incpath.begin(), ebi.incpath.end());
+ build_info.defines.insert(build_info.defines.end(), ebi.defines.begin(), ebi.defines.end());
+ }
+
+ const PackageList &reqs = (*i)->get_requires();
+ for(PackageList::const_iterator j=reqs.begin(); j!=reqs.end(); ++j)
+ if(find(all_reqs.begin(), all_reqs.end(), *j)==all_reqs.end())
+ all_reqs.push_back(*j);
+ }
- for(PackageList::iterator i=requires.begin(); i!=requires.end(); ++i)
- build_info.add((*i)->get_exported_binfo());
+ build_info.add(pkg.get_build_info());
for(StringList::iterator i=build_info.incpath.begin(); i!=build_info.incpath.end(); ++i)
*i = (pkg.get_source() / *i).str();
if(pkg.get_library_mode()!=DYNAMIC)
{
- // XXX This may pull in some unnecessary libpaths too. More thought required.
- PackageList reqs = pkg.collect_requires();
- for(PackageList::iterator i=reqs.begin(); i!=reqs.end(); ++i)
+ for(PackageList::iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i)
{
const BuildInfo &ebi = (*i)->get_exported_binfo();
build_info.libpath.insert(build_info.libpath.end(), ebi.libpath.begin(), ebi.libpath.end());
build_info.cflags.push_back("-fPIC");
}
- if(modular)
- {
- build_info.ldflags.push_back("-rdynamic");
- build_info.libs.push_back("dl");
- }
- else if(module_host)
- {
- const PathList &host_src = module_host->get_sources();
- for(PathList::const_iterator i=host_src.begin(); i!=host_src.end(); ++i)
- build_info.incpath.push_back(i->str());
- }
-
build_info.unique();
}
if(type==LIBRARY)
if(SharedLibrary *shlib = dynamic_cast<SharedLibrary *>(*i))
- inst_tgt->add_depend(new Symlink(builder, pkg, *inst, shlib->get_name()));
+ if(!shlib->get_soname().empty())
+ inst_tgt->add_depend(new Symlink(builder, pkg, *inst, shlib->get_name()));
}
}
PathList Component::collect_source_files() const
{
PathList files;
- for(PathList::const_iterator i=sources.begin(); i!=sources.end(); ++i)
+ for(StringList::const_iterator i=sources.begin(); i!=sources.end(); ++i)
{
- if(FS::is_dir(*i))
+ FS::Path path(*i);
+ if(FS::is_dir(path))
{
- list<string> sfiles = list_files(*i);
+ list<string> sfiles = list_files(path);
for(list<string>::iterator j=sfiles.begin(); j!=sfiles.end(); ++j)
- files.push_back(*i / *j);
+ files.push_back(path / *j);
}
else
- files.push_back(*i);
+ files.push_back(path);
}
return files;
void Component::Loader::source(const string &s)
{
- comp.sources.push_back(comp.pkg.get_source()/s);
+ comp.sources.push_back(s);
}
void Component::Loader::require(const string &n)
void Component::Loader::modular()
{
- if(comp.type!=PROGRAM)
- throw Exception("Only programs can be modular");
- comp.modular = true;
+ IO::print("%s: Note: modular is deprecated\n", get_source());
+ comp.build_info.ldflags.push_back("-rdynamic");
+ comp.build_info.libs.push_back("dl");
}
-void Component::Loader::host(const string &n)
+void Component::Loader::host(const string &)
{
- const ComponentList &comps = comp.pkg.get_components();
- for(ComponentList::const_iterator i=comps.begin(); i!=comps.end(); ++i)
- if(i->get_name()==n)
- {
- if(i->get_type()!=PROGRAM || !i->is_modular())
- throw Exception("Module host must be a modular program");
- comp.module_host = &*i;
- return;
- }
-
- throw KeyError("Unknown component", n);
+ IO::print("%s: Note: host is deprecated\n", get_source());
}
void Component::Loader::install_headers(const string &p)