diff --git a/Help/manual/cmake-configure-log.7.rst b/Help/manual/cmake-configure-log.7.rst index 2cf7580ad4..43513af63a 100644 --- a/Help/manual/cmake-configure-log.7.rst +++ b/Help/manual/cmake-configure-log.7.rst @@ -334,3 +334,110 @@ documented by the `try_compile-v1 event`_, plus: An optional key that is present when the test project built successfully. Its value is an integer specifying the exit code, or a string containing an error message, from trying to run the test executable. + +.. _`find configure-log event`: + +Event Kind ``find`` +------------------- + +The :command:`find_file`, :command:`find_path`, :command:`find_library`, and +:command:`find_program` commands log ``find`` events. + +There is only one ``find`` event major version, version 1. + +.. _`find-v1 event`: + +``find-v1`` Event +^^^^^^^^^^^^^^^^^ + +.. versionadded:: 4.1 + +A ``find-v1`` event is a YAML mapping: + +.. code-block:: yaml + + kind: "find-v1" + backtrace: + - "CMakeLists.txt:456 (find_program)" + mode: "program" + variable: "PROGRAM_PATH" + description: "Docstring for variable" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "name1" + - "name2" + candidate_directories: + - "/path/to/search" + - "/other/path/to/search" + - "/path/to/found" + - "/further/path/to/search" + searched_directories: + - "/path/to/search" + - "/other/path/to/search" + found: "/path/to/found/program" + +The keys specific to ``find-v1`` mappings are: + +``mode`` + A string describing the command using the search performed. One of ``file``, + ``path``, ``program``, or ``library``. + +``variable`` + The variable to which the search stored its result. + +``description`` + The documentation string of the variable. + +``settings`` + Search settings active for the search. + + ``SearchFramework`` + A string describing how framework search is performed. One of ``FIRST``, + ``LAST``, ``ONLY``, or ``NEVER``. See :variable:`CMAKE_FIND_FRAMEWORK`. + + ``SearchAppBundle`` + A string describing how application bundle search is performed. One of + ``FIRST``, ``LAST``, ``ONLY``, or ``NEVER``. See + :variable:`CMAKE_FIND_APPBUNDLE`. + + ``CMAKE_FIND_USE_CMAKE_PATH`` + A boolean indicating whether or not CMake-specific cache variables are + used when searching. See :variable:`CMAKE_FIND_USE_CMAKE_PATH`. + + ``CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH`` + A boolean indicating whether or not CMake-specific environment variables + are used when searching. See + :variable:`CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH`. + + ``CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH`` + A boolean indicating whether or not platform-specific environment + variables are used when searching. See + :variable:`CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH`. + + ``CMAKE_FIND_USE_CMAKE_SYSTEM_PATH`` + A boolean indicating whether or not platform-specific CMake variables are + used when searching. See :variable:`CMAKE_FIND_USE_CMAKE_SYSTEM_PATH`. + + ``CMAKE_FIND_USE_INSTALL_PREFIX`` + A boolean indicating whether or not the install prefix is used when + searching. See :variable:`CMAKE_FIND_USE_INSTALL_PREFIX`. + +``names`` + The names to look for the queries. + +``candidate_directories`` + Candidate directories, in order, to look in during the search. + +``searched_directories`` + Directories, in order, looked at during the search process. + +``found`` + Either a string representing the found value or ``false`` if it was not + found. diff --git a/Help/release/dev/configure-log-find-v1.rst b/Help/release/dev/configure-log-find-v1.rst new file mode 100644 index 0000000000..a898057732 --- /dev/null +++ b/Help/release/dev/configure-log-find-v1.rst @@ -0,0 +1,7 @@ +configure-log-find-v1 +--------------------- + +* The :ref:`find configure-log event` ``find-v1`` has been added to + :manual:`cmake-configure-log(7)` to track calls to the :command:`find_file`, + :command:`find_path`, :command:`find_library`, and :command:`find_program` + commands. diff --git a/Source/cmFileAPIConfigureLog.cxx b/Source/cmFileAPIConfigureLog.cxx index 8870d77449..8c571aaf1b 100644 --- a/Source/cmFileAPIConfigureLog.cxx +++ b/Source/cmFileAPIConfigureLog.cxx @@ -55,6 +55,7 @@ Json::Value ConfigureLog::DumpEventKindNames() eventKindNames.append("message-v1"); // WriteMessageEvent eventKindNames.append("try_compile-v1"); // WriteTryCompileEvent eventKindNames.append("try_run-v1"); // WriteTryRunEvent + eventKindNames.append("find-v1"); // WriteFindBaseEvent } return eventKindNames; } diff --git a/Source/cmFindBase.cxx b/Source/cmFindBase.cxx index f9d5d7da42..0f49b6c356 100644 --- a/Source/cmFindBase.cxx +++ b/Source/cmFindBase.cxx @@ -14,6 +14,7 @@ #include #include "cmCMakePath.h" +#include "cmConfigureLog.h" #include "cmExecutionStatus.h" #include "cmList.h" #include "cmListFileCache.h" @@ -642,6 +643,24 @@ cmFindBaseDebugState::cmFindBaseDebugState(std::string commandName, cmFindBaseDebugState::~cmFindBaseDebugState() { + bool found = !this->FoundSearchLocation.path.empty(); + +#ifndef CMAKE_BOOTSTRAP + // Write find event to the configure log if the log exists + if (cmConfigureLog* log = + this->FindCommand->Makefile->GetCMakeInstance()->GetConfigureLog()) { + // Write event if any of: + // - debug mode is enabled + // - the variable was not defined (first run) + // - the variable found state does not match the new found state (state + // transition) + if (this->FindCommand->DebugMode || !this->FindCommand->IsDefined() || + this->FindCommand->IsFound() != found) { + this->WriteFindEvent(*log, *this->FindCommand->Makefile); + } + } +#endif + if (!this->FindCommand->DebugMode) { return; } @@ -690,7 +709,7 @@ cmFindBaseDebugState::~cmFindBaseDebugState() buffer += cmStrCat(path, '\n'); } - if (!this->FoundSearchLocation.path.empty()) { + if (found) { buffer += cmStrCat("The item was found at\n ", this->FoundSearchLocation.path, '\n'); } else { @@ -703,7 +722,7 @@ cmFindBaseDebugState::~cmFindBaseDebugState() void cmFindBaseDebugState::FoundAt(std::string const& path, std::string regexName) { - if (this->FindCommand->DebugMode) { + if (this->TrackSearchProgress()) { this->FoundSearchLocation = DebugLibState{ std::move(regexName), path }; } } @@ -711,7 +730,74 @@ void cmFindBaseDebugState::FoundAt(std::string const& path, void cmFindBaseDebugState::FailedAt(std::string const& path, std::string regexName) { - if (this->FindCommand->DebugMode) { + if (this->TrackSearchProgress()) { this->FailedSearchLocations.emplace_back(std::move(regexName), path); } } + +#ifndef CMAKE_BOOTSTRAP +void cmFindBaseDebugState::WriteFindEvent(cmConfigureLog& log, + cmMakefile const& mf) const +{ + log.BeginEvent("find-v1", mf); + + // Mode is the Command name without the "find_" prefix + log.WriteValue("mode"_s, this->CommandName.substr(5)); + log.WriteValue("variable"_s, this->FindCommand->VariableName); + log.WriteValue("description"_s, this->FindCommand->VariableDocumentation); + + // Yes, this needs to return a `std::string`. If it returns a `const char*`, + // the `WriteValue` method prefers the `bool` overload. There's no overload + // for a `cm::string_view` because the underlying JSON library doesn't + // support `string_view` arguments itself. + auto search_opt_to_str = [](bool first, bool last, + bool only) -> std::string { + return first ? "FIRST" : (last ? "LAST" : (only ? "ONLY" : "NEVER")); + }; + log.BeginObject("settings"_s); + log.WriteValue("SearchFramework"_s, + search_opt_to_str(this->FindCommand->SearchFrameworkFirst, + this->FindCommand->SearchFrameworkLast, + this->FindCommand->SearchFrameworkOnly)); + log.WriteValue("SearchAppBundle"_s, + search_opt_to_str(this->FindCommand->SearchAppBundleFirst, + this->FindCommand->SearchAppBundleLast, + this->FindCommand->SearchAppBundleOnly)); + log.WriteValue("CMAKE_FIND_USE_CMAKE_PATH"_s, + !this->FindCommand->NoCMakePath); + log.WriteValue("CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH"_s, + !this->FindCommand->NoCMakeEnvironmentPath); + log.WriteValue("CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH"_s, + !this->FindCommand->NoSystemEnvironmentPath); + log.WriteValue("CMAKE_FIND_USE_CMAKE_SYSTEM_PATH"_s, + !this->FindCommand->NoCMakeSystemPath); + log.WriteValue("CMAKE_FIND_USE_INSTALL_PREFIX"_s, + !this->FindCommand->NoCMakeInstallPath); + log.EndObject(); + + log.WriteValue("names"_s, this->FindCommand->Names); + std::vector directories; + directories.reserve(this->FailedSearchLocations.size()); + for (auto const& location : this->FailedSearchLocations) { + directories.push_back(location.path); + } + log.WriteValue("candidate_directories"_s, this->FindCommand->SearchPaths); + log.WriteValue("searched_directories"_s, directories); + if (!this->FoundSearchLocation.path.empty()) { + log.WriteValue("found"_s, this->FoundSearchLocation.path); + } else { + log.WriteValue("found"_s, false); + } + log.EndEvent(); +} +#endif + +bool cmFindBaseDebugState::TrackSearchProgress() const +{ + // Track search progress if debugging or logging the configure. + return this->FindCommand->DebugMode +#ifndef CMAKE_BOOTSTRAP + || this->FindCommand->Makefile->GetCMakeInstance()->GetConfigureLog() +#endif + ; +} diff --git a/Source/cmFindBase.h b/Source/cmFindBase.h index a14e32f08a..092ed3489d 100644 --- a/Source/cmFindBase.h +++ b/Source/cmFindBase.h @@ -11,7 +11,9 @@ #include "cmFindCommon.h" #include "cmStateTypes.h" +class cmConfigureLog; class cmExecutionStatus; +class cmMakefile; /** \class cmFindBase * \brief Base class for most FIND_XXX commands. @@ -113,8 +115,13 @@ private: std::string path; }; +#ifndef CMAKE_BOOTSTRAP + void WriteFindEvent(cmConfigureLog& log, cmMakefile const& mf) const; +#endif + cmFindBase const* FindCommand; std::string CommandName; + bool TrackSearchProgress() const; std::vector FailedSearchLocations; DebugLibState FoundSearchLocation; }; diff --git a/Tests/RunCMake/FileAPI/FailConfigure-check.py b/Tests/RunCMake/FileAPI/FailConfigure-check.py index a1531d95a1..7c57db938e 100644 --- a/Tests/RunCMake/FileAPI/FailConfigure-check.py +++ b/Tests/RunCMake/FileAPI/FailConfigure-check.py @@ -65,7 +65,7 @@ def check_object_configureLog(o): assert os.path.exists(path) eventKindNames = o["eventKindNames"] assert is_list(eventKindNames) - assert sorted(eventKindNames) == ["message-v1", "try_compile-v1", "try_run-v1"] + assert sorted(eventKindNames) == ["find-v1", "message-v1", "try_compile-v1", "try_run-v1"] assert is_dict(index) assert sorted(index.keys()) == ["cmake", "objects", "reply"] diff --git a/Tests/RunCMake/FileAPI/configureLog-v1-FailConfigure-check.py b/Tests/RunCMake/FileAPI/configureLog-v1-FailConfigure-check.py index 19041d8526..512b382ddb 100644 --- a/Tests/RunCMake/FileAPI/configureLog-v1-FailConfigure-check.py +++ b/Tests/RunCMake/FileAPI/configureLog-v1-FailConfigure-check.py @@ -45,7 +45,7 @@ def check_object_configureLog(o): assert os.path.exists(path) eventKindNames = o["eventKindNames"] assert is_list(eventKindNames) - assert sorted(eventKindNames) == ["message-v1", "try_compile-v1", "try_run-v1"] + assert sorted(eventKindNames) == ["find-v1", "message-v1", "try_compile-v1", "try_run-v1"] assert is_dict(index) assert sorted(index.keys()) == ["cmake", "objects", "reply"] diff --git a/Tests/RunCMake/FileAPI/configureLog-v1-check.py b/Tests/RunCMake/FileAPI/configureLog-v1-check.py index 05c7893bde..0be5262a90 100644 --- a/Tests/RunCMake/FileAPI/configureLog-v1-check.py +++ b/Tests/RunCMake/FileAPI/configureLog-v1-check.py @@ -14,7 +14,7 @@ def check_object_configureLog(o): assert os.path.exists(path) eventKindNames = o["eventKindNames"] assert is_list(eventKindNames) - assert sorted(eventKindNames) == ["message-v1", "try_compile-v1", "try_run-v1"] + assert sorted(eventKindNames) == ["find-v1", "message-v1", "try_compile-v1", "try_run-v1"] assert is_dict(index) assert sorted(index.keys()) == ["cmake", "objects", "reply"] diff --git a/Tests/RunCMake/FileAPI/configureLog-v1.cmake b/Tests/RunCMake/FileAPI/configureLog-v1.cmake index ee00d8553c..3335e141ca 100644 --- a/Tests/RunCMake/FileAPI/configureLog-v1.cmake +++ b/Tests/RunCMake/FileAPI/configureLog-v1.cmake @@ -2,3 +2,70 @@ enable_language(C) if(FAIL) message(FATAL_ERROR "Intentionally fail to configure") endif() + +find_file(find_file_var # first search + NAMES "configureLog-v1.cmake" + PATHS "${CMAKE_CURRENT_LIST_DIR}" + DOC "find_file search") +find_file(find_file_var # re-find (no log) + NAMES "configureLog-v1.cmake" + PATHS "${CMAKE_CURRENT_LIST_DIR}" + DOC "find_file search") +unset(find_file_var) +set(find_file_var "find_file_var-NOTFOUND" CACHE PATH "" FORCE) +find_file(find_file_var # not-found to found + NAMES "configureLog-v1.cmake" + PATHS "${CMAKE_CURRENT_LIST_DIR}" + DOC "find_file search") + +find_path(find_path_var # first search + NAMES "configureLog-v1.cmake" + PATHS "${CMAKE_CURRENT_LIST_DIR}" + DOC "find_path search") +find_path(find_path_var # re-find (no log) + NAMES "configureLog-v1.cmake" + PATHS "${CMAKE_CURRENT_LIST_DIR}" + DOC "find_path search") +unset(find_path_var) +set(find_path_var "find_path_var-NOTFOUND" CACHE PATH "" FORCE) +find_path(find_path_var # not-found to found + NAMES "configureLog-v1.cmake" + PATHS "${CMAKE_CURRENT_LIST_DIR}" + DOC "find_path search") + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}lib${CMAKE_SHARED_LIBRARY_SUFFIX}") +find_library(find_library_var # first search + NAMES "lib" + PATHS "${CMAKE_CURRENT_BINARY_DIR}" + DOC "find_library search") +find_library(find_library_var # re-find (no log) + NAMES "lib" + PATHS "${CMAKE_CURRENT_BINARY_DIR}" + DOC "find_library search") +unset(find_library_var) +set(find_library_var "find_library_var-NOTFOUND" CACHE PATH "" FORCE) +find_library(find_library_var # not-found to found + NAMES "lib" + PATHS "${CMAKE_CURRENT_BINARY_DIR}" + DOC "find_library search") + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/exe${CMAKE_EXECUTABLE_SUFFIX}" "") +file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/exe${CMAKE_EXECUTABLE_SUFFIX}" + FILE_PERMISSIONS + OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) +find_program(find_program_var # first search + NAMES "exe" + PATHS "${CMAKE_CURRENT_BINARY_DIR}" + DOC "find_program search") +find_program(find_program_var # re-find (no log) + NAMES "exe" + PATHS "${CMAKE_CURRENT_BINARY_DIR}" + DOC "find_program search") +unset(find_program_var) +set(find_program_var "find_program_var-NOTFOUND" CACHE PATH "" FORCE) +find_program(find_program_var # not-found to found + NAMES "exe" + PATHS "${CMAKE_CURRENT_BINARY_DIR}" + DOC "find_program search") diff --git a/Tests/RunCMake/try_compile/ConfigureLog-config.txt b/Tests/RunCMake/try_compile/ConfigureLog-config.txt index ef5c73e2a3..8c4f465e76 100644 --- a/Tests/RunCMake/try_compile/ConfigureLog-config.txt +++ b/Tests/RunCMake/try_compile/ConfigureLog-config.txt @@ -7,7 +7,23 @@ events:( - "[^"]+")+ message: \|( + [^ -]*)*)+ +]*)*| + - + kind: "find-v1" + backtrace:( + - "[^"]+")+ + mode: "[^"]*" + variable: "[^"]*" + description: "[^"]*" + settings:( + [A-Za-z_]+: (true|false|"(NEVER|ONLY|FIRST|LAST)"))+ + names:( + - "[^"]+")+ + candidate_directories:( + - "[^"]+")* + searched_directories:( + - "[^"]+")* + found: (false|"[^"]*"))+ - kind: "try_compile-v1" backtrace: @@ -34,7 +50,46 @@ events:( - "[^"]+")+ message: \|( + [^ -]*)*)* +]*)*| + - + kind: "find-v1" + backtrace:( + - "[^"]+")+ + mode: "[^"]*" + variable: "[^"]*" + description: "[^"]*" + settings:( + [A-Za-z_]+: (true|false|"(NEVER|ONLY|FIRST|LAST)"))+ + names:( + - "[^"]+")+ + candidate_directories:( + - "[^"]+")* + searched_directories:( + - "[^"]+")* + found: (false|"[^"]*"))+( + - + kind: "try_compile-v1" + backtrace: + - ".*/Modules/Internal/FeatureTesting.cmake:[0-9]+ \(try_compile\)" + - ".*/Modules/Internal/FeatureTesting.cmake:[0-9]+ \(_record_compiler_features\)" + - ".*/Modules/Compiler/CMakeCommonCompilerMacros.cmake:[0-9]+ \(_record_compiler_features_c\)" + - ".*/Modules/CMakeDetermineCompilerSupport.cmake:[0-9]+ \(cmake_record_c_compile_features\)" + - ".*/Modules/CMakeTestCCompiler.cmake:[0-9]+ \(CMAKE_DETERMINE_COMPILER_SUPPORT\)" + - "ConfigureLog.cmake:[0-9]+ \(enable_language\)" + - "CMakeLists.txt:[0-9]+ \(include\)" + checks: + - "Detecting C compile features" + directories: + source: "[^"]*/Tests/RunCMake/try_compile/ConfigureLog-build/CMakeFiles/CMakeScratch/TryCompile-[^/"]+" + binary: "[^"]*/Tests/RunCMake/try_compile/ConfigureLog-build/CMakeFiles/CMakeScratch/TryCompile-[^/"]+" + cmakeVariables:( + CMAKE_[^ +]*)+ + buildResult: + variable: "CMAKE_C_FEATURE_TEST" + cached: true + stdout: \|.* + exitCode: 0)? - kind: "try_compile-v1" backtrace: diff --git a/Tests/RunCMake/try_compile/Inspect-config.txt b/Tests/RunCMake/try_compile/Inspect-config.txt index 44bd443307..9665baa62f 100644 --- a/Tests/RunCMake/try_compile/Inspect-config.txt +++ b/Tests/RunCMake/try_compile/Inspect-config.txt @@ -7,7 +7,23 @@ events:( - "[^"]+")+ message: \|( + [^ -]*)*)+ +]*)*| + - + kind: "find-v1" + backtrace:( + - "[^"]+")+ + mode: "[^"]*" + variable: "[^"]*" + description: "[^"]*" + settings:( + [A-Za-z_]+: (true|false|"(NEVER|ONLY|FIRST|LAST)"))+ + names:( + - "[^"]+")+ + candidate_directories:( + - "[^"]+")* + searched_directories:( + - "[^"]+")* + found: (false|"[^"]*"))+ - kind: "try_compile-v1" backtrace: @@ -34,7 +50,23 @@ events:( - "[^"]+")+ message: \|( + [^ -]*)*)+ +]*)*| + - + kind: "find-v1" + backtrace:( + - "[^"]+")+ + mode: "[^"]*" + variable: "[^"]*" + description: "[^"]*" + settings:( + [A-Za-z_]+: (true|false|"(NEVER|ONLY|FIRST|LAST)"))+ + names:( + - "[^"]+")+ + candidate_directories:( + - "[^"]+")* + searched_directories:( + - "[^"]+")* + found: (false|"[^"]*"))+ - kind: "try_compile-v1" backtrace: diff --git a/Tests/RunCMake/try_compile/SourceFromBadName-config.txt b/Tests/RunCMake/try_compile/SourceFromBadName-config.txt index cb76565c3a..3232d1cf03 100644 --- a/Tests/RunCMake/try_compile/SourceFromBadName-config.txt +++ b/Tests/RunCMake/try_compile/SourceFromBadName-config.txt @@ -7,5 +7,21 @@ events:( - "[^"]+")+ message: \|( + [^ -]*)*)+ +]*)*| + - + kind: "find-v1" + backtrace:( + - "[^"]+")+ + mode: "[^"]*" + variable: "[^"]*" + description: "[^"]*" + settings:( + [A-Za-z_]+: (true|false|"(NEVER|ONLY|FIRST|LAST)"))+ + names:( + - "[^"]+")+ + candidate_directories:( + - "[^"]+")* + searched_directories:( + - "[^"]+")* + found: (false|"[^"]*"))+ \.\.\.$ diff --git a/Tests/RunCMake/try_compile/TopIncludes-config.txt b/Tests/RunCMake/try_compile/TopIncludes-config.txt index 6bd9c90c32..99fa01d8ea 100644 --- a/Tests/RunCMake/try_compile/TopIncludes-config.txt +++ b/Tests/RunCMake/try_compile/TopIncludes-config.txt @@ -7,7 +7,23 @@ events:( - "[^"]+")+ message: \|( + [^ -]*)*)+ +]*)*| + - + kind: "find-v1" + backtrace:( + - "[^"]+")+ + mode: "[^"]*" + variable: "[^"]*" + description: "[^"]*" + settings:( + [A-Za-z_]+: (true|false|"(NEVER|ONLY|FIRST|LAST)"))+ + names:( + - "[^"]+")+ + candidate_directories:( + - "[^"]+")* + searched_directories:( + - "[^"]+")* + found: (false|"[^"]*"))+ - kind: "try_compile-v1" backtrace: @@ -34,7 +50,23 @@ events:( - "[^"]+")+ message: \|( + [^ -]*)*)* +]*)*| + - + kind: "find-v1" + backtrace:( + - "[^"]+")+ + mode: "[^"]*" + variable: "[^"]*" + description: "[^"]*" + settings:( + [A-Za-z_]+: (true|false|"(NEVER|ONLY|FIRST|LAST)"))+ + names:( + - "[^"]+")+ + candidate_directories:( + - "[^"]+")* + searched_directories:( + - "[^"]+")* + found: (false|"[^"]*"))* - kind: "try_compile-v1" backtrace: diff --git a/Tests/RunCMake/try_run/ConfigureLog-config.txt b/Tests/RunCMake/try_run/ConfigureLog-config.txt index e1d5fa77ad..8b15dec489 100644 --- a/Tests/RunCMake/try_run/ConfigureLog-config.txt +++ b/Tests/RunCMake/try_run/ConfigureLog-config.txt @@ -7,7 +7,23 @@ events:( - "[^"]+")+ message: \|( + [^ -]*)*)+ +]*)*| + - + kind: "find-v1" + backtrace:( + - "[^"]+")+ + mode: "[^"]*" + variable: "[^"]*" + description: "[^"]*" + settings:( + [A-Za-z_]+: (true|false|"(NEVER|ONLY|FIRST|LAST)"))+ + names:( + - "[^"]+")+ + candidate_directories:( + - "[^"]+")* + searched_directories:( + - "[^"]+")* + found: (false|"[^"]*"))+ - kind: "try_compile-v1" backtrace: @@ -33,7 +49,23 @@ events:( - "[^"]+")+ message: \|( + [^ -]*)*)* +]*)*| + - + kind: "find-v1" + backtrace:( + - "[^"]+")+ + mode: "[^"]*" + variable: "[^"]*" + description: "[^"]*" + settings:( + [A-Za-z_]+: (true|false|"(NEVER|ONLY|FIRST|LAST)"))+ + names:( + - "[^"]+")+ + candidate_directories:( + - "[^"]+")* + searched_directories:( + - "[^"]+")* + found: (false|"[^"]*"))* - kind: "try_run-v1" backtrace: