cmCTestMemCheckCommand.cxx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmCTestMemCheckCommand.h"
  4. #include <utility>
  5. #include <cm/memory>
  6. #include <cmext/string_view>
  7. #include "cmArgumentParser.h"
  8. #include "cmCTest.h"
  9. #include "cmCTestMemCheckHandler.h"
  10. #include "cmCTestTestHandler.h"
  11. #include "cmCommand.h"
  12. #include "cmExecutionStatus.h"
  13. #include "cmMakefile.h"
  14. std::unique_ptr<cmCommand> cmCTestMemCheckCommand::Clone()
  15. {
  16. auto ni = cm::make_unique<cmCTestMemCheckCommand>();
  17. ni->CTest = this->CTest;
  18. return std::unique_ptr<cmCommand>(std::move(ni));
  19. }
  20. std::unique_ptr<cmCTestTestHandler>
  21. cmCTestMemCheckCommand::InitializeActualHandler(
  22. HandlerArguments& args, cmExecutionStatus& status) const
  23. {
  24. cmMakefile& mf = status.GetMakefile();
  25. auto handler = cm::make_unique<cmCTestMemCheckHandler>(this->CTest);
  26. this->CTest->SetCTestConfigurationFromCMakeVariable(
  27. &mf, "MemoryCheckType", "CTEST_MEMORYCHECK_TYPE", args.Quiet);
  28. this->CTest->SetCTestConfigurationFromCMakeVariable(
  29. &mf, "MemoryCheckSanitizerOptions", "CTEST_MEMORYCHECK_SANITIZER_OPTIONS",
  30. args.Quiet);
  31. this->CTest->SetCTestConfigurationFromCMakeVariable(
  32. &mf, "MemoryCheckCommand", "CTEST_MEMORYCHECK_COMMAND", args.Quiet);
  33. this->CTest->SetCTestConfigurationFromCMakeVariable(
  34. &mf, "MemoryCheckCommandOptions", "CTEST_MEMORYCHECK_COMMAND_OPTIONS",
  35. args.Quiet);
  36. this->CTest->SetCTestConfigurationFromCMakeVariable(
  37. &mf, "MemoryCheckSuppressionFile", "CTEST_MEMORYCHECK_SUPPRESSIONS_FILE",
  38. args.Quiet);
  39. handler->SetQuiet(args.Quiet);
  40. return std::unique_ptr<cmCTestTestHandler>(std::move(handler));
  41. }
  42. void cmCTestMemCheckCommand::ProcessAdditionalValues(
  43. cmCTestGenericHandler* handler, HandlerArguments const& arguments,
  44. cmExecutionStatus& status) const
  45. {
  46. cmMakefile& mf = status.GetMakefile();
  47. auto const& args = static_cast<MemCheckArguments const&>(arguments);
  48. if (!args.DefectCount.empty()) {
  49. mf.AddDefinition(
  50. args.DefectCount,
  51. std::to_string(
  52. static_cast<cmCTestMemCheckHandler*>(handler)->GetDefectCount()));
  53. }
  54. }
  55. bool cmCTestMemCheckCommand::InitialPass(std::vector<std::string> const& args,
  56. cmExecutionStatus& status)
  57. {
  58. static auto const parser =
  59. cmArgumentParser<MemCheckArguments>{ MakeTestParser<MemCheckArguments>() }
  60. .Bind("DEFECT_COUNT"_s, &MemCheckArguments::DefectCount);
  61. return this->Invoke(parser, args, status, [&](MemCheckArguments& a) {
  62. return this->ExecuteHandlerCommand(a, status);
  63. });
  64. }