/*============================================================================ 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 // cmConfigureFileCommand bool cmConfigureFileCommand ::InitialPass(std::vector 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; } std::string errorMessage; if (!this->NewLineStyle.ReadFromArguments(args, errorMessage)) { this->SetError(errorMessage.c_str()); 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; 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") { 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, this->NewLineStyle); }