/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file LICENSE.rst or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include #include #include #include #include #include #include "cmInstrumentationQuery.h" class cmInstrumentation { public: cmInstrumentation(std::string const& binary_dir); int InstrumentCommand( std::string command_type, std::vector const& command, std::function const& callback, cm::optional> options = cm::nullopt, cm::optional> arrayOptions = cm::nullopt, bool reloadQueriesAfterCommand = false); std::string InstrumentTest(std::string const& name, std::string const& command, std::vector const& args, int64_t result, std::chrono::steady_clock::time_point steadyStart, std::chrono::system_clock::time_point systemStart, std::string config); void GetPreTestStats(); void LoadQueries(); bool HasQuery() const; bool HasQuery(cmInstrumentationQuery::Query) const; bool HasHook(cmInstrumentationQuery::Hook) const; bool HasPreOrPostBuildHook() const; bool ReadJSONQueries(std::string const& directory); void ReadJSONQuery(std::string const& file); void WriteJSONQuery(std::set const& queries, std::set const& hooks, std::vector> const& callback); void ClearGeneratedQueries(); int CollectTimingData(cmInstrumentationQuery::Hook hook); int SpawnBuildDaemon(); int CollectTimingAfterBuild(int ppid); void AddHook(cmInstrumentationQuery::Hook hook); void AddQuery(cmInstrumentationQuery::Query query); bool HasErrors() const; std::string const& GetCDashDir(); private: void WriteInstrumentationJson(Json::Value& index, std::string const& directory, std::string const& file_name); static void InsertStaticSystemInformation(Json::Value& index); static void GetDynamicSystemInformation(double& memory, double& load); static void InsertDynamicSystemInformation(Json::Value& index, std::string const& instant); static void InsertTimingData( Json::Value& root, std::chrono::steady_clock::time_point steadyStart, std::chrono::system_clock::time_point systemStart); bool HasQueryFile(std::string const& file); static std::string GetCommandStr(std::vector const& args); static std::string ComputeSuffixHash(std::string const& command_str); static std::string ComputeSuffixTime(); void PrepareDataForCDash(std::string const& data_dir, std::string const& index_path); std::string binaryDir; std::string timingDirv1; std::string userTimingDirv1; std::string cdashDir; std::set queries; std::set hooks; std::vector callbacks; std::vector queryFiles; std::map cdashSnippetsMap; Json::Value preTestStats; std::string errorMsg; bool hasQuery = false; };