CMake/Source/cmUnixMakefile.cxx

172 lines
4.1 KiB
C++

#include "cmUnixMakefile.h"
#include <fstream>
#include <iostream>
// Output the depend information for all the classes
// in the makefile.
void cmUnixMakefile::OutputDepends(std::ostream& fout)
{
for(int i = 0; i < m_Classes.size(); i++)
{
if(!m_Classes[i].m_AbstractClass && !m_Classes[i].m_HeaderFileOnly)
{
if( m_Classes[i].m_Depends.size())
{
fout << m_Classes[i].m_ClassName << ".o : \\\n";
for(std::vector<std::string>::iterator j =
m_Classes[i].m_Depends.begin();
j != m_Classes[i].m_Depends.end(); ++j)
{
if(j+1 == m_Classes[i].m_Depends.end())
{
fout << *j << " \n";
}
else
{
fout << *j << " \\\n";
}
}
fout << "\n\n";
}
}
}
}
// fix up names of directories so they can be used
// as targets in makefiles.
inline std::string FixDirectoryName(const char* dir)
{
std::string s = dir;
// replace ../ with 3 under bars
size_t pos = s.find("../");
if(pos != std::string::npos)
{
s.replace(pos, 3, "___");
}
// replace / directory separators with a single under bar
pos = s.find("/");
while(pos != std::string::npos)
{
s.replace(pos, 1, "_");
pos = s.find("/");
}
return s;
}
// output the makefile to the named file
void cmUnixMakefile::OutputMakefile(const char* file)
{
std::ofstream fout(file);
if(!fout)
{
std::cerr << "Error can not open " << file << " for write" << std::endl;
return;
}
if(m_Classes.size() )
{
fout << "SRC_OBJ = \\\n";
for(int i = 0; i < m_Classes.size(); i++)
{
if(!m_Classes[i].m_AbstractClass && !m_Classes[i].m_HeaderFileOnly)
{
fout << m_Classes[i].m_ClassName << ".o ";
if(i == m_Classes.size() -1)
{
fout << "\n\n";
}
else
{
fout << "\\\n";
}
}
}
fout << "\n";
}
fout << "ME = " << this->GetLibraryName() << "\n\n";
for(int i =0; i < m_MakeVerbatim.size(); i++)
{
fout << m_MakeVerbatim[i] << "\n";
}
fout << "\n\n";
if( m_Executables )
{
for(int i = 0; i < m_Classes.size(); i++)
{
if(!m_Classes[i].m_AbstractClass && !m_Classes[i].m_HeaderFileOnly)
{
std::string DotO = m_Classes[i].m_ClassName;
DotO += ".o";
fout << m_Classes[i].m_ClassName << ": " << DotO << "\n";
fout << "\t ${CXX} ${CXX_FLAGS} " << DotO.c_str() << " -o $@ -L${CMAKE_OBJ_DIR}/Code/Common -lITKCommon \\\n"
<< "\t-L${CMAKE_OBJ_DIR}/Code/Insight3DParty/vxl -lITKNumerics -lm ${DL_LIBS}\n\n";
}
}
fout << "EXECUTABLES = \\\n";
for(int i = 0; i < m_Classes.size(); i++)
{
if(!m_Classes[i].m_AbstractClass && !m_Classes[i].m_HeaderFileOnly)
{
fout << m_Classes[i].m_ClassName;
if(i < m_Classes.size()-1)
{
fout << " \\";
}
fout << "\n";
}
}
fout << "\n";
}
if( m_SubDirectories.size() )
{
fout << "SUBDIR_BUILD = \\\n";
int i;
for(i =0; i < m_SubDirectories.size(); i++)
{
std::string subdir = FixDirectoryName(m_SubDirectories[i].c_str());
fout << "build_" << subdir.c_str();
if(i == m_SubDirectories.size()-1)
{
fout << " \n\n";
}
else
{
fout << " \\\n";
}
}
fout << std::endl;
fout << "SUBDIR_CLEAN = \\\n";
for(i =0; i < m_SubDirectories.size(); i++)
{
std::string subdir = FixDirectoryName(m_SubDirectories[i].c_str());
fout << "clean_" << subdir.c_str();
if(i == m_SubDirectories.size()-1)
{
fout << " \n\n";
}
else
{
fout << " \\\n";
}
}
fout << std::endl;
fout << "alldirs : ${SUBDIR_BUILD}\n\n";
for(i =0; i < m_SubDirectories.size(); i++)
{
std::string subdir = FixDirectoryName(m_SubDirectories[i].c_str());
fout << "build_" << subdir.c_str() << ":\n";
fout << "\tcd " << m_SubDirectories[i].c_str()
<< "; ${MAKE} -${MAKEFLAGS} CMakeTargets.make\n";
fout << "\tcd " << m_SubDirectories[i].c_str()
<< "; ${MAKE} -${MAKEFLAGS} all\n\n";
fout << "clean_" << subdir.c_str() << ": \n";
fout << "\tcd " << m_SubDirectories[i].c_str()
<< "; ${MAKE} -${MAKEFLAGS} clean\n\n";
}
}
this->OutputDepends(fout);
}