| /*============================================================================ |
| CMake - Cross Platform Makefile Generator |
| Copyright 2000-2009 Kitware, Inc., Insight Software Consortium |
| |
| Distributed under the OSI-approved BSD License (the "License"); |
| see accompanying file Copyright.txt for details. |
| |
| This software is distributed WITHOUT ANY WARRANTY; without even the |
| implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| See the License for more information. |
| ============================================================================*/ |
| #include "cmConfigureFileCommand.h" |
| |
| #include <cmsys/RegularExpression.hxx> |
| |
| // 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; |
| } |
| |
| const char* inFile = args[0].c_str(); |
| if(!cmSystemTools::FileIsFullPath(inFile)) |
| { |
| this->InputFile = this->Makefile->GetCurrentDirectory(); |
| this->InputFile += "/"; |
| } |
| this->InputFile += inFile; |
| |
| // If the input location is a directory, error out. |
| if(cmSystemTools::FileIsDirectory(this->InputFile.c_str())) |
| { |
| cmOStringStream e; |
| e << "input location\n" |
| << " " << this->InputFile << "\n" |
| << "is a directory but a file was expected."; |
| this->SetError(e.str().c_str()); |
| return false; |
| } |
| |
| const char* outFile = args[1].c_str(); |
| if(!cmSystemTools::FileIsFullPath(outFile)) |
| { |
| this->OutputFile = this->Makefile->GetCurrentOutputDirectory(); |
| this->OutputFile += "/"; |
| } |
| this->OutputFile += outFile; |
| |
| // If the output location is already a directory put the file in it. |
| if(cmSystemTools::FileIsDirectory(this->OutputFile.c_str())) |
| { |
| this->OutputFile += "/"; |
| this->OutputFile += cmSystemTools::GetFilenameName(inFile); |
| } |
| |
| if ( !this->Makefile->CanIWriteThisFile(this->OutputFile.c_str()) ) |
| { |
| std::string e = "attempted to configure a file: " + this->OutputFile |
| + " into a source directory."; |
| this->SetError(e.c_str()); |
| cmSystemTools::SetFatalErrorOccured(); |
| return false; |
| } |
| this->CopyOnly = false; |
| this->EscapeQuotes = false; |
| |
| // for CMake 2.0 and earlier CONFIGURE_FILE defaults to the FinalPass, |
| // after 2.0 it only does InitialPass |
| this->Immediate = !this->Makefile->NeedBackwardsCompatibility(2,0); |
| |
| this->AtOnly = false; |
| for(unsigned int i=2;i < args.size();++i) |
| { |
| if(args[i] == "COPYONLY") |
| { |
| this->CopyOnly = true; |
| } |
| else if(args[i] == "ESCAPE_QUOTES") |
| { |
| this->EscapeQuotes = true; |
| } |
| else if(args[i] == "@ONLY") |
| { |
| this->AtOnly = true; |
| } |
| else if(args[i] == "IMMEDIATE") |
| { |
| this->Immediate = true; |
| } |
| } |
| |
| // If we were told to copy the file immediately, then do it on the |
| // first pass (now). |
| if(this->Immediate) |
| { |
| if ( !this->ConfigureFile() ) |
| { |
| this->SetError("Problem configuring file"); |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| |
| void cmConfigureFileCommand::FinalPass() |
| { |
| if(!this->Immediate) |
| { |
| this->ConfigureFile(); |
| } |
| } |
| |
| int cmConfigureFileCommand::ConfigureFile() |
| { |
| return this->Makefile->ConfigureFile( |
| this->InputFile.c_str(), |
| this->OutputFile.c_str(), |
| this->CopyOnly, |
| this->AtOnly, |
| this->EscapeQuotes); |
| } |
| |
| |