CMake/Source/cmConfigureFileCommand.cxx

154 lines
4.2 KiB
C++
Raw Normal View History

2001-04-27 22:25:42 +04:00
/*=========================================================================
Program: CMake - Cross-Platform Makefile Generator
2001-04-27 22:25:42 +04:00
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
2001-04-27 22:25:42 +04:00
2002-01-21 23:30:43 +03:00
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
2001-04-27 22:25:42 +04:00
=========================================================================*/
2001-05-08 02:11:16 +04:00
#include "cmConfigureFileCommand.h"
2001-04-27 22:25:42 +04:00
2001-05-08 02:11:16 +04:00
// cmConfigureFileCommand
bool cmConfigureFileCommand::InitialPass(std::vector<std::string> const& args)
2001-04-27 22:25:42 +04:00
{
2001-05-08 02:11:16 +04:00
if(args.size() < 2 )
2001-04-27 22:25:42 +04:00
{
this->SetError("called with incorrect number of arguments, expected 2");
return false;
}
m_InputFile = args[0];
m_OuputFile = args[1];
2001-05-08 02:11:16 +04:00
m_CopyOnly = false;
2001-06-22 19:15:18 +04:00
m_EscapeQuotes = false;
m_Immediate = false;
m_AtOnly = false;
for(unsigned int i=2;i < args.size();++i)
2001-05-08 02:11:16 +04:00
{
if(args[i] == "COPYONLY")
2001-05-09 17:52:21 +04:00
{
m_CopyOnly = true;
2001-05-09 17:52:21 +04:00
}
else if(args[i] == "ESCAPE_QUOTES")
2001-06-22 19:15:18 +04:00
{
m_EscapeQuotes = true;
2001-06-22 19:15:18 +04:00
}
else if(args[i] == "@ONLY")
{
m_AtOnly = true;
}
else if(args[i] == "IMMEDIATE")
2001-06-22 19:15:18 +04:00
{
m_Immediate = true;
2001-06-22 19:15:18 +04:00
}
2001-05-08 02:11:16 +04:00
}
// If we were told to copy the file immediately, then do it on the
// first pass (now).
if(m_Immediate)
{
this->ConfigureFile();
}
2001-04-27 22:25:42 +04:00
return true;
}
2001-05-08 02:11:16 +04:00
void cmConfigureFileCommand::FinalPass()
{
if(!m_Immediate)
{
this->ConfigureFile();
}
}
void cmConfigureFileCommand::ConfigureFile()
2001-04-27 22:25:42 +04:00
{
m_Makefile->AddCMakeDependFile(m_InputFile.c_str());
2001-04-27 22:25:42 +04:00
cmSystemTools::ConvertToUnixSlashes(m_OuputFile);
std::string::size_type pos = m_OuputFile.rfind('/');
if(pos != std::string::npos)
{
std::string path = m_OuputFile.substr(0, pos);
cmSystemTools::MakeDirectory(path.c_str());
}
2001-06-30 00:46:28 +04:00
if(m_CopyOnly)
2001-04-27 22:25:42 +04:00
{
2001-06-30 00:46:28 +04:00
cmSystemTools::CopyFileIfDifferent(m_InputFile.c_str(),
m_OuputFile.c_str());
2001-04-27 22:25:42 +04:00
}
2001-06-30 00:46:28 +04:00
else
2001-04-27 22:25:42 +04:00
{
2001-06-30 00:46:28 +04:00
std::string tempOutputFile = m_OuputFile;
tempOutputFile += ".tmp";
std::ofstream fout(tempOutputFile.c_str());
if(!fout)
{
2002-01-11 00:22:14 +03:00
cmSystemTools::Error("Could not open file for write in copy operatation ",
2001-06-30 00:46:28 +04:00
tempOutputFile.c_str());
return;
}
std::ifstream fin(m_InputFile.c_str());
if(!fin)
{
2002-01-11 00:22:14 +03:00
cmSystemTools::Error("Could not open file for read in copy operatation ",
2001-06-30 00:46:28 +04:00
m_InputFile.c_str());
return;
}
// now copy input to output and expand varibles in the
// input file at the same time
const int bufSize = 4096;
char buffer[bufSize];
std::string inLine;
cmRegularExpression cmdefine("#cmakedefine[ \t]*([A-Za-z_0-9]*)");
while(fin)
2001-04-27 22:25:42 +04:00
{
2001-06-30 00:46:28 +04:00
fin.getline(buffer, bufSize);
if(fin)
2001-05-03 18:35:15 +04:00
{
2001-06-30 00:46:28 +04:00
inLine = buffer;
m_Makefile->ExpandVariablesInString(inLine, m_EscapeQuotes, m_AtOnly);
m_Makefile->RemoveVariablesInString(inLine, m_AtOnly);
2001-05-08 02:11:16 +04:00
// look for special cmakedefine symbol and handle it
// is the symbol defined
if (cmdefine.find(inLine))
2001-05-03 18:35:15 +04:00
{
2001-05-08 02:11:16 +04:00
const char *def = m_Makefile->GetDefinition(cmdefine.match(1).c_str());
if(!cmSystemTools::IsOff(def))
{
cmSystemTools::ReplaceString(inLine,
"#cmakedefine", "#define");
fout << inLine << "\n";
2001-05-08 02:11:16 +04:00
}
else
{
cmSystemTools::ReplaceString(inLine,
"#cmakedefine", "#undef");
fout << "/* " << inLine << " */\n";
2001-05-08 02:11:16 +04:00
}
2001-05-03 18:35:15 +04:00
}
else
{
fout << inLine << "\n";
}
2001-05-03 18:35:15 +04:00
}
2001-04-27 22:25:42 +04:00
}
2001-06-30 00:46:28 +04:00
// close the files before attempting to copy
fin.close();
fout.close();
cmSystemTools::CopyFileIfDifferent(tempOutputFile.c_str(),
m_OuputFile.c_str());
cmSystemTools::RemoveFile(tempOutputFile.c_str());
2001-04-27 22:25:42 +04:00
}
}