]> git.tdb.fi Git - builder.git/blobdiff - source/lib/target.h
Report which targets participate in a dependency cycle
[builder.git] / source / lib / target.h
index 6ef6457a0f5fe73d70ddc31d7f66b561e878b63b..1ae268cce54b5c7096c48aa6d9c8a7a665e50785 100644 (file)
@@ -6,7 +6,9 @@
 #include <string>
 #include <vector>
 #include <sigc++/signal.h>
+#include <msp/core/noncopyable.h>
 #include <msp/time/timestamp.h>
+#include "libbuilder_api.h"
 
 class Builder;
 class BuildInfo;
@@ -24,7 +26,7 @@ normal and transitive.  Normal dependencies will need to be built before the
 target itself, and will cause the target to be rebuilt if modified.  Transitive
 dependencies can be used by other targets further down the chain.
 */
-class Target
+class LIBBUILDER_API Target
 {
 public:
        using Dependencies = std::vector<Target *>;
@@ -40,6 +42,12 @@ protected:
                BROKEN
        };
 
+       struct PushPrepare: Msp::NonCopyable
+       {
+               PushPrepare(Target *t) { prepare_stack.push_back(t); }
+               ~PushPrepare() { prepare_stack.pop_back(); }
+       };
+
 public:
        sigc::signal<void> signal_bubble_rebuild;
        sigc::signal<void> signal_modified;
@@ -60,6 +68,8 @@ protected:
        Dependencies side_effects;
        Target *primary_target = 0;
 
+       static std::vector<Target *> prepare_stack;
+
        Target(Builder &, const std::string &);
 public:
        virtual ~Target() { }