diff options
author | Ken Martin <ken.martin@kitware.com> | 2002-10-03 19:14:32 (GMT) |
---|---|---|
committer | Ken Martin <ken.martin@kitware.com> | 2002-10-03 19:14:32 (GMT) |
commit | 599114fc706c005c853e2bbfd6b9ec0f49b2ce57 (patch) | |
tree | 1678582a95fa4f9009eb7b6d80fb2d5e5affeec7 /Source/cmGlobalCodeWarriorGenerator.cxx | |
parent | 9f5cf38290758d854aaf965f726a84bdf04eb814 (diff) | |
download | CMake-599114fc706c005c853e2bbfd6b9ec0f49b2ce57.zip CMake-599114fc706c005c853e2bbfd6b9ec0f49b2ce57.tar.gz CMake-599114fc706c005c853e2bbfd6b9ec0f49b2ce57.tar.bz2 |
under development
Diffstat (limited to 'Source/cmGlobalCodeWarriorGenerator.cxx')
-rw-r--r-- | Source/cmGlobalCodeWarriorGenerator.cxx | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/Source/cmGlobalCodeWarriorGenerator.cxx b/Source/cmGlobalCodeWarriorGenerator.cxx new file mode 100644 index 0000000..9e08bc9 --- /dev/null +++ b/Source/cmGlobalCodeWarriorGenerator.cxx @@ -0,0 +1,282 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Insight Consortium. All rights reserved. + See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "cmGlobalCodeWarriorGenerator.h" +#include "cmLocalCodeWarriorGenerator.h" +#include "cmMakefile.h" +#include "cmake.h" +#include "cmTarget.h" +#include "windows.h" + +void cmGlobalCodeWarriorGenerator::EnableLanguage(const char*, + cmMakefile *mf) +{ + // now load the settings + if(!mf->GetDefinition("CMAKE_ROOT")) + { + cmSystemTools::Error( + "CMAKE_ROOT has not been defined, bad GUI or driver program"); + return; + } + if(!this->GetLanguageEnabled("CXX")) + { + std::string fpath = + mf->GetDefinition("CMAKE_ROOT"); + fpath += "/Templates/CMakeDotNetSystemConfig.cmake"; + mf->ReadListFile(NULL,fpath.c_str()); + this->SetLanguageEnabled("CXX"); + } +} + +int cmGlobalCodeWarriorGenerator::TryCompile(const char *, + const char *bindir, + const char *projectName, + const char *targetName, + std::string *output) +{ + return 1; +} + +///! Create a local generator appropriate to this Global Generator +cmLocalGenerator *cmGlobalCodeWarriorGenerator::CreateLocalGenerator() +{ + cmLocalGenerator *lg = new cmLocalCodeWarriorGenerator; + lg->SetGlobalGenerator(this); + return lg; +} + +void cmGlobalCodeWarriorGenerator::Generate() +{ + // first do the superclass method + this->cmGlobalGenerator::Generate(); + + // Now write out the Project File + this->OutputProject(); +} + +void cmGlobalCodeWarriorGenerator::OutputProject() +{ + // if this is an out of source build, create the output directory + if(strcmp(m_CMakeInstance->GetStartOutputDirectory(), + m_CMakeInstance->GetHomeDirectory()) != 0) + { + if(!cmSystemTools::MakeDirectory(m_CMakeInstance->GetStartOutputDirectory())) + { + cmSystemTools::Error("Error creating output directory for Project file", + m_CMakeInstance->GetStartOutputDirectory()); + } + } + // create the project file name + std::string fname; + fname = m_CMakeInstance->GetStartOutputDirectory(); + fname += "/"; + if(strlen(m_LocalGenerators[0]->GetMakefile()->GetProjectName()) == 0) + { + m_LocalGenerators[0]->GetMakefile()->SetProjectName("Project"); + } + fname += m_LocalGenerators[0]->GetMakefile()->GetProjectName(); + fname += ".xml"; + std::ofstream fout(fname.c_str()); + if(!fout) + { + cmSystemTools::Error("Error can not open project file for write: " + ,fname.c_str()); + return; + } + this->WriteProject(fout); +} + +void cmGlobalCodeWarriorGenerator::WriteProject(std::ostream& fout) +{ + // Write out the header for a SLN file + this->WriteProjectHeader(fout); + + // start the project + fout << "<PROJECT>\n"; + + // write the target list + this->WriteTargetList(fout); + + // write the target order + this->WriteTargetOrder(fout); + + // write the group list + this->WriteGroupList(fout); + + // close the project + fout << "</PROJECT>\n"; +} + +void cmGlobalCodeWarriorGenerator::WriteProjectHeader(std::ostream& fout) +{ + fout << "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n"; + fout << "<?codewarrior exportversion=\"1.0.1\" ideversion=\"5.0\" ?>\n"; + + fout << "<!DOCTYPE PROJECT [\n"; + fout << "<!ELEMENT PROJECT (TARGETLIST, TARGETORDER, GROUPLIST, DESIGNLIST?)>\n"; + fout << "<!ELEMENT TARGETLIST (TARGET+)>\n"; + fout << "<!ELEMENT TARGET (NAME, SETTINGLIST, FILELIST?, LINKORDER?, SEGMENTLIST?, OVERLAYGROUPLIST?, SUBTARGETLIST?, SUBPROJECTLIST?, FRAMEWORKLIST)>\n"; + fout << "<!ELEMENT NAME (#PCDATA)>\n"; + fout << "<!ELEMENT USERSOURCETREETYPE (#PCDATA)>\n"; + fout << "<!ELEMENT PATH (#PCDATA)>\n"; + fout << "<!ELEMENT FILELIST (FILE*)>\n"; + fout << "<!ELEMENT FILE (PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?, ROOTFILEREF?, FILEKIND?, FILEFLAGS?)>\n"; + fout << "<!ELEMENT PATHTYPE (#PCDATA)>\n"; + fout << "<!ELEMENT PATHROOT (#PCDATA)>\n"; + fout << "<!ELEMENT ACCESSPATH (#PCDATA)>\n"; + fout << "<!ELEMENT PATHFORMAT (#PCDATA)>\n"; + fout << "<!ELEMENT ROOTFILEREF (PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?)>\n"; + fout << "<!ELEMENT FILEKIND (#PCDATA)>\n"; + fout << "<!ELEMENT FILEFLAGS (#PCDATA)>\n"; + fout << "<!ELEMENT FILEREF (TARGETNAME?, PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?)>\n"; + fout << "<!ELEMENT TARGETNAME (#PCDATA)>\n"; + fout << "<!ELEMENT SETTINGLIST ((SETTING|PANELDATA)+)>\n"; + fout << "<!ELEMENT SETTING (NAME?, (VALUE|(SETTING+)))>\n"; + fout << "<!ELEMENT PANELDATA (NAME, VALUE)>\n"; + fout << "<!ELEMENT VALUE (#PCDATA)>\n"; + fout << "<!ELEMENT LINKORDER (FILEREF*)>\n"; + fout << "<!ELEMENT SEGMENTLIST (SEGMENT+)>\n"; + fout << "<!ELEMENT SEGMENT (NAME, ATTRIBUTES?, FILEREF*)>\n"; + fout << "<!ELEMENT ATTRIBUTES (#PCDATA)>\n"; + fout << "<!ELEMENT OVERLAYGROUPLIST (OVERLAYGROUP+)>\n"; + fout << "<!ELEMENT OVERLAYGROUP (NAME, BASEADDRESS, OVERLAY*)>\n"; + fout << "<!ELEMENT BASEADDRESS (#PCDATA)>\n"; + fout << "<!ELEMENT OVERLAY (NAME, FILEREF*)>\n"; + fout << "<!ELEMENT SUBTARGETLIST (SUBTARGET+)>\n"; + fout << "<!ELEMENT SUBTARGET (TARGETNAME, ATTRIBUTES?, FILEREF?)>\n"; + fout << "<!ELEMENT SUBPROJECTLIST (SUBPROJECT+)>\n"; + fout << "<!ELEMENT SUBPROJECT (FILEREF, SUBPROJECTTARGETLIST)>\n"; + fout << "<!ELEMENT SUBPROJECTTARGETLIST (SUBPROJECTTARGET*)>\n"; + fout << "<!ELEMENT SUBPROJECTTARGET (TARGETNAME, ATTRIBUTES?, FILEREF?)>\n"; + fout << "<!ELEMENT FRAMEWORKLIST (FRAMEWORK+)>\n"; + fout << "<!ELEMENT FRAMEWORK (FILEREF, LIBRARYFILE?, VERSION?)>\n"; + fout << "<!ELEMENT LIBRARYFILE (FILEREF)>\n"; + fout << "<!ELEMENT VERSION (#PCDATA)>\n"; + fout << "<!ELEMENT TARGETORDER (ORDEREDTARGET|ORDEREDDESIGN)*>\n"; + fout << "<!ELEMENT ORDEREDTARGET (NAME)>\n"; + fout << "<!ELEMENT ORDEREDDESIGN (NAME, ORDEREDTARGET+)>\n"; + fout << "<!ELEMENT GROUPLIST (GROUP|FILEREF)*>\n"; + fout << "<!ELEMENT GROUP (NAME, (GROUP|FILEREF)*)>\n"; + fout << "<!ELEMENT DESIGNLIST (DESIGN+)>\n"; + fout << "<!ELEMENT DESIGN (NAME, DESIGNDATA)>\n"; + fout << "<!ELEMENT DESIGNDATA (#PCDATA)>\n"; + fout << "]>\n\n"; +} + +void cmGlobalCodeWarriorGenerator::WriteTargetList(std::ostream& fout) +{ + fout << "<TARGETLIST>\n"; + + unsigned int i; + // for each local generator + for (i = 0; i < m_LocalGenerators.size(); ++i) + { + static_cast<cmLocalCodeWarriorGenerator *>(m_LocalGenerators[i])->WriteTargets(fout); + } + fout << "</TARGETLIST>\n"; +} + +cmTarget *cmGlobalCodeWarriorGenerator::GetTargetFromName(const char *tgtName) +{ + // for each local generator, and each target + unsigned int i; + for(i = 0; i < m_LocalGenerators.size(); ++i) + { + cmMakefile* mf = m_LocalGenerators[i]->GetMakefile(); + cmTargets &tgts = mf->GetTargets(); + for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); ++l) + { + if (l->first == tgtName) + { + return &(l->second); + } + } + } + return 0; +} + +void cmGlobalCodeWarriorGenerator::ComputeTargetOrder( + std::vector<std::string> &tgtOrder, const char *tgtName, + cmTarget const *target) +{ + // if the target is already listed then we are done + if (std::find(tgtOrder.begin(),tgtOrder.end(),tgtName) != tgtOrder.end()) + { + return; + } + + // otherwise find all this target depends on and add them first + cmTarget::LinkLibraries::const_iterator j, jend; + j = target->GetLinkLibraries().begin(); + jend = target->GetLinkLibraries().end(); + for(;j!= jend; ++j) + { + if(j->first != tgtName) + { + // is the library part of this Project ? + std::string libPath = j->first + "_CMAKE_PATH"; + const char* cacheValue + = m_CMakeInstance->GetCacheDefinition(libPath.c_str()); + if(cacheValue) + { + // so add it to the tgtOrder vector if it isn't already there + // to do this we need the actual target + cmTarget *tgt = this->GetTargetFromName(j->first.c_str()); + this->ComputeTargetOrder(tgtOrder,j->first.c_str(), tgt); + } + } + } + // finally add the target + tgtOrder.push_back(tgtName); +} + +void cmGlobalCodeWarriorGenerator::WriteTargetOrder(std::ostream& fout) +{ + fout << "<TARGETORDER>\n"; + + std::vector<std::string> tgtOrder; + unsigned int i; + // for each local generator, and each target + for(i = 0; i < m_LocalGenerators.size(); ++i) + { + cmMakefile* mf = m_LocalGenerators[i]->GetMakefile(); + cmTargets &tgts = mf->GetTargets(); + for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); ++l) + { + this->ComputeTargetOrder(tgtOrder, l->first.c_str(), &(l->second)); + } + } + + // now write out the target order + for(i = 0; i < tgtOrder.size(); ++i) + { + fout << "<ORDEREDTARGET><NAME>" << tgtOrder[i] + << "</NAME></ORDEREDTARGET>\n"; + } + fout << "</TARGETORDER>\n"; +} + +void cmGlobalCodeWarriorGenerator::WriteGroupList(std::ostream& fout) +{ + fout << "<GROUPLIST>\n"; + + fout << "</GROUPLIST>\n"; +} + +void cmGlobalCodeWarriorGenerator::LocalGenerate() +{ + this->cmGlobalGenerator::LocalGenerate(); +} |