| 834 | } |
| 835 | |
| 836 | bool HandleMakeDirectoryCommand(std::vector<std::string> const& args, |
| 837 | cmExecutionStatus& status) |
| 838 | { |
| 839 | // Projects might pass a dynamically generated list of directories, and it |
| 840 | // could be an empty list. We should not assume there is at least one. |
| 841 | |
| 842 | cmRange<std::vector<std::string>::const_iterator> argsRange = |
| 843 | cmMakeRange(args).advance(1); // Get rid of subcommand |
| 844 | |
| 845 | struct Arguments : public ArgumentParser::ParseResult |
| 846 | { |
| 847 | std::string Result; |
| 848 | }; |
| 849 | Arguments arguments; |
| 850 | |
| 851 | auto resultPosItr = |
| 852 | std::find(cm::begin(argsRange), cm::end(argsRange), "RESULT"); |
| 853 | if (resultPosItr != cm::end(argsRange)) { |
| 854 | static auto const parser = |
| 855 | cmArgumentParser<Arguments>{}.Bind("RESULT"_s, &Arguments::Result); |
| 856 | std::vector<std::string> unparsedArguments; |
| 857 | auto resultDistanceFromBegin = |
| 858 | std::distance(cm::begin(argsRange), resultPosItr); |
| 859 | arguments = |
| 860 | parser.Parse(cmMakeRange(argsRange).advance(resultDistanceFromBegin), |
| 861 | &unparsedArguments); |
| 862 | |
| 863 | if (!unparsedArguments.empty()) { |
| 864 | std::string unexpectedArgsStr = cmJoin( |
| 865 | cmMakeRange(cm::begin(unparsedArguments), cm::end(unparsedArguments)), |
| 866 | "\n"); |
| 867 | status.SetError("MAKE_DIRECTORY called with unexpected\n" |
| 868 | "arguments:\n " + |
| 869 | unexpectedArgsStr); |
| 870 | return false; |
| 871 | } |
| 872 | |
| 873 | auto resultDistanceFromEnd = |
| 874 | std::distance(cm::end(argsRange), resultPosItr); |
| 875 | argsRange = argsRange.retreat(-resultDistanceFromEnd); |
| 876 | } |
| 877 | |
| 878 | std::string expr; |
| 879 | for (std::string const& arg : argsRange) { |
| 880 | std::string const* cdir = &arg; |
| 881 | if (!cmsys::SystemTools::FileIsFullPath(arg)) { |
| 882 | expr = |
| 883 | cmStrCat(status.GetMakefile().GetCurrentSourceDirectory(), '/', arg); |
| 884 | cdir = &expr; |
| 885 | } |
| 886 | if (!status.GetMakefile().CanIWriteThisFile(*cdir)) { |
| 887 | std::string e = cmStrCat("attempted to create a directory: ", *cdir, |
| 888 | " into a source directory."); |
| 889 | if (arguments.Result.empty()) { |
| 890 | status.SetError(e); |
| 891 | cmSystemTools::SetFatalErrorOccurred(); |
| 892 | return false; |
| 893 | } |
nothing calls this directly
no test coverage detected
searching dependent graphs…