Brad King | 86578ec | 2016-09-27 15:01:08 -0400 | [diff] [blame] | 1 | /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| 2 | file Copyright.txt or https://cmake.org/licensing for details. */ |
Bill Hoffman | 8a21493 | 2001-05-04 11:34:59 -0400 | [diff] [blame] | 3 | #include "cmBuildCommand.h" |
| 4 | |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 5 | #include "cmExecutionStatus.h" |
Andy Cedilnik | 1fff418 | 2005-04-29 12:50:29 -0400 | [diff] [blame] | 6 | #include "cmGlobalGenerator.h" |
Daniel Pfeifer | e81c323 | 2016-10-25 20:35:04 +0200 | [diff] [blame] | 7 | #include "cmMakefile.h" |
Bruno Manganelli | cc2a526 | 2018-11-22 03:36:50 +0000 | [diff] [blame] | 8 | #include "cmMessageType.h" |
Daniel Pfeifer | e81c323 | 2016-10-25 20:35:04 +0200 | [diff] [blame] | 9 | #include "cmStateTypes.h" |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 10 | #include "cmStringAlgorithms.h" |
Daniel Pfeifer | e81c323 | 2016-10-25 20:35:04 +0200 | [diff] [blame] | 11 | #include "cmSystemTools.h" |
Marc Chevrier | cc56dc7 | 2021-09-21 17:12:35 +0200 | [diff] [blame] | 12 | #include "cmValue.h" |
Daniel Pfeifer | e81c323 | 2016-10-25 20:35:04 +0200 | [diff] [blame] | 13 | |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 14 | namespace { |
Andy Cedilnik | 1fff418 | 2005-04-29 12:50:29 -0400 | [diff] [blame] | 15 | |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 16 | bool MainSignature(std::vector<std::string> const& args, |
| 17 | cmExecutionStatus& status) |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 18 | { |
Daniel Pfeifer | 73f648f | 2016-09-15 23:59:29 +0200 | [diff] [blame] | 19 | if (args.empty()) { |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 20 | status.SetError("requires at least one argument naming a CMake variable"); |
Bill Hoffman | 8a21493 | 2001-05-04 11:34:59 -0400 | [diff] [blame] | 21 | return false; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 22 | } |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 23 | |
| 24 | // The cmake variable in which to store the result. |
Pavel Solodovnikov | 86dc86d | 2017-05-24 23:18:28 +0300 | [diff] [blame] | 25 | std::string const& variable = args[0]; |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 26 | |
| 27 | // Parse remaining arguments. |
Dāvis Mosāns | b1f87a5 | 2016-07-08 00:54:05 +0300 | [diff] [blame] | 28 | std::string configuration; |
| 29 | std::string project_name; |
Ben Boeckel | fabf1fb | 2014-02-06 17:31:47 -0500 | [diff] [blame] | 30 | std::string target; |
friendlyanon | fc2ac46 | 2021-05-01 16:10:21 +0200 | [diff] [blame] | 31 | std::string parallel; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 32 | enum Doing |
| 33 | { |
| 34 | DoingNone, |
| 35 | DoingConfiguration, |
| 36 | DoingProjectName, |
friendlyanon | fc2ac46 | 2021-05-01 16:10:21 +0200 | [diff] [blame] | 37 | DoingTarget, |
| 38 | DoingParallel |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 39 | }; |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 40 | Doing doing = DoingNone; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 41 | for (unsigned int i = 1; i < args.size(); ++i) { |
| 42 | if (args[i] == "CONFIGURATION") { |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 43 | doing = DoingConfiguration; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 44 | } else if (args[i] == "PROJECT_NAME") { |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 45 | doing = DoingProjectName; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 46 | } else if (args[i] == "TARGET") { |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 47 | doing = DoingTarget; |
friendlyanon | fc2ac46 | 2021-05-01 16:10:21 +0200 | [diff] [blame] | 48 | } else if (args[i] == "PARALLEL_LEVEL") { |
| 49 | doing = DoingParallel; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 50 | } else if (doing == DoingConfiguration) { |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 51 | doing = DoingNone; |
Dāvis Mosāns | b1f87a5 | 2016-07-08 00:54:05 +0300 | [diff] [blame] | 52 | configuration = args[i]; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 53 | } else if (doing == DoingProjectName) { |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 54 | doing = DoingNone; |
Dāvis Mosāns | b1f87a5 | 2016-07-08 00:54:05 +0300 | [diff] [blame] | 55 | project_name = args[i]; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 56 | } else if (doing == DoingTarget) { |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 57 | doing = DoingNone; |
Ben Boeckel | fabf1fb | 2014-02-06 17:31:47 -0500 | [diff] [blame] | 58 | target = args[i]; |
friendlyanon | fc2ac46 | 2021-05-01 16:10:21 +0200 | [diff] [blame] | 59 | } else if (doing == DoingParallel) { |
| 60 | doing = DoingNone; |
| 61 | parallel = args[i]; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 62 | } else { |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 63 | status.SetError(cmStrCat("unknown argument \"", args[i], "\"")); |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 64 | return false; |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 65 | } |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 66 | } |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 67 | |
Brad King | bca67c7 | 2013-11-13 16:01:20 -0500 | [diff] [blame] | 68 | // If null/empty CONFIGURATION argument, cmake --build uses 'Debug' |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 69 | // in the currently implemented multi-configuration global generators... |
| 70 | // so we put this code here to end up with the same default configuration |
| 71 | // as the original 2-arg build_command signature: |
| 72 | // |
Dāvis Mosāns | b1f87a5 | 2016-07-08 00:54:05 +0300 | [diff] [blame] | 73 | if (configuration.empty()) { |
| 74 | cmSystemTools::GetEnv("CMAKE_CONFIG_TYPE", configuration); |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 75 | } |
Dāvis Mosāns | b1f87a5 | 2016-07-08 00:54:05 +0300 | [diff] [blame] | 76 | if (configuration.empty()) { |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 77 | configuration = "Release"; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 78 | } |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 79 | |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 80 | cmMakefile& mf = status.GetMakefile(); |
Dāvis Mosāns | b1f87a5 | 2016-07-08 00:54:05 +0300 | [diff] [blame] | 81 | if (!project_name.empty()) { |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 82 | mf.IssueMessage(MessageType::AUTHOR_WARNING, |
| 83 | "Ignoring PROJECT_NAME option because it has no effect."); |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 84 | } |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 85 | |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 86 | std::string makecommand = mf.GetGlobalGenerator()->GenerateCMakeBuildCommand( |
friendlyanon | fc2ac46 | 2021-05-01 16:10:21 +0200 | [diff] [blame] | 87 | target, configuration, parallel, "", mf.IgnoreErrorsCMP0061()); |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 88 | |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 89 | mf.AddDefinition(variable, makecommand); |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 90 | |
| 91 | return true; |
| 92 | } |
| 93 | |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 94 | bool TwoArgsSignature(std::vector<std::string> const& args, |
| 95 | cmExecutionStatus& status) |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 96 | { |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 97 | if (args.size() < 2) { |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 98 | status.SetError("called with less than two arguments"); |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 99 | return false; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 100 | } |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 101 | |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 102 | cmMakefile& mf = status.GetMakefile(); |
| 103 | |
Pavel Solodovnikov | 86dc86d | 2017-05-24 23:18:28 +0300 | [diff] [blame] | 104 | std::string const& define = args[0]; |
Marc Chevrier | cc56dc7 | 2021-09-21 17:12:35 +0200 | [diff] [blame] | 105 | cmValue cacheValue = mf.GetDefinition(define); |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 106 | |
Dāvis Mosāns | b1f87a5 | 2016-07-08 00:54:05 +0300 | [diff] [blame] | 107 | std::string configType; |
| 108 | if (!cmSystemTools::GetEnv("CMAKE_CONFIG_TYPE", configType) || |
| 109 | configType.empty()) { |
| 110 | configType = "Release"; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 111 | } |
David Cole | 0b38bb4 | 2009-12-04 12:09:01 -0500 | [diff] [blame] | 112 | |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 113 | std::string makecommand = mf.GetGlobalGenerator()->GenerateCMakeBuildCommand( |
friendlyanon | 4dd4e9d | 2021-05-01 16:05:19 +0200 | [diff] [blame] | 114 | "", configType, "", "", mf.IgnoreErrorsCMP0061()); |
Andy Cedilnik | 782bef7 | 2005-12-01 11:41:00 -0500 | [diff] [blame] | 115 | |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 116 | if (cacheValue) { |
Andy Cedilnik | 1fff418 | 2005-04-29 12:50:29 -0400 | [diff] [blame] | 117 | return true; |
Kitware Robot | d9fd2f5 | 2016-05-16 10:34:04 -0400 | [diff] [blame] | 118 | } |
Vitaly Stakhovsky | 36a5b3d | 2020-03-11 09:40:00 -0400 | [diff] [blame] | 119 | mf.AddCacheDefinition(define, makecommand, |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 120 | "Command used to build entire project " |
| 121 | "from the command line.", |
| 122 | cmStateEnums::STRING); |
Bill Hoffman | 8a21493 | 2001-05-04 11:34:59 -0400 | [diff] [blame] | 123 | return true; |
| 124 | } |
Regina Pfeifer | f0ecb12 | 2019-09-12 10:04:07 +0200 | [diff] [blame] | 125 | |
| 126 | } // namespace |
| 127 | |
| 128 | bool cmBuildCommand(std::vector<std::string> const& args, |
| 129 | cmExecutionStatus& status) |
| 130 | { |
| 131 | // Support the legacy signature of the command: |
| 132 | if (args.size() == 2) { |
| 133 | return TwoArgsSignature(args, status); |
| 134 | } |
| 135 | |
| 136 | return MainSignature(args, status); |
| 137 | } |