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