/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include #include #include "cmListFileCache.h" class cmMessenger; /** \class cmGlobVerificationManager * \brief Class for expressing build-time dependencies on glob expressions. * * Generates a CMake script which verifies glob outputs during prebuild. * */ class cmGlobVerificationManager { protected: //! Save verification script for given makefile. //! Saves to output //VerifyGlobs.cmake bool SaveVerificationScript(const std::string& path, cmMessenger* messenger); //! Add an entry into the glob cache void AddCacheEntry(bool recurse, bool listDirectories, bool followSymlinks, const std::string& relative, const std::string& expression, const std::vector& files, const std::string& variable, const cmListFileBacktrace& bt, cmMessenger* messenger); //! Clear the glob cache for state reset. void Reset(); //! Check targets should be written in generated build system. bool DoWriteVerifyTarget() const; //! Get the paths to the generated script and stamp files std::string const& GetVerifyScript() const { return this->VerifyScript; } std::string const& GetVerifyStamp() const { return this->VerifyStamp; } private: struct CacheEntryKey { const bool Recurse; const bool ListDirectories; const bool FollowSymlinks; const std::string Relative; const std::string Expression; CacheEntryKey(const bool rec, const bool l, const bool s, std::string rel, std::string e) : Recurse(rec) , ListDirectories(l) , FollowSymlinks(s) , Relative(std::move(rel)) , Expression(std::move(e)) { } bool operator<(const CacheEntryKey& r) const; void PrintGlobCommand(std::ostream& out, const std::string& cmdVar); }; struct CacheEntryValue { bool Initialized = false; std::vector Files; std::vector> Backtraces; }; using CacheEntryMap = std::map; CacheEntryMap Cache; std::string VerifyScript; std::string VerifyStamp; // Only cmState should be able to add cache values. // cmGlobVerificationManager should never be used directly. friend class cmState; // allow access to add cache values };