#include <msp/fs/dir.h>
#include <msp/fs/stat.h>
#include <msp/fs/utils.h>
-#include <msp/io/print.h>
-#include <msp/strings/lexicalcast.h>
-#include "booleanevaluator.h"
+#include <msp/strings/format.h>
#include "builder.h"
#include "component.h"
#include "sourcepackage.h"
if(FS::is_dir(opath))
dirs.push_back(opath);
}
+ set<string> overlay_files;
for(SourceList::const_iterator j=dirs.begin(); j!=dirs.end(); ++j)
{
package.get_builder().get_logger().log("files", format("Traversing %s", *j));
list<string> sfiles = list_files(*j);
for(list<string>::iterator k=sfiles.begin(); k!=sfiles.end(); ++k)
+ {
+ if(j!=dirs.begin())
+ {
+ if(overlay_files.count(*k))
+ continue;
+ overlay_files.insert(*k);
+ }
files.push_back(*j / *k);
+ }
}
}
else
Component::Loader::Loader(Component &c):
- DataFile::ObjectLoader<Component>(c)
+ DataFile::ObjectLoader<Component>(c),
+ ConditionalLoader(c.package, format("%s/%s", c.package.get_name(), c.name))
{
- add("if_arch", &Loader::if_arch);
- add("if_feature", &Loader::if_feature);
add("overlay", &Loader::overlay);
add("source", &Loader::source);
add("install", &Component::install);
load_sub(obj.build_info);
}
-void Component::Loader::if_arch(const string &cond)
-{
- BooleanEvaluator eval(sigc::hide<1>(sigc::mem_fun(&obj.package.get_builder().get_current_arch(), &Architecture::match_name)), false);
- bool match = eval.evaluate(cond);
- obj.package.get_builder().get_logger().log("configure",
- format("%s/%s: arch %s %smatched", obj.package.get_name(), obj.name, cond, (match ? "" : "not ")));
- if(match)
- load_sub_with(*this);
-}
-
-void Component::Loader::if_feature(const string &cond)
-{
- BooleanEvaluator eval(sigc::mem_fun(&obj.package, &SourcePackage::match_feature));
- bool match = eval.evaluate(cond);
- obj.package.get_builder().get_logger().log("configure",
- format("%s/%s: feature %s %smatched", obj.package.get_name(), obj.name, cond, (match ? "" : "not ")));
- if(match)
- load_sub_with(*this);
-}
-
void Component::Loader::install_map()
{
load_sub(obj.install_map, obj.package.get_source_directory());