| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #include "cmConfigureFileCommand.h" |
| |
| #include <sstream> |
| |
| #include "cmMakefile.h" |
| #include "cmSystemTools.h" |
| #include "cmake.h" |
| |
| class cmExecutionStatus; |
| |
| // cmConfigureFileCommand |
| bool cmConfigureFileCommand::InitialPass(std::vector<std::string> const& args, |
| cmExecutionStatus&) |
| { |
| if (args.size() < 2) { |
| this->SetError("called with incorrect number of arguments, expected 2"); |
| return false; |
| } |
| |
| std::string const& inFile = args[0]; |
| this->InputFile = cmSystemTools::CollapseFullPath( |
| inFile, this->Makefile->GetCurrentSourceDirectory()); |
| |
| // If the input location is a directory, error out. |
| if (cmSystemTools::FileIsDirectory(this->InputFile)) { |
| std::ostringstream e; |
| /* clang-format off */ |
| e << "input location\n" |
| << " " << this->InputFile << "\n" |
| << "is a directory but a file was expected."; |
| /* clang-format on */ |
| this->SetError(e.str()); |
| return false; |
| } |
| |
| std::string const& outFile = args[1]; |
| this->OutputFile = cmSystemTools::CollapseFullPath( |
| outFile, this->Makefile->GetCurrentBinaryDirectory()); |
| |
| // If the output location is already a directory put the file in it. |
| if (cmSystemTools::FileIsDirectory(this->OutputFile)) { |
| this->OutputFile += "/"; |
| this->OutputFile += cmSystemTools::GetFilenameName(inFile); |
| } |
| |
| if (!this->Makefile->CanIWriteThisFile(this->OutputFile)) { |
| std::string e = "attempted to configure a file: " + this->OutputFile + |
| " into a source directory."; |
| this->SetError(e); |
| cmSystemTools::SetFatalErrorOccured(); |
| return false; |
| } |
| std::string errorMessage; |
| if (!this->NewLineStyle.ReadFromArguments(args, errorMessage)) { |
| this->SetError(errorMessage); |
| return false; |
| } |
| this->CopyOnly = false; |
| this->EscapeQuotes = false; |
| |
| std::string unknown_args; |
| this->AtOnly = false; |
| for (unsigned int i = 2; i < args.size(); ++i) { |
| if (args[i] == "COPYONLY") { |
| this->CopyOnly = true; |
| if (this->NewLineStyle.IsValid()) { |
| this->SetError("COPYONLY could not be used in combination " |
| "with NEWLINE_STYLE"); |
| return false; |
| } |
| } else if (args[i] == "ESCAPE_QUOTES") { |
| this->EscapeQuotes = true; |
| } else if (args[i] == "@ONLY") { |
| this->AtOnly = true; |
| } else if (args[i] == "IMMEDIATE") { |
| /* Ignore legacy option. */ |
| } else if (args[i] == "NEWLINE_STYLE" || args[i] == "LF" || |
| args[i] == "UNIX" || args[i] == "CRLF" || args[i] == "WIN32" || |
| args[i] == "DOS") { |
| /* Options handled by NewLineStyle member above. */ |
| } else { |
| unknown_args += " "; |
| unknown_args += args[i]; |
| unknown_args += "\n"; |
| } |
| } |
| if (!unknown_args.empty()) { |
| std::string msg = "configure_file called with unknown argument(s):\n"; |
| msg += unknown_args; |
| this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, msg); |
| } |
| |
| if (!this->ConfigureFile()) { |
| this->SetError("Problem configuring file"); |
| return false; |
| } |
| |
| return true; |
| } |
| |
| int cmConfigureFileCommand::ConfigureFile() |
| { |
| return this->Makefile->ConfigureFile( |
| this->InputFile.c_str(), this->OutputFile.c_str(), this->CopyOnly, |
| this->AtOnly, this->EscapeQuotes, this->NewLineStyle); |
| } |