#pragma once #include #include #include #include #include #include #include #include "compdb.h" class DepNode { public: virtual ~DepNode() = default; const std::vector> &children() { return deps_; } void addChild(std::shared_ptr node); bool hasChanged(const std::string &outDir); void startBuild(const std::string &outDir); void joinBuild(); void writeCompDB(const std::string &outDir, compdb::Writer &w); virtual std::vector publicLDFlags(const std::string &outDir); virtual std::vector publicLDLibs(const std::string &outDir); virtual std::vector publicObjects(const std::string &outDir); protected: enum class TriState { UNKNOWN, FALSE, TRUE, }; virtual bool checkHasChanged(const std::string &outDir) = 0; virtual void doBuild(const std::string &outDir) = 0; virtual void doWriteCompDB(const std::string &outDir, compdb::Writer &w) {} virtual std::vector getPublicLDFlags(const std::string &outDir) { return {}; } virtual std::vector getPublicLDLibs(const std::string &outDir) { return {}; } virtual std::vector getPublicObjects(const std::string &outDir) { return {}; } TriState has_changed_ = TriState::UNKNOWN; bool build_complete_ = false; bool build_started_ = false; std::mutex mut_; std::condition_variable build_cond_; std::vector> deps_; };