major changes to support multiple libraries and source lists
This commit is contained in:
parent
7b47a5d2ef
commit
865ec96644
|
@ -6,7 +6,7 @@
|
||||||
#
|
#
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
all: CMakeTargets.make ${LOCAL_BUILD_TARGETS} ${BUILD_LIB_FILE} ${EXECUTABLES} ${SUBDIR_BUILD} ${CMAKE}
|
all: CMakeTargets.make ${LOCAL_BUILD_TARGETS} ${TARGETS} ${SUBDIR_BUILD} ${CMAKE}
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -30,19 +30,6 @@ rebuild_cache: ${CMAKE_CONFIG_DIR}/CMakeCache.txt
|
||||||
${CMAKE_CONFIG_DIR}/CMakeCache.txt:
|
${CMAKE_CONFIG_DIR}/CMakeCache.txt:
|
||||||
${CMAKE} ${topdir}/CMakeLists.txt -MakeCache -S${topdir} -O${CMAKE_CONFIG_DIR} -H${topdir} -B${CMAKE_CONFIG_DIR}
|
${CMAKE} ${topdir}/CMakeLists.txt -MakeCache -S${topdir} -O${CMAKE_CONFIG_DIR} -H${topdir} -B${CMAKE_CONFIG_DIR}
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
# rules for the normal library
|
|
||||||
#
|
|
||||||
lib${LIBRARY}.a: ${SRC_OBJ} ${KIT_OBJ}
|
|
||||||
${AR} cr lib${LIBRARY}.a ${KIT_OBJ}
|
|
||||||
${RANLIB} lib$(LIBRARY).a
|
|
||||||
|
|
||||||
|
|
||||||
lib$(LIBRARY)$(SHLIB_SUFFIX): ${KIT_OBJ}
|
|
||||||
rm -f lib$(LIBRARY)$(SHLIB_SUFFIX)
|
|
||||||
$(CXX) ${CXX_FLAGS} ${CMAKE_SHLIB_BUILD_FLAGS} -o \
|
|
||||||
lib$(LIBRARY)$(SHLIB_SUFFIX) \
|
|
||||||
${KIT_OBJ} ${SHLIB_LD_LIBS}
|
|
||||||
|
|
||||||
install: ${BUILD_LIB_FILE}
|
install: ${BUILD_LIB_FILE}
|
||||||
@echo "Installing ${BUILD_LIB_FILE}"
|
@echo "Installing ${BUILD_LIB_FILE}"
|
||||||
|
|
|
@ -97,6 +97,10 @@ SOURCE=.\cmCommands.cxx
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\cmCustomCommand.cxx
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\cmDirectory.cxx
|
SOURCE=.\cmDirectory.cxx
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
|
@ -68,7 +68,8 @@ LINK32=link.exe
|
||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
# ADD BASE CPP /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||||
# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FD /GZ /c
|
||||||
|
# SUBTRACT CPP /YX
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||||
|
|
|
@ -22,6 +22,7 @@ cmSystemTools.o \
|
||||||
cmDirectory.o \
|
cmDirectory.o \
|
||||||
cmUnixMakefileGenerator.o \
|
cmUnixMakefileGenerator.o \
|
||||||
cmCommands.o \
|
cmCommands.o \
|
||||||
|
cmCustomCommand.o \
|
||||||
cmCacheManager.o \
|
cmCacheManager.o \
|
||||||
cmSourceGroup.o
|
cmSourceGroup.o
|
||||||
|
|
||||||
|
@ -36,6 +37,7 @@ cmAuxSourceDirectoryCommand.o : $(DEPENDS)
|
||||||
cmRegularExpression.o : $(DEPENDS)
|
cmRegularExpression.o : $(DEPENDS)
|
||||||
cmClassFile.o : $(DEPENDS)
|
cmClassFile.o : $(DEPENDS)
|
||||||
cmDirectory.o : $(DEPENDS)
|
cmDirectory.o : $(DEPENDS)
|
||||||
|
cmCustomCommand.o : $(DEPENDS)
|
||||||
cmUnixMakefileGenerator.o : $(DEPENDS)
|
cmUnixMakefileGenerator.o : $(DEPENDS)
|
||||||
cmCommands.o : $(DEPENDS)
|
cmCommands.o : $(DEPENDS)
|
||||||
cmCacheManager.o : $(DEPENDS)
|
cmCacheManager.o : $(DEPENDS)
|
||||||
|
|
|
@ -23,16 +23,20 @@ bool cmAbstractFilesCommand::Invoke(std::vector<std::string>& args)
|
||||||
this->SetError("called with incorrect number of arguments");
|
this->SetError("called with incorrect number of arguments");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
cmMakefile::ClassMap &Classes = m_Makefile->GetClasses();
|
||||||
for(std::vector<std::string>::iterator j = args.begin();
|
for(std::vector<std::string>::iterator j = args.begin();
|
||||||
j != args.end(); ++j)
|
j != args.end(); ++j)
|
||||||
{
|
{
|
||||||
std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
|
for(cmMakefile::ClassMap::iterator l = Classes.begin();
|
||||||
for(unsigned int i = 0; i < Classes.size(); i++)
|
l != Classes.end(); l++)
|
||||||
{
|
{
|
||||||
if(Classes[i].m_ClassName == (*j))
|
for(std::vector<cmClassFile>::iterator i = l->second.begin();
|
||||||
|
i != l->second.end(); i++)
|
||||||
{
|
{
|
||||||
Classes[i].m_AbstractClass = true;
|
if(i->m_ClassName == (*j))
|
||||||
break;
|
{
|
||||||
|
i->m_AbstractClass = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*=========================================================================
|
||||||
|
|
||||||
|
Program: Insight Segmentation & Registration Toolkit
|
||||||
|
Module: $RCSfile$
|
||||||
|
Language: C++
|
||||||
|
Date: $Date$
|
||||||
|
Version: $Revision$
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 2000 National Library of Medicine
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
See COPYRIGHT.txt for copyright details.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
#include "cmAddExecutableCommand.h"
|
||||||
|
|
||||||
|
// cmExecutableCommand
|
||||||
|
bool cmAddExecutableCommand::Invoke(std::vector<std::string>& args)
|
||||||
|
{
|
||||||
|
if(args.size() < 2 )
|
||||||
|
{
|
||||||
|
this->SetError("called with incorrect number of arguments");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string>::iterator s = args.begin();
|
||||||
|
std::vector<std::string> srclists(++s, args.end());
|
||||||
|
|
||||||
|
m_Makefile->AddExecutable(args[0].c_str(),srclists);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
/*=========================================================================
|
||||||
|
|
||||||
|
Program: Insight Segmentation & Registration Toolkit
|
||||||
|
Module: $RCSfile$
|
||||||
|
Language: C++
|
||||||
|
Date: $Date$
|
||||||
|
Version: $Revision$
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 2000 National Library of Medicine
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
See COPYRIGHT.txt for copyright details.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
#ifndef cmExecutablesCommand_h
|
||||||
|
#define cmExecutablesCommand_h
|
||||||
|
|
||||||
|
#include "cmStandardIncludes.h"
|
||||||
|
#include "cmCommand.h"
|
||||||
|
|
||||||
|
/** \class cmExecutablesCommand
|
||||||
|
* \brief Defines a list of executables to build.
|
||||||
|
*
|
||||||
|
* cmExecutablesCommand defines a list of executable (i.e., test)
|
||||||
|
* programs to create.
|
||||||
|
*/
|
||||||
|
class cmAddExecutableCommand : public cmCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* This is a virtual constructor for the command.
|
||||||
|
*/
|
||||||
|
virtual cmCommand* Clone()
|
||||||
|
{
|
||||||
|
return new cmAddExecutableCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is called when the command is first encountered in
|
||||||
|
* the CMakeLists.txt file.
|
||||||
|
*/
|
||||||
|
virtual bool Invoke(std::vector<std::string>& args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the command as specified in CMakeList.txt.
|
||||||
|
*/
|
||||||
|
virtual const char* GetName() { return "ADD_EXECUTABLE";}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Succinct documentation.
|
||||||
|
*/
|
||||||
|
virtual const char* GetTerseDocumentation()
|
||||||
|
{
|
||||||
|
return "Add an executable to the project that uses the specified srclists";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* More documentation.
|
||||||
|
*/
|
||||||
|
virtual const char* GetFullDocumentation()
|
||||||
|
{
|
||||||
|
return
|
||||||
|
"ADD_EXECUTABLE(exename srclist srclist srclist ...)";
|
||||||
|
}
|
||||||
|
|
||||||
|
cmTypeMacro(cmAddExecutableCommand, cmCommand);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*=========================================================================
|
||||||
|
|
||||||
|
Program: Insight Segmentation & Registration Toolkit
|
||||||
|
Module: $RCSfile$
|
||||||
|
Language: C++
|
||||||
|
Date: $Date$
|
||||||
|
Version: $Revision$
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 2000 National Library of Medicine
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
See COPYRIGHT.txt for copyright details.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
#include "cmAddLibraryCommand.h"
|
||||||
|
|
||||||
|
// cmLibraryCommand
|
||||||
|
bool cmAddLibraryCommand::Invoke(std::vector<std::string>& args)
|
||||||
|
{
|
||||||
|
if(args.size() < 2 )
|
||||||
|
{
|
||||||
|
this->SetError("called with incorrect number of arguments");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string>::iterator s = args.begin();
|
||||||
|
std::vector<std::string> srclists(++s, args.end());
|
||||||
|
|
||||||
|
m_Makefile->AddLibrary(args[0].c_str(),srclists);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
/*=========================================================================
|
||||||
|
|
||||||
|
Program: Insight Segmentation & Registration Toolkit
|
||||||
|
Module: $RCSfile$
|
||||||
|
Language: C++
|
||||||
|
Date: $Date$
|
||||||
|
Version: $Revision$
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 2000 National Library of Medicine
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
See COPYRIGHT.txt for copyright details.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
#ifndef cmLibrarysCommand_h
|
||||||
|
#define cmLibrarysCommand_h
|
||||||
|
|
||||||
|
#include "cmStandardIncludes.h"
|
||||||
|
#include "cmCommand.h"
|
||||||
|
|
||||||
|
/** \class cmLibrarysCommand
|
||||||
|
* \brief Defines a list of executables to build.
|
||||||
|
*
|
||||||
|
* cmLibrarysCommand defines a list of executable (i.e., test)
|
||||||
|
* programs to create.
|
||||||
|
*/
|
||||||
|
class cmAddLibraryCommand : public cmCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* This is a virtual constructor for the command.
|
||||||
|
*/
|
||||||
|
virtual cmCommand* Clone()
|
||||||
|
{
|
||||||
|
return new cmAddLibraryCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is called when the command is first encountered in
|
||||||
|
* the CMakeLists.txt file.
|
||||||
|
*/
|
||||||
|
virtual bool Invoke(std::vector<std::string>& args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the command as specified in CMakeList.txt.
|
||||||
|
*/
|
||||||
|
virtual const char* GetName() { return "ADD_LIBRARY";}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Succinct documentation.
|
||||||
|
*/
|
||||||
|
virtual const char* GetTerseDocumentation()
|
||||||
|
{
|
||||||
|
return "Add an library to the project that uses the specified srclists";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* More documentation.
|
||||||
|
*/
|
||||||
|
virtual const char* GetFullDocumentation()
|
||||||
|
{
|
||||||
|
return
|
||||||
|
"ADD_LIBRARY(libname srclist srclist srclist ...)";
|
||||||
|
}
|
||||||
|
|
||||||
|
cmTypeMacro(cmAddLibraryCommand, cmCommand);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -19,9 +19,9 @@
|
||||||
// cmAuxSourceDirectoryCommand
|
// cmAuxSourceDirectoryCommand
|
||||||
bool cmAuxSourceDirectoryCommand::Invoke(std::vector<std::string>& args)
|
bool cmAuxSourceDirectoryCommand::Invoke(std::vector<std::string>& args)
|
||||||
{
|
{
|
||||||
if(args.size() < 1 || args.size() > 1)
|
if(args.size() < 2 || args.size() > 2)
|
||||||
{
|
{
|
||||||
this->SetError("PROJECT called with incorrect number of arguments");
|
this->SetError("called with incorrect number of arguments");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ bool cmAuxSourceDirectoryCommand::Invoke(std::vector<std::string>& args)
|
||||||
cmClassFile cmfile;
|
cmClassFile cmfile;
|
||||||
cmfile.SetName(fullname.c_str(), m_Makefile->GetCurrentDirectory());
|
cmfile.SetName(fullname.c_str(), m_Makefile->GetCurrentDirectory());
|
||||||
cmfile.m_AbstractClass = false;
|
cmfile.m_AbstractClass = false;
|
||||||
m_Makefile->AddClass(cmfile);
|
m_Makefile->AddClass(cmfile,args[1].c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ public:
|
||||||
virtual const char* GetTerseDocumentation()
|
virtual const char* GetTerseDocumentation()
|
||||||
{
|
{
|
||||||
return "Add all the source files found in the specified\n"
|
return "Add all the source files found in the specified\n"
|
||||||
"directory to the build.";
|
"directory to the build as source list NAME.";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -65,7 +65,7 @@ public:
|
||||||
virtual const char* GetFullDocumentation()
|
virtual const char* GetFullDocumentation()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
"AUX_SOURCE_DIRECTORY(dir)";
|
"AUX_SOURCE_DIRECTORY(dir srcListName)";
|
||||||
}
|
}
|
||||||
|
|
||||||
cmTypeMacro(cmAuxSourceDirectoryCommand, cmCommand);
|
cmTypeMacro(cmAuxSourceDirectoryCommand, cmCommand);
|
||||||
|
|
|
@ -78,40 +78,5 @@ void cmCableCommand::SetupCableData()
|
||||||
// command as its owner.
|
// command as its owner.
|
||||||
pathName += "/cable_config.xml";
|
pathName += "/cable_config.xml";
|
||||||
m_CableData = new cmCableData(this, pathName);
|
m_CableData = new cmCableData(this, pathName);
|
||||||
|
|
||||||
// We must add a custom rule to cause the cable_config.xml to be re-built
|
|
||||||
// when it is removed. Rebuilding it means re-running CMake.
|
|
||||||
std::string cMakeLists = m_Makefile->GetStartDirectory();
|
|
||||||
cMakeLists += "/";
|
|
||||||
cMakeLists += "CMakeLists.txt";
|
|
||||||
|
|
||||||
std::string command;
|
|
||||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
|
||||||
command = "\"";
|
|
||||||
command += m_Makefile->GetHomeDirectory();
|
|
||||||
command += "/CMake/Source/CMakeSetupCMD\" \"";
|
|
||||||
command += cMakeLists;
|
|
||||||
command += "\" -DSP";
|
|
||||||
#else
|
|
||||||
command = "\"";
|
|
||||||
command += m_Makefile->GetHomeOutputDirectory();
|
|
||||||
command += "/CMake/Source/CMakeBuildTargets\" \"";
|
|
||||||
command += cMakeLists;
|
|
||||||
command += "\"";
|
|
||||||
#endif
|
|
||||||
command += " -H\"";
|
|
||||||
command += m_Makefile->GetHomeDirectory();
|
|
||||||
command += "\" -S\"";
|
|
||||||
command += m_Makefile->GetStartDirectory();
|
|
||||||
command += "\" -O\"";
|
|
||||||
command += m_Makefile->GetStartOutputDirectory();
|
|
||||||
command += "\" -B\"";
|
|
||||||
command += m_Makefile->GetHomeOutputDirectory();
|
|
||||||
command += "\"";
|
|
||||||
|
|
||||||
std::vector<std::string> depends;
|
|
||||||
m_Makefile->AddCustomCommand(cMakeLists.c_str(),
|
|
||||||
command.c_str(),
|
|
||||||
depends,
|
|
||||||
"cable_config.xml");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,7 @@ cmCableData::cmCableData(const cmCableCommand* owner,
|
||||||
m_OutputFile(configurationFile.c_str()),
|
m_OutputFile(configurationFile.c_str()),
|
||||||
m_Indentation(0),
|
m_Indentation(0),
|
||||||
m_Package(NULL),
|
m_Package(NULL),
|
||||||
m_PackageNamespaceDepth(0),
|
m_PackageNamespaceDepth(0)
|
||||||
m_PackageClassIndex(-1)
|
|
||||||
{
|
{
|
||||||
this->InitializeOutputFile();
|
this->InitializeOutputFile();
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,8 +71,7 @@ public:
|
||||||
void BeginPackage(cmCablePackageCommand*);
|
void BeginPackage(cmCablePackageCommand*);
|
||||||
void EndPackage();
|
void EndPackage();
|
||||||
|
|
||||||
void SetPackageClassIndex(int index) { m_PackageClassIndex = index; }
|
cmCablePackageCommand *GetCurrentPackage() { return m_Package; }
|
||||||
int GetPackageClassIndex() const { return m_PackageClassIndex; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
|
@ -110,13 +109,6 @@ private:
|
||||||
* This must be the level when the package is ended.
|
* This must be the level when the package is ended.
|
||||||
*/
|
*/
|
||||||
unsigned int m_PackageNamespaceDepth;
|
unsigned int m_PackageNamespaceDepth;
|
||||||
|
|
||||||
/**
|
|
||||||
* During the final pass, this maintains the index into a cmMakefile's
|
|
||||||
* m_Classes corresponding to the cmClassFile for this package's generated
|
|
||||||
* file.
|
|
||||||
*/
|
|
||||||
int m_PackageClassIndex;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream&, const cmCableData::Indentation&);
|
std::ostream& operator<<(std::ostream&, const cmCableData::Indentation&);
|
||||||
|
|
|
@ -36,17 +36,58 @@ cmCablePackageCommand::~cmCablePackageCommand()
|
||||||
// cmCablePackageCommand
|
// cmCablePackageCommand
|
||||||
bool cmCablePackageCommand::Invoke(std::vector<std::string>& args)
|
bool cmCablePackageCommand::Invoke(std::vector<std::string>& args)
|
||||||
{
|
{
|
||||||
if(args.size() != 1)
|
if(args.size() != 2)
|
||||||
{
|
{
|
||||||
this->SetError("called with incorrect number of arguments");
|
this->SetError("called with incorrect number of arguments");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setup this once. Really this should probably be moved somewhere else
|
||||||
|
// at some point.
|
||||||
|
{
|
||||||
|
// We must add a custom rule to cause the cable_config.xml to be re-built
|
||||||
|
// when it is removed. Rebuilding it means re-running CMake.
|
||||||
|
std::string cMakeLists = m_Makefile->GetStartDirectory();
|
||||||
|
cMakeLists += "/";
|
||||||
|
cMakeLists += "CMakeLists.txt";
|
||||||
|
|
||||||
|
std::string command;
|
||||||
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||||
|
command = "\"";
|
||||||
|
command += m_Makefile->GetHomeDirectory();
|
||||||
|
command += "/CMake/Source/CMakeSetupCMD\" \"";
|
||||||
|
command += cMakeLists;
|
||||||
|
command += "\" -DSP";
|
||||||
|
#else
|
||||||
|
command = "\"";
|
||||||
|
command += m_Makefile->GetHomeOutputDirectory();
|
||||||
|
command += "/CMake/Source/CMakeBuildTargets\" \"";
|
||||||
|
command += cMakeLists;
|
||||||
|
command += "\"";
|
||||||
|
#endif
|
||||||
|
command += " -H\"";
|
||||||
|
command += m_Makefile->GetHomeDirectory();
|
||||||
|
command += "\" -S\"";
|
||||||
|
command += m_Makefile->GetStartDirectory();
|
||||||
|
command += "\" -O\"";
|
||||||
|
command += m_Makefile->GetStartOutputDirectory();
|
||||||
|
command += "\" -B\"";
|
||||||
|
command += m_Makefile->GetHomeOutputDirectory();
|
||||||
|
command += "\"";
|
||||||
|
|
||||||
|
std::vector<std::string> depends;
|
||||||
|
m_Makefile->AddCustomCommand(cMakeLists.c_str(),
|
||||||
|
command.c_str(),
|
||||||
|
depends,
|
||||||
|
"cable_config.xml", args[1].c_str());
|
||||||
|
}
|
||||||
|
|
||||||
// This command needs to access the Cable data.
|
// This command needs to access the Cable data.
|
||||||
this->SetupCableData();
|
this->SetupCableData();
|
||||||
|
|
||||||
// The argument is the package name.
|
// The argument is the package name.
|
||||||
m_PackageName = args[0];
|
m_PackageName = args[0];
|
||||||
|
m_TargetName = args[1];
|
||||||
|
|
||||||
// Ask the cable data to begin the package. This may call another
|
// Ask the cable data to begin the package. This may call another
|
||||||
// cmCablePackageCommand's WritePackageFooter(). This will call
|
// cmCablePackageCommand's WritePackageFooter(). This will call
|
||||||
|
@ -72,7 +113,7 @@ bool cmCablePackageCommand::Invoke(std::vector<std::string>& args)
|
||||||
m_Makefile->AddCustomCommand("cable_config.xml",
|
m_Makefile->AddCustomCommand("cable_config.xml",
|
||||||
command.c_str(),
|
command.c_str(),
|
||||||
depends,
|
depends,
|
||||||
outputs);
|
outputs, m_TargetName.c_str());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -87,9 +128,7 @@ void cmCablePackageCommand::FinalPass()
|
||||||
file.m_AbstractClass = false;
|
file.m_AbstractClass = false;
|
||||||
file.m_HeaderFileOnly = false;
|
file.m_HeaderFileOnly = false;
|
||||||
file.SetName(fileName.c_str(), filePath.c_str(), "cxx", false);
|
file.SetName(fileName.c_str(), filePath.c_str(), "cxx", false);
|
||||||
|
m_Makefile->AddClass(file, m_PackageName.c_str());
|
||||||
m_CableData->SetPackageClassIndex(m_Makefile->GetClasses().size());
|
|
||||||
m_Makefile->AddClass(file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -73,12 +73,13 @@ public:
|
||||||
virtual const char* GetFullDocumentation()
|
virtual const char* GetFullDocumentation()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
"CABLE_PACKAGE(package_name)\n"
|
"CABLE_PACKAGE(package_name target)\n"
|
||||||
"Close current package (if any), and open a new package definition.";
|
"Close current package (if any), and open a new package definition.";
|
||||||
}
|
}
|
||||||
|
|
||||||
void WritePackageHeader() const;
|
void WritePackageHeader() const;
|
||||||
void WritePackageFooter() const;
|
void WritePackageFooter() const;
|
||||||
|
const char *GetPackageName() {return m_PackageName.c_str();}
|
||||||
|
|
||||||
cmTypeMacro(cmCablePackageCommand, cmCableCommand);
|
cmTypeMacro(cmCablePackageCommand, cmCableCommand);
|
||||||
private:
|
private:
|
||||||
|
@ -86,6 +87,7 @@ private:
|
||||||
* The name of the package.
|
* The name of the package.
|
||||||
*/
|
*/
|
||||||
std::string m_PackageName;
|
std::string m_PackageName;
|
||||||
|
std::string m_TargetName;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,19 +20,23 @@ void cmCableSourceFilesCommand::FinalPass()
|
||||||
{
|
{
|
||||||
// Get the index of the current package's cmClassFile.
|
// Get the index of the current package's cmClassFile.
|
||||||
// If it doesn't exist, ignore this command.
|
// If it doesn't exist, ignore this command.
|
||||||
int index = m_CableData->GetPackageClassIndex();
|
cmCablePackageCommand *cablePackage = m_CableData->GetCurrentPackage();
|
||||||
if(index < 0)
|
std::string fileName = "Cxx/";
|
||||||
|
fileName += cablePackage->GetPackageName();
|
||||||
|
fileName += "_cxx";
|
||||||
|
cmClassFile *ci = m_Makefile->GetClass(cablePackage->GetPackageName(),
|
||||||
|
fileName.c_str());
|
||||||
|
|
||||||
|
if(ci == 0)
|
||||||
{ return; }
|
{ return; }
|
||||||
|
|
||||||
// The package's file has not yet been generated yet. The dependency
|
// The package's file has not yet been generated yet. The dependency
|
||||||
// finder will need hints. Add one for each source file.
|
// finder will need hints. Add one for each source file.
|
||||||
cmClassFile& cFile = m_Makefile->GetClasses()[index];
|
|
||||||
|
|
||||||
for(Entries::const_iterator f = m_Entries.begin();
|
for(Entries::const_iterator f = m_Entries.begin();
|
||||||
f != m_Entries.end(); ++f)
|
f != m_Entries.end(); ++f)
|
||||||
{
|
{
|
||||||
std::string header = *f+".h";
|
std::string header = *f+".h";
|
||||||
cFile.m_Depends.push_back(header);
|
ci->m_Depends.push_back(header);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,19 +103,23 @@ void cmClassFile::SetName(const char* name, const char* dir, const char *ext,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmClassFile::Print()
|
void cmClassFile::Print() const
|
||||||
{
|
{
|
||||||
if(m_AbstractClass)
|
if(m_AbstractClass)
|
||||||
|
{
|
||||||
std::cout << "Abstract ";
|
std::cout << "Abstract ";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
std::cout << "Concrete ";
|
std::cout << "Concrete ";
|
||||||
|
}
|
||||||
if(m_HeaderFileOnly)
|
if(m_HeaderFileOnly)
|
||||||
|
{
|
||||||
std::cout << "Header file ";
|
std::cout << "Header file ";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
std::cout << "CXX file ";
|
std::cout << "CXX file ";
|
||||||
if(m_IsExecutable)
|
}
|
||||||
std::cout << "Executable ";
|
|
||||||
else
|
|
||||||
std::cout << "Non Executable ";
|
|
||||||
std::cout << m_ClassName << std::endl;
|
std::cout << m_ClassName << std::endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,6 @@ public:
|
||||||
{
|
{
|
||||||
m_AbstractClass = false;
|
m_AbstractClass = false;
|
||||||
m_HeaderFileOnly = false;
|
m_HeaderFileOnly = false;
|
||||||
m_IsExecutable = false;
|
|
||||||
m_WrapExclude = false;
|
m_WrapExclude = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +56,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Print the structure to std::cout.
|
* Print the structure to std::cout.
|
||||||
*/
|
*/
|
||||||
void Print();
|
void Print() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicate whether the class is abstract (non-instantiable).
|
* Indicate whether the class is abstract (non-instantiable).
|
||||||
|
@ -74,11 +73,6 @@ public:
|
||||||
*/
|
*/
|
||||||
bool m_HeaderFileOnly;
|
bool m_HeaderFileOnly;
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicate whether this class is an executable file
|
|
||||||
*/
|
|
||||||
bool m_IsExecutable;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The full path to the file.
|
* The full path to the file.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -4,14 +4,14 @@
|
||||||
// like to have CMake to build CMake.
|
// like to have CMake to build CMake.
|
||||||
#include "cmCommands.h"
|
#include "cmCommands.h"
|
||||||
#include "cmAbstractFilesCommand.cxx"
|
#include "cmAbstractFilesCommand.cxx"
|
||||||
|
#include "cmAddExecutableCommand.cxx"
|
||||||
|
#include "cmAddLibraryCommand.cxx"
|
||||||
#include "cmAddTargetCommand.cxx"
|
#include "cmAddTargetCommand.cxx"
|
||||||
#include "cmAuxSourceDirectoryCommand.cxx"
|
#include "cmAuxSourceDirectoryCommand.cxx"
|
||||||
#include "cmExecutablesCommand.cxx"
|
|
||||||
#include "cmFindIncludeCommand.cxx"
|
#include "cmFindIncludeCommand.cxx"
|
||||||
#include "cmFindLibraryCommand.cxx"
|
#include "cmFindLibraryCommand.cxx"
|
||||||
#include "cmFindProgramCommand.cxx"
|
#include "cmFindProgramCommand.cxx"
|
||||||
#include "cmIncludeDirectoryCommand.cxx"
|
#include "cmIncludeDirectoryCommand.cxx"
|
||||||
#include "cmLibraryCommand.cxx"
|
|
||||||
#include "cmLinkDirectoriesCommand.cxx"
|
#include "cmLinkDirectoriesCommand.cxx"
|
||||||
#include "cmLinkLibrariesCommand.cxx"
|
#include "cmLinkLibrariesCommand.cxx"
|
||||||
#include "cmProjectCommand.cxx"
|
#include "cmProjectCommand.cxx"
|
||||||
|
@ -47,14 +47,14 @@
|
||||||
void GetPredefinedCommands(std::list<cmCommand*>& commands)
|
void GetPredefinedCommands(std::list<cmCommand*>& commands)
|
||||||
{
|
{
|
||||||
commands.push_back(new cmAbstractFilesCommand);
|
commands.push_back(new cmAbstractFilesCommand);
|
||||||
|
commands.push_back(new cmAddExecutableCommand);
|
||||||
|
commands.push_back(new cmAddLibraryCommand);
|
||||||
commands.push_back(new cmAddTargetCommand);
|
commands.push_back(new cmAddTargetCommand);
|
||||||
commands.push_back(new cmAuxSourceDirectoryCommand);
|
commands.push_back(new cmAuxSourceDirectoryCommand);
|
||||||
commands.push_back(new cmExecutablesCommand);
|
|
||||||
commands.push_back(new cmFindIncludeCommand);
|
commands.push_back(new cmFindIncludeCommand);
|
||||||
commands.push_back(new cmFindLibraryCommand);
|
commands.push_back(new cmFindLibraryCommand);
|
||||||
commands.push_back(new cmFindProgramCommand);
|
commands.push_back(new cmFindProgramCommand);
|
||||||
commands.push_back(new cmIncludeDirectoryCommand);
|
commands.push_back(new cmIncludeDirectoryCommand);
|
||||||
commands.push_back(new cmLibraryCommand);
|
|
||||||
commands.push_back(new cmLinkDirectoriesCommand);
|
commands.push_back(new cmLinkDirectoriesCommand);
|
||||||
commands.push_back(new cmLinkLibrariesCommand);
|
commands.push_back(new cmLinkLibrariesCommand);
|
||||||
commands.push_back(new cmProjectCommand);
|
commands.push_back(new cmProjectCommand);
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*=========================================================================
|
||||||
|
|
||||||
|
Program: Insight Segmentation & Registration Toolkit
|
||||||
|
Module: $RCSfile$
|
||||||
|
Language: C++
|
||||||
|
Date: $Date$
|
||||||
|
Version: $Revision$
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 2000 National Library of Medicine
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
See COPYRIGHT.txt for copyright details.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
#include "cmCustomCommand.h"
|
||||||
|
#include "cmMakefile.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The constructor
|
||||||
|
*/
|
||||||
|
cmCustomCommand::cmCustomCommand(const char *src, const char *command,
|
||||||
|
std::vector<std::string> dep,
|
||||||
|
std::vector<std::string> out):
|
||||||
|
m_Source(src),
|
||||||
|
m_Command(command),
|
||||||
|
m_Depends(dep),
|
||||||
|
m_Outputs(out)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy constructor.
|
||||||
|
*/
|
||||||
|
cmCustomCommand::cmCustomCommand(const cmCustomCommand& r):
|
||||||
|
m_Source(r.m_Source),
|
||||||
|
m_Command(r.m_Command),
|
||||||
|
m_Depends(r.m_Depends),
|
||||||
|
m_Outputs(r.m_Outputs)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmCustomCommand::ExpandVariables(const cmMakefile &mf)
|
||||||
|
{
|
||||||
|
mf.ExpandVariablesInString(m_Source);
|
||||||
|
mf.ExpandVariablesInString(m_Command);
|
||||||
|
|
||||||
|
for (std::vector<std::string>::iterator i = m_Depends.begin();
|
||||||
|
i != m_Depends.end(); ++i)
|
||||||
|
{
|
||||||
|
mf.ExpandVariablesInString(*i);
|
||||||
|
}
|
||||||
|
for (std::vector<std::string>::iterator i = m_Outputs.begin();
|
||||||
|
i != m_Outputs.end(); ++i)
|
||||||
|
{
|
||||||
|
mf.ExpandVariablesInString(*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*=========================================================================
|
||||||
|
|
||||||
|
Program: Insight Segmentation & Registration Toolkit
|
||||||
|
Module: $RCSfile$
|
||||||
|
Language: C++
|
||||||
|
Date: $Date$
|
||||||
|
Version: $Revision$
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 2000 National Library of Medicine
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
See COPYRIGHT.txt for copyright details.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
#ifndef cmCustomCommand_h
|
||||||
|
#define cmCustomCommand_h
|
||||||
|
|
||||||
|
#include "cmStandardIncludes.h"
|
||||||
|
class cmMakefile;
|
||||||
|
|
||||||
|
class cmCustomCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cmCustomCommand(const char *src, const char *command,
|
||||||
|
std::vector<std::string> dep,
|
||||||
|
std::vector<std::string> out);
|
||||||
|
cmCustomCommand(const cmCustomCommand& r);
|
||||||
|
void ExpandVariables(const cmMakefile &);
|
||||||
|
|
||||||
|
std::string m_Source;
|
||||||
|
std::string m_Command;
|
||||||
|
std::vector<std::string> m_Depends;
|
||||||
|
std::vector<std::string> m_Outputs;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -73,84 +73,52 @@ void cmDSPMakefile::OutputDSPFile()
|
||||||
m_LibraryOptions += "/$(OUTDIR)\" ";
|
m_LibraryOptions += "/$(OUTDIR)\" ";
|
||||||
}
|
}
|
||||||
m_LibraryOptions += "/STACK:10000000 ";
|
m_LibraryOptions += "/STACK:10000000 ";
|
||||||
m_OutputLibName = m_Makefile->GetLibraryName();
|
|
||||||
|
|
||||||
// Create the DSP or set of DSP's for libraries and executables
|
// Create the DSP or set of DSP's for libraries and executables
|
||||||
if(strlen(m_Makefile->GetLibraryName()) != 0)
|
|
||||||
{
|
|
||||||
const char* cacheValue
|
const char* cacheValue
|
||||||
= cmCacheManager::GetInstance()->GetCacheValue("BUILD_SHARED_LIBS");
|
= cmCacheManager::GetInstance()->GetCacheValue("BUILD_SHARED_LIBS");
|
||||||
|
m_LibraryBuildType = STATIC_LIBRARY;
|
||||||
if(cacheValue && strcmp(cacheValue,"0"))
|
if(cacheValue && strcmp(cacheValue,"0"))
|
||||||
{
|
{
|
||||||
this->SetBuildType(DLL);
|
m_LibraryBuildType = DLL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear project names
|
||||||
|
m_CreatedProjectNames.clear();
|
||||||
|
|
||||||
|
// build any targets
|
||||||
|
const cmTargets &tgts = m_Makefile->GetTargets();
|
||||||
|
for(cmTargets::const_iterator l = tgts.begin();
|
||||||
|
l != tgts.end(); l++)
|
||||||
|
{
|
||||||
|
if (l->second.m_IsALibrary)
|
||||||
|
{
|
||||||
|
this->SetBuildType(m_LibraryBuildType, l->first.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->SetBuildType(STATIC_LIBRARY);
|
this->SetBuildType(EXECUTABLE,l->first.c_str());
|
||||||
}
|
|
||||||
this->CreateSingleDSP();
|
|
||||||
}
|
|
||||||
// if there are executables build them
|
|
||||||
if (m_Makefile->HasExecutables())
|
|
||||||
{
|
|
||||||
this->CreateExecutableDSPFiles();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void cmDSPMakefile::CreateExecutableDSPFiles()
|
|
||||||
{
|
|
||||||
std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
|
|
||||||
for(int i = 0; i < Classes.size(); ++i)
|
|
||||||
{
|
|
||||||
cmClassFile& classfile = Classes[i];
|
|
||||||
if (classfile.m_IsExecutable)
|
|
||||||
{
|
|
||||||
std::string fname = m_Makefile->GetStartOutputDirectory();
|
|
||||||
fname += "/";
|
|
||||||
fname += classfile.m_ClassName;
|
|
||||||
fname += ".dsp";
|
|
||||||
std::ofstream fout(fname.c_str());
|
|
||||||
if(!fout)
|
|
||||||
{
|
|
||||||
cmSystemTools::Error("Error Writing ",
|
|
||||||
fname.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// m_Makefile->SetLibraryName(classfile.m_ClassName.c_str());
|
|
||||||
this->SetBuildType(EXECUTABLE);
|
|
||||||
m_OutputLibName = classfile.m_ClassName;
|
|
||||||
std::string pname = classfile.m_ClassName.c_str(); //m_Makefile->GetLibraryName();
|
|
||||||
m_CreatedProjectNames.push_back(pname);
|
|
||||||
|
|
||||||
this->WriteDSPHeader(fout);
|
|
||||||
this->WriteDSPBeginGroup(fout, "Source Files", "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat");
|
|
||||||
this->WriteDSPBuildRule(fout, classfile.m_FullPath.c_str());
|
|
||||||
this->WriteDSPEndGroup(fout);
|
|
||||||
this->WriteDSPBuildRule(fout);
|
|
||||||
this->WriteDSPFooter(fout);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
this->CreateSingleDSP(l->first.c_str(),l->second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmDSPMakefile::CreateSingleDSP(const char *lname,
|
||||||
void cmDSPMakefile::CreateSingleDSP()
|
const cmTarget &target)
|
||||||
{
|
{
|
||||||
std::string fname;
|
std::string fname;
|
||||||
fname = m_Makefile->GetStartOutputDirectory();
|
fname = m_Makefile->GetStartOutputDirectory();
|
||||||
fname += "/";
|
fname += "/";
|
||||||
fname += m_Makefile->GetLibraryName();
|
fname += lname;
|
||||||
fname += ".dsp";
|
fname += ".dsp";
|
||||||
m_CreatedProjectNames.clear();
|
std::string pname = lname;
|
||||||
std::string pname = m_Makefile->GetLibraryName();
|
|
||||||
m_CreatedProjectNames.push_back(pname);
|
m_CreatedProjectNames.push_back(pname);
|
||||||
std::ofstream fout(fname.c_str());
|
std::ofstream fout(fname.c_str());
|
||||||
if(!fout)
|
if(!fout)
|
||||||
{
|
{
|
||||||
cmSystemTools::Error("Error Writing ",
|
cmSystemTools::Error("Error Writing ", fname.c_str());
|
||||||
fname.c_str());
|
|
||||||
}
|
}
|
||||||
this->WriteDSPFile(fout);
|
this->WriteDSPFile(fout,lname,target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout)
|
void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout)
|
||||||
|
@ -210,19 +178,51 @@ void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup)
|
||||||
std::vector<std::string> depends;
|
std::vector<std::string> depends;
|
||||||
std::vector<std::string> outputs;
|
std::vector<std::string> outputs;
|
||||||
outputs.push_back(dspname);
|
outputs.push_back(dspname);
|
||||||
sourceGroup.AddCustomCommand(makefileIn.c_str(), dsprule.c_str(),
|
cmCustomCommand cc(makefileIn.c_str(), dsprule.c_str(),
|
||||||
depends, outputs);
|
depends, outputs);
|
||||||
|
sourceGroup.AddCustomCommand(cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cmDSPMakefile::WriteDSPFile(std::ostream& fout)
|
void cmDSPMakefile::WriteDSPFile(std::ostream& fout,
|
||||||
|
const char *libName,
|
||||||
|
const cmTarget &target)
|
||||||
{
|
{
|
||||||
// Write the DSP file's header.
|
// Write the DSP file's header.
|
||||||
this->WriteDSPHeader(fout);
|
this->WriteDSPHeader(fout, libName);
|
||||||
|
|
||||||
// We may be modifying the source groups temporarily, so make a copy.
|
// We may be modifying the source groups temporarily, so make a copy.
|
||||||
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
|
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
|
||||||
|
|
||||||
|
// get the classes from the source lists then add them to the groups
|
||||||
|
std::vector<cmClassFile> classes =
|
||||||
|
m_Makefile->GetClassesFromSourceLists(target.m_SourceLists);
|
||||||
|
for(std::vector<cmClassFile>::iterator i = classes.begin();
|
||||||
|
i != classes.end(); i++)
|
||||||
|
{
|
||||||
|
if(!i->m_HeaderFileOnly)
|
||||||
|
{
|
||||||
|
// Add the file to the list of sources.
|
||||||
|
std::string source = i->m_FullPath;
|
||||||
|
cmSourceGroup& sourceGroup = m_Makefile->FindSourceGroup(source.c_str(),
|
||||||
|
sourceGroups);
|
||||||
|
sourceGroup.AddSource(source.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add any custom rules to the source groups
|
||||||
|
for (std::vector<cmCustomCommand>::const_iterator cr =
|
||||||
|
target.m_CustomCommands.begin();
|
||||||
|
cr != target.m_CustomCommands.end(); ++cr)
|
||||||
|
{
|
||||||
|
cmSourceGroup& sourceGroup =
|
||||||
|
m_Makefile->FindSourceGroup(cr->m_Source.c_str(),
|
||||||
|
sourceGroups);
|
||||||
|
cmCustomCommand cc(*cr);
|
||||||
|
cc.ExpandVariables(*m_Makefile);
|
||||||
|
sourceGroup.AddCustomCommand(cc);
|
||||||
|
}
|
||||||
|
|
||||||
// Find the group in which the CMakeLists.txt source belongs, and add
|
// Find the group in which the CMakeLists.txt source belongs, and add
|
||||||
// the rule to generate this DSP file.
|
// the rule to generate this DSP file.
|
||||||
for(std::vector<cmSourceGroup>::reverse_iterator sg = sourceGroups.rbegin();
|
for(std::vector<cmSourceGroup>::reverse_iterator sg = sourceGroups.rbegin();
|
||||||
|
@ -351,9 +351,8 @@ void cmDSPMakefile::WriteDSPEndGroup(std::ostream& fout)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cmDSPMakefile::SetBuildType(BuildType b)
|
void cmDSPMakefile::SetBuildType(BuildType b, const char *libName)
|
||||||
{
|
{
|
||||||
m_BuildType = b;
|
|
||||||
switch(b)
|
switch(b)
|
||||||
{
|
{
|
||||||
case STATIC_LIBRARY:
|
case STATIC_LIBRARY:
|
||||||
|
@ -393,8 +392,7 @@ void cmDSPMakefile::SetBuildType(BuildType b)
|
||||||
{
|
{
|
||||||
fin.getline(buffer, 2048);
|
fin.getline(buffer, 2048);
|
||||||
std::string line = buffer;
|
std::string line = buffer;
|
||||||
cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",
|
cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",libName);
|
||||||
m_Makefile->GetLibraryName());
|
|
||||||
if (reg.find(line))
|
if (reg.find(line))
|
||||||
{
|
{
|
||||||
m_Configurations.push_back(line.substr(reg.end()));
|
m_Configurations.push_back(line.substr(reg.end()));
|
||||||
|
@ -402,7 +400,7 @@ void cmDSPMakefile::SetBuildType(BuildType b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmDSPMakefile::WriteDSPHeader(std::ostream& fout)
|
void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName)
|
||||||
{
|
{
|
||||||
std::ifstream fin(m_DSPHeaderTemplate.c_str());
|
std::ifstream fin(m_DSPHeaderTemplate.c_str());
|
||||||
if(!fin)
|
if(!fin)
|
||||||
|
@ -419,8 +417,7 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout)
|
||||||
m_LibraryOptions.c_str());
|
m_LibraryOptions.c_str());
|
||||||
cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
|
cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
|
||||||
m_IncludeOptions.c_str());
|
m_IncludeOptions.c_str());
|
||||||
cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",
|
cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",libName);
|
||||||
m_OutputLibName.c_str());
|
|
||||||
cmSystemTools::ReplaceString(line,
|
cmSystemTools::ReplaceString(line,
|
||||||
"EXTRA_DEFINES",
|
"EXTRA_DEFINES",
|
||||||
m_Makefile->GetDefineFlags());
|
m_Makefile->GetDefineFlags());
|
||||||
|
@ -454,25 +451,4 @@ void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout, const char* path)
|
||||||
fout << "# End Source File\n";
|
fout << "# End Source File\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cmDSPMakefile::NeedsDependencies(const char* dspname)
|
|
||||||
{
|
|
||||||
if(strcmp(m_Makefile->GetLibraryName(), dspname) == 0)
|
|
||||||
{
|
|
||||||
// only shared libs need depend info
|
|
||||||
const char* cacheValue
|
|
||||||
= cmCacheManager::GetInstance()->GetCacheValue("BUILD_SHARED_LIBS");
|
|
||||||
if(cacheValue && strcmp(cacheValue,"0"))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// must be an executable so it needs depends
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -37,11 +37,11 @@ public:
|
||||||
/**
|
/**
|
||||||
* Specify the type of the build: static, dll, or executable.
|
* Specify the type of the build: static, dll, or executable.
|
||||||
*/
|
*/
|
||||||
void SetBuildType(BuildType);
|
void SetBuildType(BuildType,const char *name);
|
||||||
|
|
||||||
BuildType GetBuildType()
|
BuildType GetLibraryBuildType()
|
||||||
{
|
{
|
||||||
return m_BuildType;
|
return m_LibraryBuildType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,20 +61,20 @@ public:
|
||||||
{
|
{
|
||||||
return m_Makefile;
|
return m_Makefile;
|
||||||
}
|
}
|
||||||
bool NeedsDependencies(const char* dspname);
|
|
||||||
private:
|
private:
|
||||||
std::string m_DSPHeaderTemplate;
|
std::string m_DSPHeaderTemplate;
|
||||||
std::string m_DSPFooterTemplate;
|
std::string m_DSPFooterTemplate;
|
||||||
std::vector<std::string> m_CreatedProjectNames;
|
std::vector<std::string> m_CreatedProjectNames;
|
||||||
|
|
||||||
void CreateExecutableDSPFiles();
|
void CreateSingleDSP(const char *lname, const cmTarget &tgt);
|
||||||
void CreateSingleDSP();
|
void WriteDSPFile(std::ostream& fout,
|
||||||
void WriteDSPFile(std::ostream& fout);
|
const char *libName, const cmTarget &tgt);
|
||||||
void WriteDSPBeginGroup(std::ostream& fout,
|
void WriteDSPBeginGroup(std::ostream& fout,
|
||||||
const char* group,
|
const char* group,
|
||||||
const char* filter);
|
const char* filter);
|
||||||
void WriteDSPEndGroup(std::ostream& fout);
|
void WriteDSPEndGroup(std::ostream& fout);
|
||||||
void WriteDSPHeader(std::ostream& fout);
|
void WriteDSPHeader(std::ostream& fout, const char *libName);
|
||||||
void WriteDSPBuildRule(std::ostream& fout, const char*);
|
void WriteDSPBuildRule(std::ostream& fout, const char*);
|
||||||
void WriteDSPBuildRule(std::ostream& fout);
|
void WriteDSPBuildRule(std::ostream& fout);
|
||||||
void WriteDSPFooter(std::ostream& fout);
|
void WriteDSPFooter(std::ostream& fout);
|
||||||
|
@ -86,9 +86,8 @@ private:
|
||||||
|
|
||||||
std::string m_IncludeOptions;
|
std::string m_IncludeOptions;
|
||||||
std::string m_LibraryOptions;
|
std::string m_LibraryOptions;
|
||||||
std::string m_OutputLibName;
|
|
||||||
cmMakefile* m_Makefile;
|
cmMakefile* m_Makefile;
|
||||||
BuildType m_BuildType;
|
BuildType m_LibraryBuildType;
|
||||||
std::vector<std::string> m_Configurations;
|
std::vector<std::string> m_Configurations;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -73,84 +73,52 @@ void cmDSPMakefile::OutputDSPFile()
|
||||||
m_LibraryOptions += "/$(OUTDIR)\" ";
|
m_LibraryOptions += "/$(OUTDIR)\" ";
|
||||||
}
|
}
|
||||||
m_LibraryOptions += "/STACK:10000000 ";
|
m_LibraryOptions += "/STACK:10000000 ";
|
||||||
m_OutputLibName = m_Makefile->GetLibraryName();
|
|
||||||
|
|
||||||
// Create the DSP or set of DSP's for libraries and executables
|
// Create the DSP or set of DSP's for libraries and executables
|
||||||
if(strlen(m_Makefile->GetLibraryName()) != 0)
|
|
||||||
{
|
|
||||||
const char* cacheValue
|
const char* cacheValue
|
||||||
= cmCacheManager::GetInstance()->GetCacheValue("BUILD_SHARED_LIBS");
|
= cmCacheManager::GetInstance()->GetCacheValue("BUILD_SHARED_LIBS");
|
||||||
|
m_LibraryBuildType = STATIC_LIBRARY;
|
||||||
if(cacheValue && strcmp(cacheValue,"0"))
|
if(cacheValue && strcmp(cacheValue,"0"))
|
||||||
{
|
{
|
||||||
this->SetBuildType(DLL);
|
m_LibraryBuildType = DLL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear project names
|
||||||
|
m_CreatedProjectNames.clear();
|
||||||
|
|
||||||
|
// build any targets
|
||||||
|
const cmTargets &tgts = m_Makefile->GetTargets();
|
||||||
|
for(cmTargets::const_iterator l = tgts.begin();
|
||||||
|
l != tgts.end(); l++)
|
||||||
|
{
|
||||||
|
if (l->second.m_IsALibrary)
|
||||||
|
{
|
||||||
|
this->SetBuildType(m_LibraryBuildType, l->first.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->SetBuildType(STATIC_LIBRARY);
|
this->SetBuildType(EXECUTABLE,l->first.c_str());
|
||||||
}
|
|
||||||
this->CreateSingleDSP();
|
|
||||||
}
|
|
||||||
// if there are executables build them
|
|
||||||
if (m_Makefile->HasExecutables())
|
|
||||||
{
|
|
||||||
this->CreateExecutableDSPFiles();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void cmDSPMakefile::CreateExecutableDSPFiles()
|
|
||||||
{
|
|
||||||
std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
|
|
||||||
for(int i = 0; i < Classes.size(); ++i)
|
|
||||||
{
|
|
||||||
cmClassFile& classfile = Classes[i];
|
|
||||||
if (classfile.m_IsExecutable)
|
|
||||||
{
|
|
||||||
std::string fname = m_Makefile->GetStartOutputDirectory();
|
|
||||||
fname += "/";
|
|
||||||
fname += classfile.m_ClassName;
|
|
||||||
fname += ".dsp";
|
|
||||||
std::ofstream fout(fname.c_str());
|
|
||||||
if(!fout)
|
|
||||||
{
|
|
||||||
cmSystemTools::Error("Error Writing ",
|
|
||||||
fname.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// m_Makefile->SetLibraryName(classfile.m_ClassName.c_str());
|
|
||||||
this->SetBuildType(EXECUTABLE);
|
|
||||||
m_OutputLibName = classfile.m_ClassName;
|
|
||||||
std::string pname = classfile.m_ClassName.c_str(); //m_Makefile->GetLibraryName();
|
|
||||||
m_CreatedProjectNames.push_back(pname);
|
|
||||||
|
|
||||||
this->WriteDSPHeader(fout);
|
|
||||||
this->WriteDSPBeginGroup(fout, "Source Files", "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat");
|
|
||||||
this->WriteDSPBuildRule(fout, classfile.m_FullPath.c_str());
|
|
||||||
this->WriteDSPEndGroup(fout);
|
|
||||||
this->WriteDSPBuildRule(fout);
|
|
||||||
this->WriteDSPFooter(fout);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
this->CreateSingleDSP(l->first.c_str(),l->second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmDSPMakefile::CreateSingleDSP(const char *lname,
|
||||||
void cmDSPMakefile::CreateSingleDSP()
|
const cmTarget &target)
|
||||||
{
|
{
|
||||||
std::string fname;
|
std::string fname;
|
||||||
fname = m_Makefile->GetStartOutputDirectory();
|
fname = m_Makefile->GetStartOutputDirectory();
|
||||||
fname += "/";
|
fname += "/";
|
||||||
fname += m_Makefile->GetLibraryName();
|
fname += lname;
|
||||||
fname += ".dsp";
|
fname += ".dsp";
|
||||||
m_CreatedProjectNames.clear();
|
std::string pname = lname;
|
||||||
std::string pname = m_Makefile->GetLibraryName();
|
|
||||||
m_CreatedProjectNames.push_back(pname);
|
m_CreatedProjectNames.push_back(pname);
|
||||||
std::ofstream fout(fname.c_str());
|
std::ofstream fout(fname.c_str());
|
||||||
if(!fout)
|
if(!fout)
|
||||||
{
|
{
|
||||||
cmSystemTools::Error("Error Writing ",
|
cmSystemTools::Error("Error Writing ", fname.c_str());
|
||||||
fname.c_str());
|
|
||||||
}
|
}
|
||||||
this->WriteDSPFile(fout);
|
this->WriteDSPFile(fout,lname,target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout)
|
void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout)
|
||||||
|
@ -210,19 +178,51 @@ void cmDSPMakefile::AddDSPBuildRule(cmSourceGroup& sourceGroup)
|
||||||
std::vector<std::string> depends;
|
std::vector<std::string> depends;
|
||||||
std::vector<std::string> outputs;
|
std::vector<std::string> outputs;
|
||||||
outputs.push_back(dspname);
|
outputs.push_back(dspname);
|
||||||
sourceGroup.AddCustomCommand(makefileIn.c_str(), dsprule.c_str(),
|
cmCustomCommand cc(makefileIn.c_str(), dsprule.c_str(),
|
||||||
depends, outputs);
|
depends, outputs);
|
||||||
|
sourceGroup.AddCustomCommand(cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cmDSPMakefile::WriteDSPFile(std::ostream& fout)
|
void cmDSPMakefile::WriteDSPFile(std::ostream& fout,
|
||||||
|
const char *libName,
|
||||||
|
const cmTarget &target)
|
||||||
{
|
{
|
||||||
// Write the DSP file's header.
|
// Write the DSP file's header.
|
||||||
this->WriteDSPHeader(fout);
|
this->WriteDSPHeader(fout, libName);
|
||||||
|
|
||||||
// We may be modifying the source groups temporarily, so make a copy.
|
// We may be modifying the source groups temporarily, so make a copy.
|
||||||
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
|
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
|
||||||
|
|
||||||
|
// get the classes from the source lists then add them to the groups
|
||||||
|
std::vector<cmClassFile> classes =
|
||||||
|
m_Makefile->GetClassesFromSourceLists(target.m_SourceLists);
|
||||||
|
for(std::vector<cmClassFile>::iterator i = classes.begin();
|
||||||
|
i != classes.end(); i++)
|
||||||
|
{
|
||||||
|
if(!i->m_HeaderFileOnly)
|
||||||
|
{
|
||||||
|
// Add the file to the list of sources.
|
||||||
|
std::string source = i->m_FullPath;
|
||||||
|
cmSourceGroup& sourceGroup = m_Makefile->FindSourceGroup(source.c_str(),
|
||||||
|
sourceGroups);
|
||||||
|
sourceGroup.AddSource(source.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add any custom rules to the source groups
|
||||||
|
for (std::vector<cmCustomCommand>::const_iterator cr =
|
||||||
|
target.m_CustomCommands.begin();
|
||||||
|
cr != target.m_CustomCommands.end(); ++cr)
|
||||||
|
{
|
||||||
|
cmSourceGroup& sourceGroup =
|
||||||
|
m_Makefile->FindSourceGroup(cr->m_Source.c_str(),
|
||||||
|
sourceGroups);
|
||||||
|
cmCustomCommand cc(*cr);
|
||||||
|
cc.ExpandVariables(*m_Makefile);
|
||||||
|
sourceGroup.AddCustomCommand(cc);
|
||||||
|
}
|
||||||
|
|
||||||
// Find the group in which the CMakeLists.txt source belongs, and add
|
// Find the group in which the CMakeLists.txt source belongs, and add
|
||||||
// the rule to generate this DSP file.
|
// the rule to generate this DSP file.
|
||||||
for(std::vector<cmSourceGroup>::reverse_iterator sg = sourceGroups.rbegin();
|
for(std::vector<cmSourceGroup>::reverse_iterator sg = sourceGroups.rbegin();
|
||||||
|
@ -351,9 +351,8 @@ void cmDSPMakefile::WriteDSPEndGroup(std::ostream& fout)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cmDSPMakefile::SetBuildType(BuildType b)
|
void cmDSPMakefile::SetBuildType(BuildType b, const char *libName)
|
||||||
{
|
{
|
||||||
m_BuildType = b;
|
|
||||||
switch(b)
|
switch(b)
|
||||||
{
|
{
|
||||||
case STATIC_LIBRARY:
|
case STATIC_LIBRARY:
|
||||||
|
@ -393,8 +392,7 @@ void cmDSPMakefile::SetBuildType(BuildType b)
|
||||||
{
|
{
|
||||||
fin.getline(buffer, 2048);
|
fin.getline(buffer, 2048);
|
||||||
std::string line = buffer;
|
std::string line = buffer;
|
||||||
cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",
|
cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",libName);
|
||||||
m_Makefile->GetLibraryName());
|
|
||||||
if (reg.find(line))
|
if (reg.find(line))
|
||||||
{
|
{
|
||||||
m_Configurations.push_back(line.substr(reg.end()));
|
m_Configurations.push_back(line.substr(reg.end()));
|
||||||
|
@ -402,7 +400,7 @@ void cmDSPMakefile::SetBuildType(BuildType b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmDSPMakefile::WriteDSPHeader(std::ostream& fout)
|
void cmDSPMakefile::WriteDSPHeader(std::ostream& fout, const char *libName)
|
||||||
{
|
{
|
||||||
std::ifstream fin(m_DSPHeaderTemplate.c_str());
|
std::ifstream fin(m_DSPHeaderTemplate.c_str());
|
||||||
if(!fin)
|
if(!fin)
|
||||||
|
@ -419,8 +417,7 @@ void cmDSPMakefile::WriteDSPHeader(std::ostream& fout)
|
||||||
m_LibraryOptions.c_str());
|
m_LibraryOptions.c_str());
|
||||||
cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
|
cmSystemTools::ReplaceString(line, "BUILD_INCLUDES",
|
||||||
m_IncludeOptions.c_str());
|
m_IncludeOptions.c_str());
|
||||||
cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",
|
cmSystemTools::ReplaceString(line, "OUTPUT_LIBNAME",libName);
|
||||||
m_OutputLibName.c_str());
|
|
||||||
cmSystemTools::ReplaceString(line,
|
cmSystemTools::ReplaceString(line,
|
||||||
"EXTRA_DEFINES",
|
"EXTRA_DEFINES",
|
||||||
m_Makefile->GetDefineFlags());
|
m_Makefile->GetDefineFlags());
|
||||||
|
@ -454,25 +451,4 @@ void cmDSPMakefile::WriteDSPBuildRule(std::ostream& fout, const char* path)
|
||||||
fout << "# End Source File\n";
|
fout << "# End Source File\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cmDSPMakefile::NeedsDependencies(const char* dspname)
|
|
||||||
{
|
|
||||||
if(strcmp(m_Makefile->GetLibraryName(), dspname) == 0)
|
|
||||||
{
|
|
||||||
// only shared libs need depend info
|
|
||||||
const char* cacheValue
|
|
||||||
= cmCacheManager::GetInstance()->GetCacheValue("BUILD_SHARED_LIBS");
|
|
||||||
if(cacheValue && strcmp(cacheValue,"0"))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// must be an executable so it needs depends
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -37,11 +37,11 @@ public:
|
||||||
/**
|
/**
|
||||||
* Specify the type of the build: static, dll, or executable.
|
* Specify the type of the build: static, dll, or executable.
|
||||||
*/
|
*/
|
||||||
void SetBuildType(BuildType);
|
void SetBuildType(BuildType,const char *name);
|
||||||
|
|
||||||
BuildType GetBuildType()
|
BuildType GetLibraryBuildType()
|
||||||
{
|
{
|
||||||
return m_BuildType;
|
return m_LibraryBuildType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,20 +61,20 @@ public:
|
||||||
{
|
{
|
||||||
return m_Makefile;
|
return m_Makefile;
|
||||||
}
|
}
|
||||||
bool NeedsDependencies(const char* dspname);
|
|
||||||
private:
|
private:
|
||||||
std::string m_DSPHeaderTemplate;
|
std::string m_DSPHeaderTemplate;
|
||||||
std::string m_DSPFooterTemplate;
|
std::string m_DSPFooterTemplate;
|
||||||
std::vector<std::string> m_CreatedProjectNames;
|
std::vector<std::string> m_CreatedProjectNames;
|
||||||
|
|
||||||
void CreateExecutableDSPFiles();
|
void CreateSingleDSP(const char *lname, const cmTarget &tgt);
|
||||||
void CreateSingleDSP();
|
void WriteDSPFile(std::ostream& fout,
|
||||||
void WriteDSPFile(std::ostream& fout);
|
const char *libName, const cmTarget &tgt);
|
||||||
void WriteDSPBeginGroup(std::ostream& fout,
|
void WriteDSPBeginGroup(std::ostream& fout,
|
||||||
const char* group,
|
const char* group,
|
||||||
const char* filter);
|
const char* filter);
|
||||||
void WriteDSPEndGroup(std::ostream& fout);
|
void WriteDSPEndGroup(std::ostream& fout);
|
||||||
void WriteDSPHeader(std::ostream& fout);
|
void WriteDSPHeader(std::ostream& fout, const char *libName);
|
||||||
void WriteDSPBuildRule(std::ostream& fout, const char*);
|
void WriteDSPBuildRule(std::ostream& fout, const char*);
|
||||||
void WriteDSPBuildRule(std::ostream& fout);
|
void WriteDSPBuildRule(std::ostream& fout);
|
||||||
void WriteDSPFooter(std::ostream& fout);
|
void WriteDSPFooter(std::ostream& fout);
|
||||||
|
@ -86,9 +86,8 @@ private:
|
||||||
|
|
||||||
std::string m_IncludeOptions;
|
std::string m_IncludeOptions;
|
||||||
std::string m_LibraryOptions;
|
std::string m_LibraryOptions;
|
||||||
std::string m_OutputLibName;
|
|
||||||
cmMakefile* m_Makefile;
|
cmMakefile* m_Makefile;
|
||||||
BuildType m_BuildType;
|
BuildType m_LibraryBuildType;
|
||||||
std::vector<std::string> m_Configurations;
|
std::vector<std::string> m_Configurations;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -87,16 +87,19 @@ void cmDSWMakefile::WriteDSWFile(std::ostream& fout)
|
||||||
// remove the home directory and / from the source directory
|
// remove the home directory and / from the source directory
|
||||||
// this gives a relative path
|
// this gives a relative path
|
||||||
cmSystemTools::ReplaceString(dir, homedir.c_str(), "");
|
cmSystemTools::ReplaceString(dir, homedir.c_str(), "");
|
||||||
|
|
||||||
// Get the list of create dsp files names from the cmDSPMakefile, more
|
// Get the list of create dsp files names from the cmDSPMakefile, more
|
||||||
// than one dsp could have been created per input CMakeLists.txt file
|
// than one dsp could have been created per input CMakeLists.txt file
|
||||||
std::vector<std::string> dspnames =
|
// for each target
|
||||||
pg->GetDSPMakefile()->GetCreatedProjectNames();
|
std::vector<std::string> dspnames = pg->GetDSPMakefile()->GetCreatedProjectNames();
|
||||||
|
const cmTargets &tgts = pg->GetDSPMakefile()->GetMakefile()->GetTargets();
|
||||||
|
cmTargets::const_iterator l = tgts.begin();
|
||||||
for(std::vector<std::string>::iterator si = dspnames.begin();
|
for(std::vector<std::string>::iterator si = dspnames.begin();
|
||||||
si != dspnames.end(); ++si)
|
l != tgts.end(); ++l, ++si)
|
||||||
{
|
{
|
||||||
// Write the project into the DSW file
|
// Write the project into the DSW file
|
||||||
this->WriteProject(fout, si->c_str(), dir.c_str(),
|
this->WriteProject(fout, si->c_str(), dir.c_str(),
|
||||||
pg->GetDSPMakefile());
|
pg->GetDSPMakefile(),l->second);
|
||||||
}
|
}
|
||||||
// delete the cmMakefile which also deletes the cmMSProjectGenerator
|
// delete the cmMakefile which also deletes the cmMSProjectGenerator
|
||||||
delete mf;
|
delete mf;
|
||||||
|
@ -112,7 +115,8 @@ void cmDSWMakefile::WriteDSWFile(std::ostream& fout)
|
||||||
void cmDSWMakefile::WriteProject(std::ostream& fout,
|
void cmDSWMakefile::WriteProject(std::ostream& fout,
|
||||||
const char* dspname,
|
const char* dspname,
|
||||||
const char* dir,
|
const char* dir,
|
||||||
cmDSPMakefile* project)
|
cmDSPMakefile* project,
|
||||||
|
const cmTarget &l)
|
||||||
{
|
{
|
||||||
fout << "#########################################################"
|
fout << "#########################################################"
|
||||||
"######################\n\n";
|
"######################\n\n";
|
||||||
|
@ -126,12 +130,13 @@ void cmDSWMakefile::WriteProject(std::ostream& fout,
|
||||||
std::vector<std::string>::iterator i, end;
|
std::vector<std::string>::iterator i, end;
|
||||||
i = project->GetMakefile()->GetLinkLibraries().begin();
|
i = project->GetMakefile()->GetLinkLibraries().begin();
|
||||||
end = project->GetMakefile()->GetLinkLibraries().end();
|
end = project->GetMakefile()->GetLinkLibraries().end();
|
||||||
if(project->NeedsDependencies(dspname))
|
|
||||||
{
|
|
||||||
for(;i!= end; ++i)
|
for(;i!= end; ++i)
|
||||||
{
|
{
|
||||||
if(*i != dspname)
|
if(*i != dspname)
|
||||||
{
|
{
|
||||||
|
if (!l.m_IsALibrary ||
|
||||||
|
project->GetLibraryBuildType() == cmDSPMakefile::DLL)
|
||||||
|
{
|
||||||
fout << "Begin Project Dependency\n";
|
fout << "Begin Project Dependency\n";
|
||||||
fout << "Project_Dep_Name " << *i << "\n";
|
fout << "Project_Dep_Name " << *i << "\n";
|
||||||
fout << "End Project Dependency\n";
|
fout << "End Project Dependency\n";
|
||||||
|
|
|
@ -47,7 +47,7 @@ private:
|
||||||
void WriteDSWHeader(std::ostream& fout);
|
void WriteDSWHeader(std::ostream& fout);
|
||||||
void WriteProject(std::ostream& fout,
|
void WriteProject(std::ostream& fout,
|
||||||
const char* name, const char* path,
|
const char* name, const char* path,
|
||||||
cmDSPMakefile* project);
|
cmDSPMakefile* project, const cmTarget &t);
|
||||||
void WriteDSWFooter(std::ostream& fout);
|
void WriteDSWFooter(std::ostream& fout);
|
||||||
cmMakefile* m_Makefile;
|
cmMakefile* m_Makefile;
|
||||||
};
|
};
|
||||||
|
|
|
@ -87,16 +87,19 @@ void cmDSWMakefile::WriteDSWFile(std::ostream& fout)
|
||||||
// remove the home directory and / from the source directory
|
// remove the home directory and / from the source directory
|
||||||
// this gives a relative path
|
// this gives a relative path
|
||||||
cmSystemTools::ReplaceString(dir, homedir.c_str(), "");
|
cmSystemTools::ReplaceString(dir, homedir.c_str(), "");
|
||||||
|
|
||||||
// Get the list of create dsp files names from the cmDSPMakefile, more
|
// Get the list of create dsp files names from the cmDSPMakefile, more
|
||||||
// than one dsp could have been created per input CMakeLists.txt file
|
// than one dsp could have been created per input CMakeLists.txt file
|
||||||
std::vector<std::string> dspnames =
|
// for each target
|
||||||
pg->GetDSPMakefile()->GetCreatedProjectNames();
|
std::vector<std::string> dspnames = pg->GetDSPMakefile()->GetCreatedProjectNames();
|
||||||
|
const cmTargets &tgts = pg->GetDSPMakefile()->GetMakefile()->GetTargets();
|
||||||
|
cmTargets::const_iterator l = tgts.begin();
|
||||||
for(std::vector<std::string>::iterator si = dspnames.begin();
|
for(std::vector<std::string>::iterator si = dspnames.begin();
|
||||||
si != dspnames.end(); ++si)
|
l != tgts.end(); ++l, ++si)
|
||||||
{
|
{
|
||||||
// Write the project into the DSW file
|
// Write the project into the DSW file
|
||||||
this->WriteProject(fout, si->c_str(), dir.c_str(),
|
this->WriteProject(fout, si->c_str(), dir.c_str(),
|
||||||
pg->GetDSPMakefile());
|
pg->GetDSPMakefile(),l->second);
|
||||||
}
|
}
|
||||||
// delete the cmMakefile which also deletes the cmMSProjectGenerator
|
// delete the cmMakefile which also deletes the cmMSProjectGenerator
|
||||||
delete mf;
|
delete mf;
|
||||||
|
@ -112,7 +115,8 @@ void cmDSWMakefile::WriteDSWFile(std::ostream& fout)
|
||||||
void cmDSWMakefile::WriteProject(std::ostream& fout,
|
void cmDSWMakefile::WriteProject(std::ostream& fout,
|
||||||
const char* dspname,
|
const char* dspname,
|
||||||
const char* dir,
|
const char* dir,
|
||||||
cmDSPMakefile* project)
|
cmDSPMakefile* project,
|
||||||
|
const cmTarget &l)
|
||||||
{
|
{
|
||||||
fout << "#########################################################"
|
fout << "#########################################################"
|
||||||
"######################\n\n";
|
"######################\n\n";
|
||||||
|
@ -126,12 +130,13 @@ void cmDSWMakefile::WriteProject(std::ostream& fout,
|
||||||
std::vector<std::string>::iterator i, end;
|
std::vector<std::string>::iterator i, end;
|
||||||
i = project->GetMakefile()->GetLinkLibraries().begin();
|
i = project->GetMakefile()->GetLinkLibraries().begin();
|
||||||
end = project->GetMakefile()->GetLinkLibraries().end();
|
end = project->GetMakefile()->GetLinkLibraries().end();
|
||||||
if(project->NeedsDependencies(dspname))
|
|
||||||
{
|
|
||||||
for(;i!= end; ++i)
|
for(;i!= end; ++i)
|
||||||
{
|
{
|
||||||
if(*i != dspname)
|
if(*i != dspname)
|
||||||
{
|
{
|
||||||
|
if (!l.m_IsALibrary ||
|
||||||
|
project->GetLibraryBuildType() == cmDSPMakefile::DLL)
|
||||||
|
{
|
||||||
fout << "Begin Project Dependency\n";
|
fout << "Begin Project Dependency\n";
|
||||||
fout << "Project_Dep_Name " << *i << "\n";
|
fout << "Project_Dep_Name " << *i << "\n";
|
||||||
fout << "End Project Dependency\n";
|
fout << "End Project Dependency\n";
|
||||||
|
|
|
@ -47,7 +47,7 @@ private:
|
||||||
void WriteDSWHeader(std::ostream& fout);
|
void WriteDSWHeader(std::ostream& fout);
|
||||||
void WriteProject(std::ostream& fout,
|
void WriteProject(std::ostream& fout,
|
||||||
const char* name, const char* path,
|
const char* name, const char* path,
|
||||||
cmDSPMakefile* project);
|
cmDSPMakefile* project, const cmTarget &t);
|
||||||
void WriteDSWFooter(std::ostream& fout);
|
void WriteDSWFooter(std::ostream& fout);
|
||||||
cmMakefile* m_Makefile;
|
cmMakefile* m_Makefile;
|
||||||
};
|
};
|
||||||
|
|
|
@ -55,21 +55,23 @@ void cmMakeDepend::SetMakefile(cmMakefile* makefile)
|
||||||
this->AddSearchPath(j->c_str());
|
this->AddSearchPath(j->c_str());
|
||||||
}
|
}
|
||||||
// Now create cmDependInformation objects for files in the directory
|
// Now create cmDependInformation objects for files in the directory
|
||||||
int index = 0;
|
cmMakefile::ClassMap &Classes = m_Makefile->GetClasses();
|
||||||
std::vector<cmClassFile>::iterator i = makefile->m_Classes.begin();
|
for(cmMakefile::ClassMap::iterator l = Classes.begin();
|
||||||
while(i != makefile->m_Classes.end())
|
l != Classes.end(); l++)
|
||||||
{
|
{
|
||||||
if(!(*i).m_HeaderFileOnly)
|
for(std::vector<cmClassFile>::iterator i = l->second.begin();
|
||||||
|
i != l->second.end(); ++i)
|
||||||
|
{
|
||||||
|
if(!i->m_HeaderFileOnly)
|
||||||
{
|
{
|
||||||
cmDependInformation* info = new cmDependInformation;
|
cmDependInformation* info = new cmDependInformation;
|
||||||
info->m_FullPath = this->FullPath((*i).m_FullPath.c_str());
|
info->m_FullPath = this->FullPath(i->m_FullPath.c_str());
|
||||||
this->AddFileToSearchPath(info->m_FullPath.c_str());
|
this->AddFileToSearchPath(info->m_FullPath.c_str());
|
||||||
info->m_IncludeName = (*i).m_FullPath;
|
info->m_IncludeName = i->m_FullPath;
|
||||||
|
info->m_ClassFileIndex = i;
|
||||||
m_DependInformation.push_back(info);
|
m_DependInformation.push_back(info);
|
||||||
info->m_ClassFileIndex = index;
|
|
||||||
}
|
}
|
||||||
++i;
|
}
|
||||||
index++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,9 +101,9 @@ void cmMakeDepend::DoDepends()
|
||||||
// Remove duplicate depends
|
// Remove duplicate depends
|
||||||
info->RemoveDuplicateIndices();
|
info->RemoveDuplicateIndices();
|
||||||
// find the class
|
// find the class
|
||||||
if(info->m_ClassFileIndex != -1)
|
if(info->m_ClassFileIndex != 0)
|
||||||
{
|
{
|
||||||
cmClassFile& cfile = m_Makefile->m_Classes[info->m_ClassFileIndex];
|
cmClassFile& cfile = *(info->m_ClassFileIndex);
|
||||||
for( std::vector<int>::iterator indx = info->m_Indices.begin();
|
for( std::vector<int>::iterator indx = info->m_Indices.begin();
|
||||||
indx != info->m_Indices.end(); ++indx)
|
indx != info->m_Indices.end(); ++indx)
|
||||||
{
|
{
|
||||||
|
@ -126,9 +128,9 @@ void cmMakeDepend::Depend(cmDependInformation* info)
|
||||||
{
|
{
|
||||||
// The cmClassFile may have had hints for dependencies. Delete any that
|
// The cmClassFile may have had hints for dependencies. Delete any that
|
||||||
// exist since we can find the dependencies for real.
|
// exist since we can find the dependencies for real.
|
||||||
if(info->m_ClassFileIndex != -1)
|
if(info->m_ClassFileIndex != 0)
|
||||||
{
|
{
|
||||||
cmClassFile& cFile = m_Makefile->m_Classes[info->m_ClassFileIndex];
|
cmClassFile& cFile = *(info->m_ClassFileIndex);
|
||||||
cFile.m_Depends.erase(cFile.m_Depends.begin(), cFile.m_Depends.end());
|
cFile.m_Depends.erase(cFile.m_Depends.begin(), cFile.m_Depends.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,10 +142,10 @@ void cmMakeDepend::Depend(cmDependInformation* info)
|
||||||
|
|
||||||
// The file doesn't exist. See if the cmClassFile for it has any files
|
// The file doesn't exist. See if the cmClassFile for it has any files
|
||||||
// specified as dependency hints.
|
// specified as dependency hints.
|
||||||
if(info->m_ClassFileIndex != -1)
|
if(info->m_ClassFileIndex != 0)
|
||||||
{
|
{
|
||||||
// Get the cmClassFile corresponding to this.
|
// Get the cmClassFile corresponding to this.
|
||||||
cmClassFile& cFile = m_Makefile->m_Classes[info->m_ClassFileIndex];
|
cmClassFile& cFile = *(info->m_ClassFileIndex);
|
||||||
// See if there are any hints for finding dependencies for the missing
|
// See if there are any hints for finding dependencies for the missing
|
||||||
// file.
|
// file.
|
||||||
if(!cFile.m_Depends.empty())
|
if(!cFile.m_Depends.empty())
|
||||||
|
|
|
@ -35,7 +35,7 @@ struct cmDependInformation
|
||||||
cmDependInformation()
|
cmDependInformation()
|
||||||
{
|
{
|
||||||
m_DependDone = false;
|
m_DependDone = false;
|
||||||
m_ClassFileIndex = -1;
|
m_ClassFileIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -56,9 +56,9 @@ struct cmDependInformation
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The index into the cmMakefile::m_Classes list.
|
* The index into the cmMakefile::m_Classes list.
|
||||||
* The index value of -1 indicates that it is not in the list.
|
* The index value of 0 indicates that it is not in the list.
|
||||||
*/
|
*/
|
||||||
int m_ClassFileIndex;
|
cmClassFile *m_ClassFileIndex;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This flag indicates whether dependency checking has been
|
* This flag indicates whether dependency checking has been
|
||||||
|
|
|
@ -89,9 +89,26 @@ void cmMakefile::PrintStringVector(const char* s, std::vector<std::string>& v)
|
||||||
// call print on all the classes in the makefile
|
// call print on all the classes in the makefile
|
||||||
void cmMakefile::Print()
|
void cmMakefile::Print()
|
||||||
{
|
{
|
||||||
|
// print the class lists
|
||||||
std::cout << "classes:\n";
|
std::cout << "classes:\n";
|
||||||
for(unsigned int i = 0; i < m_Classes.size(); i++)
|
for(ClassMap::const_iterator l = m_Classes.begin();
|
||||||
m_Classes[i].Print();
|
l != m_Classes.end(); l++)
|
||||||
|
{
|
||||||
|
std::cout << " Class list named: " << l->first << std::endl;
|
||||||
|
for(std::vector<cmClassFile>::const_iterator i = l->second.begin();
|
||||||
|
i != l->second.end(); i++)
|
||||||
|
{
|
||||||
|
i->Print();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << " m_Targets: ";
|
||||||
|
for (cmTargets::const_iterator l = m_Targets.begin();
|
||||||
|
l != m_Targets.end(); l++)
|
||||||
|
{
|
||||||
|
std::cout << l->first << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
std::cout << " m_CurrentOutputDirectory; " <<
|
std::cout << " m_CurrentOutputDirectory; " <<
|
||||||
m_CurrentOutputDirectory.c_str() << std::endl;
|
m_CurrentOutputDirectory.c_str() << std::endl;
|
||||||
std::cout << " m_StartOutputDirectory; " <<
|
std::cout << " m_StartOutputDirectory; " <<
|
||||||
|
@ -104,7 +121,6 @@ void cmMakefile::Print()
|
||||||
m_cmStartDirectory.c_str() << std::endl;
|
m_cmStartDirectory.c_str() << std::endl;
|
||||||
std::cout << " m_cmHomeDirectory; " <<
|
std::cout << " m_cmHomeDirectory; " <<
|
||||||
m_cmHomeDirectory.c_str() << std::endl;
|
m_cmHomeDirectory.c_str() << std::endl;
|
||||||
std::cout << " m_LibraryName; " << m_LibraryName.c_str() << std::endl;
|
|
||||||
std::cout << " m_ProjectName; " << m_ProjectName.c_str() << std::endl;
|
std::cout << " m_ProjectName; " << m_ProjectName.c_str() << std::endl;
|
||||||
this->PrintStringVector("m_SubDirectories ", m_SubDirectories);
|
this->PrintStringVector("m_SubDirectories ", m_SubDirectories);
|
||||||
this->PrintStringVector("m_MakeVerbatim ", m_MakeVerbatim);
|
this->PrintStringVector("m_MakeVerbatim ", m_MakeVerbatim);
|
||||||
|
@ -192,7 +208,8 @@ bool cmMakefile::ReadListFile(const char* filename)
|
||||||
{
|
{
|
||||||
cmSystemTools::Error(usedCommand->GetName(),
|
cmSystemTools::Error(usedCommand->GetName(),
|
||||||
": Error : \n",
|
": Error : \n",
|
||||||
usedCommand->GetError());
|
usedCommand->GetError(),
|
||||||
|
m_cmCurrentDirectory.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -221,6 +238,26 @@ bool cmMakefile::ReadListFile(const char* filename)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmClassFile *cmMakefile::GetClass(const char *srclist, const char *cname)
|
||||||
|
{
|
||||||
|
ClassMap::iterator sl = m_Classes.find(srclist);
|
||||||
|
// find the src list
|
||||||
|
if (sl == m_Classes.end())
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// find the class
|
||||||
|
for (std::vector<cmClassFile>::iterator i = sl->second.begin();
|
||||||
|
i != sl->second.end(); ++i)
|
||||||
|
{
|
||||||
|
if (i->m_ClassName == cname)
|
||||||
|
{
|
||||||
|
return &(*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void cmMakefile::AddCommand(cmCommand* wg)
|
void cmMakefile::AddCommand(cmCommand* wg)
|
||||||
{
|
{
|
||||||
std::string name = wg->GetName();
|
std::string name = wg->GetName();
|
||||||
|
@ -252,36 +289,34 @@ void cmMakefile::GenerateMakefile()
|
||||||
m_MakefileGenerator->GenerateMakefile();
|
m_MakefileGenerator->GenerateMakefile();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmMakefile::AddClass(cmClassFile& cmfile)
|
void cmMakefile::AddClass(cmClassFile& cmfile, const char *srclist)
|
||||||
{
|
{
|
||||||
m_Classes.push_back(cmfile);
|
m_Classes[srclist].push_back(cmfile);
|
||||||
|
}
|
||||||
|
|
||||||
if(!cmfile.m_IsExecutable && !cmfile.m_HeaderFileOnly)
|
void cmMakefile::AddCustomCommand(const char* source,
|
||||||
|
const char* command,
|
||||||
|
const std::vector<std::string>& depends,
|
||||||
|
const std::vector<std::string>& outputs,
|
||||||
|
const char *target)
|
||||||
{
|
{
|
||||||
// Add the file to the list of sources.
|
// find the target,
|
||||||
std::string source = cmfile.m_FullPath;
|
if (m_Targets.find(target) != m_Targets.end())
|
||||||
cmSourceGroup& sourceGroup = this->FindSourceGroup(source.c_str());
|
{
|
||||||
sourceGroup.AddSource(source.c_str());
|
cmCustomCommand cc(source,command,depends,outputs);
|
||||||
|
m_Targets[target].m_CustomCommands.push_back(cc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmMakefile::AddCustomCommand(const char* source,
|
void cmMakefile::AddCustomCommand(const char* source,
|
||||||
const char* command,
|
const char* command,
|
||||||
const std::vector<std::string>& depends,
|
const std::vector<std::string>& depends,
|
||||||
const std::vector<std::string>& outputs)
|
const char* output,
|
||||||
{
|
const char *target)
|
||||||
cmSourceGroup& sourceGroup = this->FindSourceGroup(source);
|
|
||||||
sourceGroup.AddCustomCommand(source, command, depends, outputs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cmMakefile::AddCustomCommand(const char* source,
|
|
||||||
const char* command,
|
|
||||||
const std::vector<std::string>& depends,
|
|
||||||
const char* output)
|
|
||||||
{
|
{
|
||||||
std::vector<std::string> outputs;
|
std::vector<std::string> outputs;
|
||||||
outputs.push_back(output);
|
outputs.push_back(output);
|
||||||
this->AddCustomCommand(source, command, depends, outputs);
|
this->AddCustomCommand(source, command, depends, outputs, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmMakefile::AddDefineFlag(const char* flag)
|
void cmMakefile::AddDefineFlag(const char* flag)
|
||||||
|
@ -290,24 +325,6 @@ void cmMakefile::AddDefineFlag(const char* flag)
|
||||||
m_DefineFlags += flag;
|
m_DefineFlags += flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmMakefile::AddExecutable(cmClassFile& cf)
|
|
||||||
{
|
|
||||||
cf.m_IsExecutable = true;
|
|
||||||
m_Classes.push_back(cf);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cmMakefile::HasExecutables()
|
|
||||||
{
|
|
||||||
for(unsigned int i = 0; i < m_Classes.size(); i++)
|
|
||||||
{
|
|
||||||
if (m_Classes[i].m_IsExecutable)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cmMakefile::AddUtility(const char* util)
|
void cmMakefile::AddUtility(const char* util)
|
||||||
{
|
{
|
||||||
m_Utilities.push_back(util);
|
m_Utilities.push_back(util);
|
||||||
|
@ -348,11 +365,24 @@ void cmMakefile::SetProjectName(const char* p)
|
||||||
m_ProjectName = p;
|
m_ProjectName = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmMakefile::SetLibraryName(const char* l)
|
void cmMakefile::AddLibrary(const char* lname, const std::vector<std::string> &srcs)
|
||||||
{
|
{
|
||||||
m_LibraryName = l;
|
cmTarget target;
|
||||||
|
target.m_IsALibrary = 1;
|
||||||
|
target.m_SourceLists = srcs;
|
||||||
|
m_Targets.insert(cmTargets::value_type(lname,target));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmMakefile::AddExecutable(const char *exeName,
|
||||||
|
const std::vector<std::string> &srcs)
|
||||||
|
{
|
||||||
|
cmTarget target;
|
||||||
|
target.m_IsALibrary = 0;
|
||||||
|
target.m_SourceLists = srcs;
|
||||||
|
m_Targets.insert(cmTargets::value_type(exeName,target));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void cmMakefile::AddSourceGroup(const char* name, const char* regex)
|
void cmMakefile::AddSourceGroup(const char* name, const char* regex)
|
||||||
{
|
{
|
||||||
// First see if the group exists. If so, replace its regular expression.
|
// First see if the group exists. If so, replace its regular expression.
|
||||||
|
@ -491,9 +521,9 @@ int cmMakefile::DumpDocumentationToFile(const char *fileName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cmMakefile::ExpandVariablesInString(std::string& source)
|
void cmMakefile::ExpandVariablesInString(std::string& source) const
|
||||||
{
|
{
|
||||||
for(DefinitionMap::iterator i = m_Definitions.begin();
|
for(DefinitionMap::const_iterator i = m_Definitions.begin();
|
||||||
i != m_Definitions.end(); ++i)
|
i != m_Definitions.end(); ++i)
|
||||||
{
|
{
|
||||||
std::string variable = "${";
|
std::string variable = "${";
|
||||||
|
@ -594,7 +624,9 @@ void cmMakefile::AddDefaultDefinitions()
|
||||||
* non-inherited SOURCE_GROUP commands will have precedence over
|
* non-inherited SOURCE_GROUP commands will have precedence over
|
||||||
* inherited ones.
|
* inherited ones.
|
||||||
*/
|
*/
|
||||||
cmSourceGroup& cmMakefile::FindSourceGroup(const char* source)
|
cmSourceGroup&
|
||||||
|
cmMakefile::FindSourceGroup(const char* source,
|
||||||
|
std::vector<cmSourceGroup> &groups)
|
||||||
{
|
{
|
||||||
std::string file = source;
|
std::string file = source;
|
||||||
std::string::size_type pos = file.rfind('/');
|
std::string::size_type pos = file.rfind('/');
|
||||||
|
@ -603,8 +635,8 @@ cmSourceGroup& cmMakefile::FindSourceGroup(const char* source)
|
||||||
file = file.substr(pos, file.length()-pos);
|
file = file.substr(pos, file.length()-pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(std::vector<cmSourceGroup>::reverse_iterator sg = m_SourceGroups.rbegin();
|
for(std::vector<cmSourceGroup>::reverse_iterator sg = groups.rbegin();
|
||||||
sg != m_SourceGroups.rend(); ++sg)
|
sg != groups.rend(); ++sg)
|
||||||
{
|
{
|
||||||
if(sg->Matches(file.c_str()))
|
if(sg->Matches(file.c_str()))
|
||||||
{
|
{
|
||||||
|
@ -613,5 +645,39 @@ cmSourceGroup& cmMakefile::FindSourceGroup(const char* source)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shouldn't get here, but just in case, return the default group.
|
// Shouldn't get here, but just in case, return the default group.
|
||||||
return m_SourceGroups.front();
|
return groups.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// take srclists and put all the classes into a vector
|
||||||
|
std::vector<cmClassFile>
|
||||||
|
cmMakefile::GetClassesFromSourceLists(
|
||||||
|
const std::vector<std::string> &srcLists)
|
||||||
|
{
|
||||||
|
std::vector<cmClassFile> result;
|
||||||
|
|
||||||
|
// for each src lists add the classes
|
||||||
|
for (std::vector<std::string>::const_iterator s = srcLists.begin();
|
||||||
|
s != srcLists.end(); ++s)
|
||||||
|
{
|
||||||
|
// replace any variables
|
||||||
|
std::string temps = *s;
|
||||||
|
this->ExpandVariablesInString(temps);
|
||||||
|
// look for a srclist
|
||||||
|
if (m_Classes.find(temps) != m_Classes.end())
|
||||||
|
{
|
||||||
|
const std::vector<cmClassFile> &clsList =
|
||||||
|
m_Classes.find(temps)->second;
|
||||||
|
result.insert(result.end(), clsList.begin(), clsList.end());
|
||||||
|
}
|
||||||
|
// if one wasn't found then assume it is a single class
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmClassFile file;
|
||||||
|
file.m_AbstractClass = false;
|
||||||
|
file.SetName(temps.c_str(), this->GetCurrentDirectory());
|
||||||
|
result.push_back(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include "cmClassFile.h"
|
#include "cmClassFile.h"
|
||||||
#include "cmSystemTools.h"
|
#include "cmSystemTools.h"
|
||||||
#include "cmSourceGroup.h"
|
#include "cmSourceGroup.h"
|
||||||
|
#include "cmTarget.h"
|
||||||
class cmCommand;
|
class cmCommand;
|
||||||
class cmMakefileGenerator;
|
class cmMakefileGenerator;
|
||||||
|
|
||||||
|
@ -77,12 +77,14 @@ public:
|
||||||
void AddCustomCommand(const char* source,
|
void AddCustomCommand(const char* source,
|
||||||
const char* command,
|
const char* command,
|
||||||
const std::vector<std::string>& depends,
|
const std::vector<std::string>& depends,
|
||||||
const std::vector<std::string>& outputs);
|
const std::vector<std::string>& outputs,
|
||||||
|
const char *target);
|
||||||
|
|
||||||
void AddCustomCommand(const char* source,
|
void AddCustomCommand(const char* source,
|
||||||
const char* command,
|
const char* command,
|
||||||
const std::vector<std::string>& depends,
|
const std::vector<std::string>& depends,
|
||||||
const char* output);
|
const char* output,
|
||||||
|
const char* target);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a define flag to the build.
|
* Add a define flag to the build.
|
||||||
|
@ -92,7 +94,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Add an executable to the build.
|
* Add an executable to the build.
|
||||||
*/
|
*/
|
||||||
void AddExecutable(cmClassFile&);
|
void AddExecutable(const char *exename, const std::vector<std::string> &srcs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a utility on which this project depends.
|
* Add a utility on which this project depends.
|
||||||
|
@ -146,12 +148,12 @@ public:
|
||||||
/**
|
/**
|
||||||
* Set the name of the library.
|
* Set the name of the library.
|
||||||
*/
|
*/
|
||||||
void SetLibraryName(const char*);
|
void AddLibrary(const char *libname, const std::vector<std::string> &srcs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a class/source file to the build.
|
* Add a class/source file to the build.
|
||||||
*/
|
*/
|
||||||
void AddClass(cmClassFile& );
|
void AddClass(cmClassFile& ,const char *srcListName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a source group for consideration when adding a new source.
|
* Add a source group for consideration when adding a new source.
|
||||||
|
@ -269,12 +271,9 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specify the name of the library that is built by this makefile.
|
* Get the list of targets
|
||||||
*/
|
*/
|
||||||
const char* GetLibraryName()
|
const cmTargets &GetTargets() { return m_Targets; }
|
||||||
{
|
|
||||||
return m_LibraryName.c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of the build subdirectories.
|
* Get a list of the build subdirectories.
|
||||||
|
@ -284,12 +283,6 @@ public:
|
||||||
return m_SubDirectories;
|
return m_SubDirectories;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a boolean flag indicating whether the build generates
|
|
||||||
* any executables.
|
|
||||||
*/
|
|
||||||
bool HasExecutables();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of include directories in the build.
|
* Get a list of include directories in the build.
|
||||||
*/
|
*/
|
||||||
|
@ -349,8 +342,16 @@ public:
|
||||||
/**
|
/**
|
||||||
* Return a list of source files in this makefile.
|
* Return a list of source files in this makefile.
|
||||||
*/
|
*/
|
||||||
std::vector<cmClassFile>& GetClasses()
|
typedef std::map<std::string,std::vector<cmClassFile> > ClassMap;
|
||||||
{return m_Classes;}
|
ClassMap &GetClasses() {return m_Classes;}
|
||||||
|
cmClassFile *GetClass(const char *srclist, const char *className);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a list of classes in the passed source lists
|
||||||
|
*/
|
||||||
|
std::vector<cmClassFile> GetClassesFromSourceLists(
|
||||||
|
const std::vector<std::string> &srcLists);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtain a list of auxiliary source directories.
|
* Obtain a list of auxiliary source directories.
|
||||||
|
@ -400,7 +401,7 @@ public:
|
||||||
* entry in the m_Definitions map. Also @var@ is
|
* entry in the m_Definitions map. Also @var@ is
|
||||||
* expanded to match autoconf style expansions.
|
* expanded to match autoconf style expansions.
|
||||||
*/
|
*/
|
||||||
void ExpandVariablesInString(std::string& source);
|
void ExpandVariablesInString(std::string& source) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Expand variables in the makefiles ivars such as link directories etc
|
* Expand variables in the makefiles ivars such as link directories etc
|
||||||
|
@ -421,6 +422,12 @@ public:
|
||||||
*/
|
*/
|
||||||
void GenerateCacheOnly();
|
void GenerateCacheOnly();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* find what source group this source is in
|
||||||
|
*/
|
||||||
|
cmSourceGroup& FindSourceGroup(const char* source,
|
||||||
|
std::vector<cmSourceGroup> &groups);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::string m_Prefix;
|
std::string m_Prefix;
|
||||||
std::vector<std::string> m_AuxSourceDirectories; //
|
std::vector<std::string> m_AuxSourceDirectories; //
|
||||||
|
@ -432,9 +439,12 @@ protected:
|
||||||
std::string m_cmHomeDirectory;
|
std::string m_cmHomeDirectory;
|
||||||
std::string m_HomeOutputDirectory;
|
std::string m_HomeOutputDirectory;
|
||||||
|
|
||||||
std::string m_LibraryName; // library name
|
|
||||||
std::string m_ProjectName; // project name
|
std::string m_ProjectName; // project name
|
||||||
std::vector<cmClassFile> m_Classes; // list of classes in makefile
|
|
||||||
|
// libraries, classes, and executables
|
||||||
|
cmTargets m_Targets;
|
||||||
|
ClassMap m_Classes;
|
||||||
|
|
||||||
std::vector<std::string> m_SubDirectories; // list of sub directories
|
std::vector<std::string> m_SubDirectories; // list of sub directories
|
||||||
std::vector<std::string> m_MakeVerbatim; // lines copied from input file
|
std::vector<std::string> m_MakeVerbatim; // lines copied from input file
|
||||||
std::vector<std::string> m_IncludeDirectories;
|
std::vector<std::string> m_IncludeDirectories;
|
||||||
|
@ -454,6 +464,7 @@ protected:
|
||||||
std::vector<cmCommand*> m_UsedCommands;
|
std::vector<cmCommand*> m_UsedCommands;
|
||||||
cmMakefileGenerator* m_MakefileGenerator;
|
cmMakefileGenerator* m_MakefileGenerator;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* Get the name of the parent directories CMakeLists file
|
* Get the name of the parent directories CMakeLists file
|
||||||
|
@ -468,7 +479,6 @@ private:
|
||||||
void AddDefaultCommands();
|
void AddDefaultCommands();
|
||||||
void AddDefaultDefinitions();
|
void AddDefaultDefinitions();
|
||||||
|
|
||||||
cmSourceGroup& FindSourceGroup(const char* source);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,13 +23,13 @@ bool cmSourceFilesCommand::Invoke(std::vector<std::string>& args)
|
||||||
this->SetError("called with incorrect number of arguments");
|
this->SetError("called with incorrect number of arguments");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for(std::vector<std::string>::iterator i = args.begin();
|
for(std::vector<std::string>::iterator i = (args.begin() + 1);
|
||||||
i != args.end(); ++i)
|
i != args.end(); ++i)
|
||||||
{
|
{
|
||||||
cmClassFile file;
|
cmClassFile file;
|
||||||
file.m_AbstractClass = false;
|
file.m_AbstractClass = false;
|
||||||
file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory());
|
file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory());
|
||||||
m_Makefile->AddClass(file);
|
m_Makefile->AddClass(file, args[0].c_str());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual const char* GetTerseDocumentation()
|
virtual const char* GetTerseDocumentation()
|
||||||
{
|
{
|
||||||
return "Add a list of source files.";
|
return "Add a list of source files, associate them with a NAME.";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -66,7 +66,7 @@ public:
|
||||||
virtual const char* GetFullDocumentation()
|
virtual const char* GetFullDocumentation()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
"SOURCE_FILES(file1 file2 ...)";
|
"SOURCE_FILES(NAME file1 file2 ...)";
|
||||||
}
|
}
|
||||||
|
|
||||||
cmTypeMacro(cmSourceFilesCommand, cmCommand);
|
cmTypeMacro(cmSourceFilesCommand, cmCommand);
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
// cmSourceFilesRequireCommand
|
// cmSourceFilesRequireCommand
|
||||||
bool cmSourceFilesRequireCommand::Invoke(std::vector<std::string>& args)
|
bool cmSourceFilesRequireCommand::Invoke(std::vector<std::string>& args)
|
||||||
{
|
{
|
||||||
if(args.size() < 3 )
|
if(args.size() < 4 )
|
||||||
{
|
{
|
||||||
this->SetError("called with incorrect number of arguments");
|
this->SetError("called with incorrect number of arguments");
|
||||||
return false;
|
return false;
|
||||||
|
@ -42,12 +42,14 @@ bool cmSourceFilesRequireCommand::Invoke(std::vector<std::string>& args)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the rest of the arguments as source files
|
// Add the rest of the arguments as source files
|
||||||
|
const char *sname = (*i).c_str();
|
||||||
|
++i;
|
||||||
for(; i != args.end(); ++i)
|
for(; i != args.end(); ++i)
|
||||||
{
|
{
|
||||||
cmClassFile file;
|
cmClassFile file;
|
||||||
file.m_AbstractClass = false;
|
file.m_AbstractClass = false;
|
||||||
file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory());
|
file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory());
|
||||||
m_Makefile->AddClass(file);
|
m_Makefile->AddClass(file, sname);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,8 +55,8 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual const char* GetTerseDocumentation()
|
virtual const char* GetTerseDocumentation()
|
||||||
{
|
{
|
||||||
return "Add a list of source files if the required \n"
|
return "Add a list of source files to the source file list NAME\n"
|
||||||
"variables are set.";
|
"if the required variables are set.";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -65,7 +65,7 @@ public:
|
||||||
virtual const char* GetFullDocumentation()
|
virtual const char* GetFullDocumentation()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
"SOURCE_FILES_REQUIRE(var1 var2 ... SOURCES_BEGIN file1 file2 ...)";
|
"SOURCE_FILES_REQUIRE(var1 var2 ... SOURCES_BEGIN NAME file1 file2 ...)";
|
||||||
}
|
}
|
||||||
|
|
||||||
cmTypeMacro(cmSourceFilesRequireCommand, cmCommand);
|
cmTypeMacro(cmSourceFilesRequireCommand, cmCommand);
|
||||||
|
|
|
@ -53,35 +53,32 @@ bool cmSourceGroup::Matches(const char* name)
|
||||||
* If the command also already exists, the given dependencies and outputs
|
* If the command also already exists, the given dependencies and outputs
|
||||||
* are added to it.
|
* are added to it.
|
||||||
*/
|
*/
|
||||||
void cmSourceGroup::AddCustomCommand(const char* source,
|
void cmSourceGroup::AddCustomCommand(const cmCustomCommand &cmd)
|
||||||
const char* command,
|
|
||||||
const std::vector<std::string>& depends,
|
|
||||||
const std::vector<std::string>& outputs)
|
|
||||||
{
|
{
|
||||||
CustomCommands::iterator s = m_CustomCommands.find(source);
|
CustomCommands::iterator s = m_CustomCommands.find(cmd.m_Source);
|
||||||
if(s == m_CustomCommands.end())
|
if(s == m_CustomCommands.end())
|
||||||
{
|
{
|
||||||
// The source was not found. Add it with this command.
|
// The source was not found. Add it with this command.
|
||||||
m_CustomCommands[source][command].m_Depends.insert(depends.begin(),
|
m_CustomCommands[cmd.m_Source][cmd.m_Command].
|
||||||
depends.end());
|
m_Depends.insert(cmd.m_Depends.begin(),cmd.m_Depends.end());
|
||||||
m_CustomCommands[source][command].m_Outputs.insert(outputs.begin(),
|
m_CustomCommands[cmd.m_Source][cmd.m_Command].
|
||||||
outputs.end());
|
m_Outputs.insert(cmd.m_Outputs.begin(),cmd.m_Outputs.end());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The source already exists. See if the command exists.
|
// The source already exists. See if the command exists.
|
||||||
Commands& commands = s->second;
|
Commands& commands = s->second;
|
||||||
Commands::iterator c = commands.find(command);
|
Commands::iterator c = commands.find(cmd.m_Command);
|
||||||
if(c == commands.end())
|
if(c == commands.end())
|
||||||
{
|
{
|
||||||
// The command did not exist. Add it.
|
// The command did not exist. Add it.
|
||||||
commands[command].m_Depends.insert(depends.begin(), depends.end());
|
commands[cmd.m_Command].m_Depends.insert(cmd.m_Depends.begin(), cmd.m_Depends.end());
|
||||||
commands[command].m_Outputs.insert(outputs.begin(), outputs.end());
|
commands[cmd.m_Command].m_Outputs.insert(cmd.m_Outputs.begin(), cmd.m_Outputs.end());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The command already exists for this source. Merge the sets.
|
// The command already exists for this source. Merge the sets.
|
||||||
CommandFiles& commandFiles = c->second;
|
CommandFiles& commandFiles = c->second;
|
||||||
commandFiles.m_Depends.insert(depends.begin(), depends.end());
|
commandFiles.m_Depends.insert(cmd.m_Depends.begin(), cmd.m_Depends.end());
|
||||||
commandFiles.m_Outputs.insert(outputs.begin(), outputs.end());
|
commandFiles.m_Outputs.insert(cmd.m_Outputs.begin(), cmd.m_Outputs.end());
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "cmStandardIncludes.h"
|
#include "cmStandardIncludes.h"
|
||||||
#include "cmRegularExpression.h"
|
#include "cmRegularExpression.h"
|
||||||
|
#include "cmCustomCommand.h"
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
/** \class cmSourceGroup
|
/** \class cmSourceGroup
|
||||||
|
@ -58,10 +59,7 @@ public:
|
||||||
{ m_GroupRegex.compile(regex); }
|
{ m_GroupRegex.compile(regex); }
|
||||||
void AddSource(const char* name)
|
void AddSource(const char* name)
|
||||||
{ m_Sources.push_back(name); }
|
{ m_Sources.push_back(name); }
|
||||||
void AddCustomCommand(const char* source,
|
void AddCustomCommand(const cmCustomCommand &cmd);
|
||||||
const char* command,
|
|
||||||
const std::vector<std::string>& depends,
|
|
||||||
const std::vector<std::string>& outputs);
|
|
||||||
const char* GetName() const
|
const char* GetName() const
|
||||||
{ return m_Name.c_str(); }
|
{ return m_Name.c_str(); }
|
||||||
const std::vector<std::string>& GetSources() const
|
const std::vector<std::string>& GetSources() const
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*=========================================================================
|
||||||
|
|
||||||
|
Program: Insight Segmentation & Registration Toolkit
|
||||||
|
Module: $RCSfile$
|
||||||
|
Language: C++
|
||||||
|
Date: $Date$
|
||||||
|
Version: $Revision$
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 2000 National Library of Medicine
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
See COPYRIGHT.txt for copyright details.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
#ifndef cmTarget_h
|
||||||
|
#define cmTarget_h
|
||||||
|
|
||||||
|
#include "cmStandardIncludes.h"
|
||||||
|
#include "cmCustomCommand.h"
|
||||||
|
|
||||||
|
/** \class cmTarget
|
||||||
|
* \brief Represent a library or executable target loaded from a makefile.
|
||||||
|
*
|
||||||
|
* cmTarget represents a target loaded from
|
||||||
|
* a makefile.
|
||||||
|
*/
|
||||||
|
class cmTarget
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::vector<cmCustomCommand> m_CustomCommands;
|
||||||
|
bool m_IsALibrary;
|
||||||
|
std::vector<std::string> m_SourceLists;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::map<std::string,cmTarget> cmTargets;
|
||||||
|
|
||||||
|
#endif
|
|
@ -18,18 +18,7 @@
|
||||||
// cmExecutableCommand
|
// cmExecutableCommand
|
||||||
bool cmTestsCommand::Invoke(std::vector<std::string>& args)
|
bool cmTestsCommand::Invoke(std::vector<std::string>& args)
|
||||||
{
|
{
|
||||||
if(args.size() < 1 )
|
// does nothing in CMake
|
||||||
{
|
|
||||||
this->SetError("called with incorrect number of arguments");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for(std::vector<std::string>::iterator i = args.begin();
|
|
||||||
i != args.end(); ++i)
|
|
||||||
{
|
|
||||||
cmClassFile file;
|
|
||||||
file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory());
|
|
||||||
m_Makefile->AddExecutable(file);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,49 +54,140 @@ void cmUnixMakefileGenerator::OutputMakefile(const char* file)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this->OutputMakeFlags(fout);
|
this->OutputMakeFlags(fout);
|
||||||
this->OutputSourceToObjectList(fout);
|
|
||||||
this->OutputVerbatim(fout);
|
this->OutputVerbatim(fout);
|
||||||
this->OutputExecutableRules(fout);
|
this->OutputTargetRules(fout);
|
||||||
|
this->OutputLinkLibs(fout);
|
||||||
|
this->OutputTargets(fout);
|
||||||
this->OutputSubDirectoryRules(fout);
|
this->OutputSubDirectoryRules(fout);
|
||||||
this->OutputObjectDepends(fout);
|
this->OutputObjectDepends(fout);
|
||||||
this->OutputCustomRules(fout);
|
this->OutputCustomRules(fout);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Output the LIBRARY and SRC_OBJS list based on
|
// Output the rules for any targets
|
||||||
// the library name and cmClassFile objects in the
|
void cmUnixMakefileGenerator::OutputTargetRules(std::ostream& fout)
|
||||||
// makefile
|
|
||||||
void cmUnixMakefileGenerator::OutputSourceToObjectList(std::ostream& fout)
|
|
||||||
{
|
{
|
||||||
std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
|
// for each target add to the list of targets
|
||||||
if(Classes.size() == 0)
|
fout << "TARGETS = ";
|
||||||
|
const cmTargets &tgts = m_Makefile->GetTargets();
|
||||||
|
for(cmTargets::const_iterator l = tgts.begin();
|
||||||
|
l != tgts.end(); l++)
|
||||||
{
|
{
|
||||||
return;
|
if (l->second.m_IsALibrary)
|
||||||
}
|
|
||||||
// Ouput Library name if there are SRC_OBJS
|
|
||||||
if(strlen(m_Makefile->GetLibraryName()) > 0)
|
|
||||||
{
|
{
|
||||||
fout << "LIBRARY = " << m_Makefile->GetLibraryName() << "\n\n";
|
fout << " \\\nlib" << l->first.c_str() << "${CMAKE_LIB_EXT}";
|
||||||
fout << "BUILD_LIB_FILE = lib${LIBRARY}${CMAKE_LIB_EXT}\n\n";
|
|
||||||
}
|
|
||||||
// Output SRC_OBJ list for all the classes to be compiled
|
|
||||||
fout << "SRC_OBJ = \\\n";
|
|
||||||
for(unsigned int i = 0; i < Classes.size(); i++)
|
|
||||||
{
|
|
||||||
if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly
|
|
||||||
&& !Classes[i].m_IsExecutable)
|
|
||||||
{
|
|
||||||
fout << Classes[i].m_ClassName << ".o ";
|
|
||||||
if(i == Classes.size() -1)
|
|
||||||
{
|
|
||||||
fout << "\n\n";
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fout << "\\\n";
|
fout << "\\\n" << l->first.c_str();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fout << "\n\n";
|
||||||
|
|
||||||
|
// get the classes from the source lists then add them to the groups
|
||||||
|
for(cmTargets::const_iterator l = tgts.begin();
|
||||||
|
l != tgts.end(); l++)
|
||||||
|
{
|
||||||
|
std::vector<cmClassFile> classes =
|
||||||
|
m_Makefile->GetClassesFromSourceLists(l->second.m_SourceLists);
|
||||||
|
fout << l->first << "_SRC_OBJS = ";
|
||||||
|
for(std::vector<cmClassFile>::iterator i = classes.begin();
|
||||||
|
i != classes.end(); i++)
|
||||||
|
{
|
||||||
|
if(!i->m_HeaderFileOnly)
|
||||||
|
{
|
||||||
|
fout << "\\\n" << i->m_ClassName << ".o ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fout << "\n\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output the rules for any targets
|
||||||
|
void cmUnixMakefileGenerator::OutputLinkLibs(std::ostream& fout)
|
||||||
|
{
|
||||||
|
// collect all the flags needed for linking libraries
|
||||||
|
std::string linkLibs;
|
||||||
|
std::vector<std::string>::iterator j;
|
||||||
|
std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
|
||||||
|
for(j = libdirs.begin(); j != libdirs.end(); ++j)
|
||||||
|
{
|
||||||
|
std::string::size_type pos = (*j).find("-L");
|
||||||
|
if((pos == std::string::npos || pos > 0)
|
||||||
|
&& (*j).find("${") == std::string::npos)
|
||||||
|
{
|
||||||
|
linkLibs += "-L";
|
||||||
|
}
|
||||||
|
linkLibs += *j;
|
||||||
|
linkLibs += " ";
|
||||||
|
}
|
||||||
|
std::string librariesLinked;
|
||||||
|
std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
|
||||||
|
for(j = libs.begin(); j != libs.end(); ++j)
|
||||||
|
{
|
||||||
|
std::string::size_type pos = (*j).find("-l");
|
||||||
|
if((pos == std::string::npos || pos > 0)
|
||||||
|
&& (*j).find("${") == std::string::npos)
|
||||||
|
{
|
||||||
|
librariesLinked += "-l";
|
||||||
|
}
|
||||||
|
librariesLinked += *j;
|
||||||
|
librariesLinked += " ";
|
||||||
|
}
|
||||||
|
// Add these in twice so order does not matter
|
||||||
|
linkLibs += librariesLinked;
|
||||||
|
linkLibs += librariesLinked;
|
||||||
|
|
||||||
|
std::vector<std::string>& libsUnix = m_Makefile->GetLinkLibrariesUnix();
|
||||||
|
for(j = libsUnix.begin(); j != libsUnix.end(); ++j)
|
||||||
|
{
|
||||||
|
linkLibs += *j;
|
||||||
|
linkLibs += " ";
|
||||||
|
}
|
||||||
|
linkLibs += " ${LOCAL_LINK_FLAGS} ";
|
||||||
|
fout << "CMAKE_LINK_LIBS = " << linkLibs << "\n\n";
|
||||||
|
// create and output a varible in the makefile that
|
||||||
|
// each executable will depend on. This will have all the
|
||||||
|
// libraries that the executable uses
|
||||||
|
fout << "CMAKE_DEPEND_LIBS = ";
|
||||||
|
this->OutputDependencies(fout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmUnixMakefileGenerator::OutputTargets(std::ostream& fout)
|
||||||
|
{
|
||||||
|
// for each target
|
||||||
|
const cmTargets &tgts = m_Makefile->GetTargets();
|
||||||
|
for(cmTargets::const_iterator l = tgts.begin();
|
||||||
|
l != tgts.end(); l++)
|
||||||
|
{
|
||||||
|
if (l->second.m_IsALibrary)
|
||||||
|
{
|
||||||
|
fout << "#---------------------------------------------------------\n";
|
||||||
|
fout << "# rules for a library\n";
|
||||||
|
fout << "#\n";
|
||||||
|
fout << "lib" << l->first << ".a: ${KIT_OBJ} ${" <<
|
||||||
|
l->first << "_SRC_OBJS} \n";
|
||||||
|
fout << "\t${AR} cr lib" << l->first << ".a ${KIT_OBJ} ${" <<
|
||||||
|
l->first << "_SRC_OBJS} \n";
|
||||||
|
fout << "\t${RANLIB} lib" << l->first << ".a\n";
|
||||||
|
fout << std::endl;
|
||||||
|
|
||||||
|
fout << "lib" << l->first << "$(SHLIB_SUFFIX): ${KIT_OBJ} ${" <<
|
||||||
|
l->first << "_SRC_OBJS} \n";
|
||||||
|
fout << "\trm -f lib" << l->first << "$(SHLIB_SUFFIX)\n";
|
||||||
|
fout << "\t$(CXX) ${CXX_FLAGS} ${CMAKE_SHLIB_BUILD_FLAGS} -o \\\n";
|
||||||
|
fout << "\t lib" << l->first << "$(SHLIB_SUFFIX) \\\n";
|
||||||
|
fout << "\t ${KIT_OBJ} ${" << l->first <<
|
||||||
|
"_SRC_OBJS} ${SHLIB_LD_LIBS}\n\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fout << l->first << ": ${" <<
|
||||||
|
l->first << "_SRC_OBJS} ${CMAKE_DEPEND_LIBS}\n";
|
||||||
|
fout << "\t${CXX} ${CXX_FLAGS} ${" <<
|
||||||
|
l->first << "_SRC_OBJS} ${CMAKE_LINK_LIBS} -o "
|
||||||
|
<< l->first << "\n\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fout << "\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -171,7 +262,7 @@ void cmUnixMakefileGenerator::OutputMakeFlags(std::ostream& fout)
|
||||||
}
|
}
|
||||||
fout << m_Makefile->GetDefineFlags();
|
fout << m_Makefile->GetDefineFlags();
|
||||||
fout << " ${LOCAL_INCLUDE_FLAGS} ";
|
fout << " ${LOCAL_INCLUDE_FLAGS} ";
|
||||||
fout << "\n";
|
fout << "\n\n";
|
||||||
fout << "default_target: all\n\n";
|
fout << "default_target: all\n\n";
|
||||||
// see if there are files to compile in this makefile
|
// see if there are files to compile in this makefile
|
||||||
// These are used for both libraries and executables
|
// These are used for both libraries and executables
|
||||||
|
@ -190,92 +281,6 @@ void cmUnixMakefileGenerator::OutputVerbatim(std::ostream& fout)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// output executables
|
|
||||||
void cmUnixMakefileGenerator::OutputExecutableRules(std::ostream& fout)
|
|
||||||
{
|
|
||||||
if(!m_Makefile->HasExecutables())
|
|
||||||
{
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
// collect all the flags needed for linking libraries
|
|
||||||
std::string linkLibs;
|
|
||||||
std::vector<std::string>::iterator j;
|
|
||||||
std::vector<std::string>& libdirs = m_Makefile->GetLinkDirectories();
|
|
||||||
for(j = libdirs.begin(); j != libdirs.end(); ++j)
|
|
||||||
{
|
|
||||||
std::string::size_type pos = (*j).find("-L");
|
|
||||||
if((pos == std::string::npos || pos > 0)
|
|
||||||
&& (*j).find("${") == std::string::npos)
|
|
||||||
{
|
|
||||||
linkLibs += "-L";
|
|
||||||
}
|
|
||||||
linkLibs += *j;
|
|
||||||
linkLibs += " ";
|
|
||||||
}
|
|
||||||
std::string librariesLinked;
|
|
||||||
std::vector<std::string>& libs = m_Makefile->GetLinkLibraries();
|
|
||||||
for(j = libs.begin(); j != libs.end(); ++j)
|
|
||||||
{
|
|
||||||
std::string::size_type pos = (*j).find("-l");
|
|
||||||
if((pos == std::string::npos || pos > 0)
|
|
||||||
&& (*j).find("${") == std::string::npos)
|
|
||||||
{
|
|
||||||
librariesLinked += "-l";
|
|
||||||
}
|
|
||||||
librariesLinked += *j;
|
|
||||||
librariesLinked += " ";
|
|
||||||
}
|
|
||||||
// Add these in twice so order does not matter
|
|
||||||
linkLibs += librariesLinked;
|
|
||||||
linkLibs += librariesLinked;
|
|
||||||
|
|
||||||
std::vector<std::string>& libsUnix = m_Makefile->GetLinkLibrariesUnix();
|
|
||||||
for(j = libsUnix.begin(); j != libsUnix.end(); ++j)
|
|
||||||
{
|
|
||||||
linkLibs += *j;
|
|
||||||
linkLibs += " ";
|
|
||||||
}
|
|
||||||
linkLibs += " ${LOCAL_LINK_FLAGS} ";
|
|
||||||
// create and output a varible in the makefile that
|
|
||||||
// each executable will depend on. This will have all the
|
|
||||||
// libraries that the executable uses
|
|
||||||
fout << "CMAKE_DEPEND_LIBS = ";
|
|
||||||
this->OutputDependencies(fout);
|
|
||||||
// Now create rules for all of the executables to be built
|
|
||||||
std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
|
|
||||||
for(unsigned int i = 0; i < Classes.size(); i++)
|
|
||||||
{
|
|
||||||
if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly
|
|
||||||
&& Classes[i].m_IsExecutable)
|
|
||||||
{
|
|
||||||
std::string DotO = Classes[i].m_ClassName;
|
|
||||||
DotO += ".o";
|
|
||||||
fout << Classes[i].m_ClassName << ": " << DotO << " ";
|
|
||||||
fout << "${CMAKE_DEPEND_LIBS}\n";
|
|
||||||
fout << "\t${CXX} ${CXX_FLAGS} "
|
|
||||||
<< DotO.c_str() << " "
|
|
||||||
<< linkLibs.c_str()
|
|
||||||
<< " -o $@ ""\n\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// ouput the list of executables
|
|
||||||
fout << "EXECUTABLES = \\\n";
|
|
||||||
for(unsigned int i = 0; i < Classes.size(); i++)
|
|
||||||
{
|
|
||||||
if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly
|
|
||||||
&& Classes[i].m_IsExecutable)
|
|
||||||
{
|
|
||||||
fout << Classes[i].m_ClassName;
|
|
||||||
if(i < Classes.size()-1)
|
|
||||||
{
|
|
||||||
fout << " \\";
|
|
||||||
}
|
|
||||||
fout << "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fout << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
// fix up names of directories so they can be used
|
// fix up names of directories so they can be used
|
||||||
// as targets in makefiles.
|
// as targets in makefiles.
|
||||||
inline std::string FixDirectoryName(const char* dir)
|
inline std::string FixDirectoryName(const char* dir)
|
||||||
|
@ -365,19 +370,23 @@ void cmUnixMakefileGenerator::OutputSubDirectoryRules(std::ostream& fout)
|
||||||
// by the class cmMakeDepend GenerateMakefile
|
// by the class cmMakeDepend GenerateMakefile
|
||||||
void cmUnixMakefileGenerator::OutputObjectDepends(std::ostream& fout)
|
void cmUnixMakefileGenerator::OutputObjectDepends(std::ostream& fout)
|
||||||
{
|
{
|
||||||
std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
|
cmMakefile::ClassMap &Classes = m_Makefile->GetClasses();
|
||||||
for(unsigned int i = 0; i < Classes.size(); i++)
|
for(cmMakefile::ClassMap::iterator l = Classes.begin();
|
||||||
|
l != Classes.end(); l++)
|
||||||
{
|
{
|
||||||
if(!Classes[i].m_AbstractClass && !Classes[i].m_HeaderFileOnly)
|
for(std::vector<cmClassFile>::iterator i = l->second.begin();
|
||||||
|
i != l->second.end(); i++)
|
||||||
{
|
{
|
||||||
if( Classes[i].m_Depends.size())
|
if(!i->m_HeaderFileOnly)
|
||||||
{
|
{
|
||||||
fout << Classes[i].m_ClassName << ".o : \\\n";
|
if(i->m_Depends.size())
|
||||||
|
{
|
||||||
|
fout << i->m_ClassName << ".o : \\\n";
|
||||||
for(std::vector<std::string>::iterator j =
|
for(std::vector<std::string>::iterator j =
|
||||||
Classes[i].m_Depends.begin();
|
i->m_Depends.begin();
|
||||||
j != Classes[i].m_Depends.end(); ++j)
|
j != i->m_Depends.end(); ++j)
|
||||||
{
|
{
|
||||||
if(j+1 == Classes[i].m_Depends.end())
|
if(j+1 == i->m_Depends.end())
|
||||||
{
|
{
|
||||||
fout << *j << " \n";
|
fout << *j << " \n";
|
||||||
}
|
}
|
||||||
|
@ -391,6 +400,7 @@ void cmUnixMakefileGenerator::OutputObjectDepends(std::ostream& fout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Output each custom rule in the following format:
|
// Output each custom rule in the following format:
|
||||||
|
@ -398,12 +408,33 @@ void cmUnixMakefileGenerator::OutputObjectDepends(std::ostream& fout)
|
||||||
// (tab) command...
|
// (tab) command...
|
||||||
void cmUnixMakefileGenerator::OutputCustomRules(std::ostream& fout)
|
void cmUnixMakefileGenerator::OutputCustomRules(std::ostream& fout)
|
||||||
{
|
{
|
||||||
|
// We may be modifying the source groups temporarily, so make a copy.
|
||||||
|
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
|
||||||
|
|
||||||
|
const cmTargets &tgts = m_Makefile->GetTargets();
|
||||||
|
for(cmTargets::const_iterator tgt = tgts.begin();
|
||||||
|
tgt != tgts.end(); ++tgt)
|
||||||
|
{
|
||||||
|
// add any custom rules to the source groups
|
||||||
|
for (std::vector<cmCustomCommand>::const_iterator cr =
|
||||||
|
tgt->second.m_CustomCommands.begin();
|
||||||
|
cr != tgt->second.m_CustomCommands.end(); ++cr)
|
||||||
|
{
|
||||||
|
cmSourceGroup& sourceGroup =
|
||||||
|
m_Makefile->FindSourceGroup(cr->m_Source.c_str(),
|
||||||
|
sourceGroups);
|
||||||
|
cmCustomCommand cc(*cr);
|
||||||
|
cc.ExpandVariables(*m_Makefile);
|
||||||
|
sourceGroup.AddCustomCommand(cc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Loop through every source group.
|
// Loop through every source group.
|
||||||
for(std::vector<cmSourceGroup>::const_iterator sg =
|
for(std::vector<cmSourceGroup>::const_iterator sg =
|
||||||
m_Makefile->GetSourceGroups().begin();
|
sourceGroups.begin(); sg != sourceGroups.end(); ++sg)
|
||||||
sg != m_Makefile->GetSourceGroups().end(); ++sg)
|
|
||||||
{
|
{
|
||||||
const cmSourceGroup::CustomCommands& customCommands = sg->GetCustomCommands();
|
const cmSourceGroup::CustomCommands& customCommands =
|
||||||
|
sg->GetCustomCommands();
|
||||||
if(customCommands.empty())
|
if(customCommands.empty())
|
||||||
{ continue; }
|
{ continue; }
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,9 @@ protected:
|
||||||
void OutputMakefile(const char* file);
|
void OutputMakefile(const char* file);
|
||||||
void OutputMakeFlags(std::ostream&);
|
void OutputMakeFlags(std::ostream&);
|
||||||
void OutputVerbatim(std::ostream&);
|
void OutputVerbatim(std::ostream&);
|
||||||
void OutputSourceToObjectList(std::ostream& fout);
|
void OutputTargetRules(std::ostream& fout);
|
||||||
void OutputExecutableRules(std::ostream&);
|
void OutputLinkLibs(std::ostream& fout);
|
||||||
|
void OutputTargets(std::ostream&);
|
||||||
void OutputSubDirectoryRules(std::ostream&);
|
void OutputSubDirectoryRules(std::ostream&);
|
||||||
void OutputDependInformation(std::ostream&);
|
void OutputDependInformation(std::ostream&);
|
||||||
void OutputDependencies(std::ostream&);
|
void OutputDependencies(std::ostream&);
|
||||||
|
|
|
@ -23,16 +23,21 @@ bool cmWrapExcludeFilesCommand::Invoke(std::vector<std::string>& args)
|
||||||
this->SetError("called with incorrect number of arguments");
|
this->SetError("called with incorrect number of arguments");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cmMakefile::ClassMap &Classes = m_Makefile->GetClasses();
|
||||||
for(std::vector<std::string>::iterator j = args.begin();
|
for(std::vector<std::string>::iterator j = args.begin();
|
||||||
j != args.end(); ++j)
|
j != args.end(); ++j)
|
||||||
{
|
{
|
||||||
std::vector<cmClassFile>& Classes = m_Makefile->GetClasses();
|
for(cmMakefile::ClassMap::iterator l = Classes.begin();
|
||||||
for(unsigned int i = 0; i < Classes.size(); i++)
|
l != Classes.end(); l++)
|
||||||
{
|
{
|
||||||
if(Classes[i].m_ClassName == (*j))
|
for(std::vector<cmClassFile>::iterator i = l->second.begin();
|
||||||
|
i != l->second.end(); i++)
|
||||||
{
|
{
|
||||||
Classes[i].m_WrapExclude = true;
|
if(i->m_ClassName == (*j))
|
||||||
break;
|
{
|
||||||
|
i->m_WrapExclude = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
// cmWrapTclCommand
|
// cmWrapTclCommand
|
||||||
bool cmWrapTclCommand::Invoke(std::vector<std::string>& args)
|
bool cmWrapTclCommand::Invoke(std::vector<std::string>& args)
|
||||||
{
|
{
|
||||||
if(args.size() > 0 )
|
if(args.size() < 3 )
|
||||||
{
|
{
|
||||||
this->SetError("called with incorrect number of arguments");
|
this->SetError("called with incorrect number of arguments");
|
||||||
return false;
|
return false;
|
||||||
|
@ -44,17 +44,25 @@ bool cmWrapTclCommand::Invoke(std::vector<std::string>& args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the list of classes for this library
|
|
||||||
std::vector<cmClassFile> &classes = m_Makefile->GetClasses();
|
|
||||||
|
|
||||||
// add in new classes for the wrappers
|
|
||||||
int lastClass = classes.size();
|
|
||||||
// what is the current source dir
|
// what is the current source dir
|
||||||
std::string cdir = m_Makefile->GetCurrentDirectory();
|
std::string cdir = m_Makefile->GetCurrentDirectory();
|
||||||
|
|
||||||
for(int classNum = 0; classNum < lastClass; classNum++)
|
// keep the library name
|
||||||
|
m_LibraryName = args[0];
|
||||||
|
m_SourceList = args[1];
|
||||||
|
|
||||||
|
// get the list of classes for this library
|
||||||
|
cmMakefile::ClassMap &Classes = m_Makefile->GetClasses();
|
||||||
|
for(std::vector<std::string>::iterator j = (args.begin() + 2);
|
||||||
|
j != args.end(); ++j)
|
||||||
{
|
{
|
||||||
cmClassFile &curr = classes[classNum];
|
for(cmMakefile::ClassMap::iterator l = Classes.begin();
|
||||||
|
l != Classes.end(); l++)
|
||||||
|
{
|
||||||
|
for(std::vector<cmClassFile>::iterator i = l->second.begin();
|
||||||
|
i != l->second.end(); i++)
|
||||||
|
{
|
||||||
|
cmClassFile &curr = *i;
|
||||||
// if we should wrap the class
|
// if we should wrap the class
|
||||||
if (!curr.m_WrapExclude)
|
if (!curr.m_WrapExclude)
|
||||||
{
|
{
|
||||||
|
@ -63,11 +71,16 @@ bool cmWrapTclCommand::Invoke(std::vector<std::string>& args)
|
||||||
std::string newName = curr.m_ClassName + "Tcl";
|
std::string newName = curr.m_ClassName + "Tcl";
|
||||||
file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(),
|
file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(),
|
||||||
"cxx",false);
|
"cxx",false);
|
||||||
m_WrapClasses.push_back(file);
|
|
||||||
std::string hname = cdir + "/" + curr.m_ClassName + ".h";
|
std::string hname = cdir + "/" + curr.m_ClassName + ".h";
|
||||||
m_WrapHeaders.push_back(hname);
|
m_WrapHeaders.push_back(hname);
|
||||||
|
// add starting depends
|
||||||
|
file.m_Depends.push_back(hname);
|
||||||
|
m_WrapClasses.push_back(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,35 +92,31 @@ void cmWrapTclCommand::FinalPass()
|
||||||
std::string wtcl = "${WRAP_TCL_EXE}";
|
std::string wtcl = "${WRAP_TCL_EXE}";
|
||||||
std::string hints = "${WRAP_HINTS}";
|
std::string hints = "${WRAP_HINTS}";
|
||||||
|
|
||||||
m_Makefile->ExpandVariablesInString(wtcl);
|
|
||||||
m_Makefile->ExpandVariablesInString(hints);
|
|
||||||
|
|
||||||
// Create the init file
|
// Create the init file
|
||||||
std::string res = m_Makefile->GetLibraryName();
|
std::string res = m_LibraryName;
|
||||||
res += "Init.cxx";
|
res += "Init.cxx";
|
||||||
this->CreateInitFile(res);
|
this->CreateInitFile(res);
|
||||||
|
|
||||||
// add the init file
|
// add the init file
|
||||||
cmClassFile cfile;
|
cmClassFile cfile;
|
||||||
cfile.m_AbstractClass = false;
|
cfile.m_AbstractClass = false;
|
||||||
std::string newName = m_Makefile->GetLibraryName();
|
std::string newName = m_LibraryName;
|
||||||
newName += "Init";
|
newName += "Init";
|
||||||
cfile.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(),
|
cfile.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(),
|
||||||
"cxx",false);
|
"cxx",false);
|
||||||
m_Makefile->AddClass(cfile);
|
m_Makefile->AddClass(cfile,m_SourceList.c_str());
|
||||||
|
|
||||||
// wrap all the .h files
|
// wrap all the .h files
|
||||||
depends.push_back(wtcl);
|
depends.push_back(wtcl);
|
||||||
for(int classNum = 0; classNum < lastClass; classNum++)
|
for(int classNum = 0; classNum < lastClass; classNum++)
|
||||||
{
|
{
|
||||||
m_Makefile->AddClass(m_WrapClasses[classNum]);
|
m_Makefile->AddClass(m_WrapClasses[classNum],m_SourceList.c_str());
|
||||||
std::string res = m_WrapClasses[classNum].m_ClassName + ".cxx";
|
std::string res = m_WrapClasses[classNum].m_ClassName + ".cxx";
|
||||||
std::string cmd = wtcl + " " + m_WrapHeaders[classNum] + " "
|
std::string cmd = wtcl + " " + m_WrapHeaders[classNum] + " "
|
||||||
+ hints + (m_WrapClasses[classNum].m_AbstractClass ? " 0 " : " 1 ") + " > " + m_WrapClasses[classNum].m_ClassName + ".cxx";
|
+ hints + (m_WrapClasses[classNum].m_AbstractClass ? " 0 " : " 1 ") + " > " + m_WrapClasses[classNum].m_ClassName + ".cxx";
|
||||||
m_Makefile->AddCustomCommand(m_WrapHeaders[classNum].c_str(),
|
m_Makefile->AddCustomCommand(m_WrapHeaders[classNum].c_str(),
|
||||||
cmd.c_str(),
|
cmd.c_str(), depends,
|
||||||
depends,
|
res.c_str(), m_LibraryName.c_str());
|
||||||
res.c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -117,7 +126,7 @@ bool cmWrapTclCommand::CreateInitFile(std::string& res)
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
/* we have to make sure that the name is the correct case */
|
/* we have to make sure that the name is the correct case */
|
||||||
std::string kitName = m_Makefile->GetLibraryName();
|
std::string kitName = m_LibraryName;
|
||||||
if (kitName[0] > 90) kitName[0] -= 32;
|
if (kitName[0] > 90) kitName[0] -= 32;
|
||||||
for (i = 1; i < kitName.size(); i++)
|
for (i = 1; i < kitName.size(); i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -61,7 +61,7 @@ public:
|
||||||
virtual const char* GetFullDocumentation()
|
virtual const char* GetFullDocumentation()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
"WRAP_TCL()";
|
"WRAP_TCL(resultingLibraryName SourceListName SourceLists ...)";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,6 +74,8 @@ public:
|
||||||
private:
|
private:
|
||||||
std::vector<cmClassFile> m_WrapClasses;
|
std::vector<cmClassFile> m_WrapClasses;
|
||||||
std::vector<std::string> m_WrapHeaders;
|
std::vector<std::string> m_WrapHeaders;
|
||||||
|
std::string m_LibraryName;
|
||||||
|
std::string m_SourceList;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue