-#include <algorithm>
+#include <msp/core/algorithm.h>
#include <msp/fs/stat.h>
#include <msp/fs/utils.h>
-#include <msp/strings/format.h>
#include "builder.h"
#include "filetarget.h"
#include "sourcepackage.h"
Target::Target(Builder &b, const string &n):
builder(b),
- package(0),
- component(0),
- name(n),
- tool(0),
- state(INIT),
- primary_target(0)
+ name(n)
{
builder.get_build_graph().add_target(this);
}
bool self_ok = state!=BUILDING;
for(Target *d: depends)
{
- // Avoid infinite recursion if a target repends on its own side effect
- if(find(side_effects.begin(), side_effects.end(), d)!=side_effects.end())
+ // Avoid infinite recursion if a target depends on its own side effect
+ if(any_equals(side_effects, d))
continue;
Target *tgt = d->get_buildable_target();
state = REBUILD;
rebuild_reason = reason;
- builder.get_logger().log("rebuild", format("Rebuilding %s: %s", name, reason));
+ builder.get_logger().log("rebuild", "Rebuilding %s: %s", name, reason);
signal_bubble_rebuild.emit();
}
return;
if(state==PREPARING)
{
- builder.get_logger().log("problems", format("Dependency cycle detected at %s", name));
+ builder.get_logger().log("problems", "Dependency cycle detected at %s", name);
problems.push_back("Dependency cycle detected");
state = BROKEN;
return;
}
state = PREPARING;
+ /* Prepare existing dependencies early, because their information may be
+ needed to find other dependencies. */
+ for(Target *d: depends)
+ d->prepare();
if(tool)
tool->prepare();
broken |= (component && !component->get_problems().empty());
}
+ /* Now that all dependencies are known, prepare them again. This will do
+ nothing to already prepared targets. */
for(Target *d: depends)
{
d->prepare();