cmBreakCommand.cxx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 "cmBreakCommand.h"
  4. #include "cmExecutionStatus.h"
  5. // cmBreakCommand
  6. bool cmBreakCommand::InitialPass(std::vector<std::string> const& args,
  7. cmExecutionStatus& status)
  8. {
  9. if (!this->Makefile->IsLoopBlock()) {
  10. bool issueMessage = true;
  11. std::ostringstream e;
  12. cmake::MessageType messageType = cmake::AUTHOR_WARNING;
  13. switch (this->Makefile->GetPolicyStatus(cmPolicies::CMP0055)) {
  14. case cmPolicies::WARN:
  15. e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0055) << "\n";
  16. break;
  17. case cmPolicies::OLD:
  18. issueMessage = false;
  19. break;
  20. case cmPolicies::REQUIRED_ALWAYS:
  21. case cmPolicies::REQUIRED_IF_USED:
  22. case cmPolicies::NEW:
  23. messageType = cmake::FATAL_ERROR;
  24. break;
  25. }
  26. if (issueMessage) {
  27. e << "A BREAK command was found outside of a proper "
  28. "FOREACH or WHILE loop scope.";
  29. this->Makefile->IssueMessage(messageType, e.str());
  30. if (messageType == cmake::FATAL_ERROR) {
  31. return false;
  32. }
  33. }
  34. }
  35. status.SetBreakInvoked(true);
  36. if (!args.empty()) {
  37. bool issueMessage = true;
  38. std::ostringstream e;
  39. cmake::MessageType messageType = cmake::AUTHOR_WARNING;
  40. switch (this->Makefile->GetPolicyStatus(cmPolicies::CMP0055)) {
  41. case cmPolicies::WARN:
  42. e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0055) << "\n";
  43. break;
  44. case cmPolicies::OLD:
  45. issueMessage = false;
  46. break;
  47. case cmPolicies::REQUIRED_ALWAYS:
  48. case cmPolicies::REQUIRED_IF_USED:
  49. case cmPolicies::NEW:
  50. messageType = cmake::FATAL_ERROR;
  51. break;
  52. }
  53. if (issueMessage) {
  54. e << "The BREAK command does not accept any arguments.";
  55. this->Makefile->IssueMessage(messageType, e.str());
  56. if (messageType == cmake::FATAL_ERROR) {
  57. return false;
  58. }
  59. }
  60. }
  61. return true;
  62. }