MCPcopy Create free account
hub / github.com/Kitware/CMake / HandleMakeDirectoryCommand

Function HandleMakeDirectoryCommand

Source/cmFileCommand.cxx:836–916  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

834}
835
836bool 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 }

Callers

nothing calls this directly

Calls 14

cmMakeRangeFunction · 0.85
retreatMethod · 0.80
CanIWriteThisFileMethod · 0.80
cmJoinFunction · 0.70
cmStrCatFunction · 0.70
findFunction · 0.50
advanceMethod · 0.45
BindMethod · 0.45
ParseMethod · 0.45
emptyMethod · 0.45
SetErrorMethod · 0.45
GetMakefileMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…