static bool MakeDirectoriesRecursive(StatCache* stat_cache, const PathBuffer& dir) { PathBuffer parent_dir = dir; PathStripLast(&parent_dir); // Can't go any higher. if (dir == parent_dir) return true; if (!MakeDirectoriesRecursive(stat_cache, parent_dir)) return false; char path[kMaxPathLength]; PathFormat(path, &dir); FileInfo info = StatCacheStat(stat_cache, path); if (info.Exists()) { // Just asssume this is a directory. We could check it - but there's currently no way via _stat64() calls // on Windows to check if a file is a symbolic link (to a directory). return true; } else { Log(kSpam, "create dir \"%s\"", path); bool success = MakeDirectory(path); StatCacheMarkDirty(stat_cache, path, Djb2HashPath(path)); return success; } }
FileInfo FileSourceUnion::Lookup(const std::string &path) { for (std::vector<FileSource*>::const_iterator it = m_sources.begin(); it != m_sources.end(); ++it) { FileInfo info = (*it)->Lookup(path); if (info.Exists()) { return info; } } return MakeFileInfo(path, FileInfo::FT_NON_EXISTENT); }
static bool OutputFilesMissing(StatCache* stat_cache, const NodeData* node) { for (const FrozenFileAndHash& f : node->m_OutputFiles) { FileInfo i = StatCacheStat(stat_cache, f.m_Filename, f.m_Hash); if (!i.Exists()) return true; } return false; }