X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcreaDevManagerLib%2FmodelCDMProject.cpp;h=886a3659c4854cf4163be399bfb3b9f5c4c8de36;hb=refs%2Fheads%2Fvtk7itk4wx3-mingw64;hp=2996910dc4711d9f2b40a215b04ac443e561c895;hpb=6a43a8cc1e5216f06e41799fbe154b2b1ef6d44b;p=crea.git diff --git a/lib/creaDevManagerLib/modelCDMProject.cpp b/lib/creaDevManagerLib/modelCDMProject.cpp index 2996910..886a365 100644 --- a/lib/creaDevManagerLib/modelCDMProject.cpp +++ b/lib/creaDevManagerLib/modelCDMProject.cpp @@ -40,10 +40,12 @@ #include #include #include +#include #include "CDMUtilities.h" #include "creaWx.h" #include "wx/dir.h" +#include modelCDMProject::modelCDMProject() { @@ -168,17 +170,54 @@ modelCDMProject::modelCDMProject( this->lib = new modelCDMLib(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); this->children.push_back(this->lib); } - //if package , create package - else if(stdfileName.size() > 9 && stdfileName.substr(0,5) == "bbtk_" && stdfileName.substr(stdfileName.size()-4,4) == "_PKG") - { - modelCDMPackage* package = new modelCDMPackage(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); - this->packages.push_back(package); - this->children.push_back(package); - } - //if is an unknown folder, create folder else { - this->children.push_back(new modelCDMFolder(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1)); + bool isPackage = false; + + // check if cmakelists file exist in folder. + std::string tmppath = this->GetPath() + CDMUtilities::SLASH + stdfileName + CDMUtilities::SLASH + "CMakeLists.txt"; + CDMUtilities::CMLFile CMfile = CDMUtilities::readCMLFile(tmppath.c_str()); + if (CMfile.size() > 0) + { + std::cout << "-->" << stdfileName << " ::has cmakelists" << std::endl; + // check if cmakelists file has the SET(BBTK_PACKAGE_NAME [pkgname]) instruction. + for (int i = 0; !isPackage && i < CMfile.size(); ++i) { + if (CMfile[i].first == "command" && CMfile[i].second.size() > 1) + { + std::string cm = CMfile[i].second[0]; + + int pos = 1; + while(pos < CMfile[i].second.size()-1 && !isalpha(CMfile[i].second[pos][0])) + pos++; + + std::string pm1 = CMfile[i].second[pos]; + + std::cout << cm << " " << pm1 << std::endl; + std::transform(cm.begin(), cm.end(), cm.begin(), ::toupper); + std::transform(pm1.begin(), pm1.end(), pm1.begin(), ::toupper); + if(cm == "SET" && pm1 == "BBTK_PACKAGE_NAME") + { + isPackage = true; + } + } + } + } + + // if package, create package + if(isPackage) + { + std::cout << "is Package\n"; + modelCDMPackage* package = new modelCDMPackage(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); + std::cout << "Package created\n"; + this->packages.push_back(package); + this->children.push_back(package); + } + // if is an unknown folder, create folder + else + { + this->children.push_back(new modelCDMFolder(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1)); + } + } cont = dir.GetNext(&fileName); @@ -188,6 +227,12 @@ modelCDMProject::modelCDMProject( while (cont) { std::string stdfileName = crea::wx2std(fileName); + std::size_t fileTypePos = stdfileName.find_last_of("."); + std::string fileType; + if(fileTypePos != std::string::npos) + fileType = stdfileName.substr(fileTypePos); + else + fileType = ""; //if CMakeLists, create CMakeLists if(stdfileName == "CMakeLists.txt") @@ -195,11 +240,23 @@ modelCDMProject::modelCDMProject( this->CMakeLists = new modelCDMCMakeListsFile(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); this->children.push_back(this->CMakeLists); } + //if is a code file, create modelCDMCodeFile + else if( + fileType == ".c" || + fileType == ".cxx" || + fileType == ".h" || + fileType == ".cpp" || + fileType == ".txx" || + fileType == ".cmake" ) + { + this->children.push_back(new modelCDMCodeFile(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1)); + } + //if is an unknown file, create file else { this->children.push_back(new modelCDMFile(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1)); } - //if is an unknown file, create file + cont = dir.GetNext(&fileName); } } @@ -250,7 +307,11 @@ modelCDMLib* modelCDMProject::GetLib() const std::string modelCDMProject::GetBuildInstruction() const { - std::string makeComm = "make -C \"" + this->buildPath + "\""; /*> \"" + this->buildPath + CDMUtilities::SLASH + "building.log\" 2>&1";*/ + wxConfigBase* pConfig = wxConfigBase::Get(); + std::string commandline = crea::wx2std(pConfig->Read(wxT("BUILD_COMMAND"), crea::std2wx(CDMUtilities::BUILD_COMMAND))); + + + std::string makeComm = "cd \"" + this->buildPath + "\";" + commandline;// -C \"" + this->buildPath + "\""; /*> \"" + this->buildPath + CDMUtilities::SLASH + "building.log\" 2>&1";*/ return makeComm; } @@ -301,7 +362,11 @@ bool modelCDMProject::SetVersion(const std::string& version, std::string*& resul in.close(); out.close(); //delete old file and rename new file +#ifdef _WIN32 + std::string renameCommand = "move /Y \"" + this->path + CDMUtilities::SLASH + "CMakeLists.txt.tmp\" \"" + this->path + CDMUtilities::SLASH + "CMakeLists.txt\""; +#else std::string renameCommand = "mv \"" + this->path + CDMUtilities::SLASH + "CMakeLists.txt.tmp\" \"" + this->path + CDMUtilities::SLASH + "CMakeLists.txt\""; +#endif if(system(renameCommand.c_str())) { result = new std::string("An error occurred while running '" + renameCommand + "'."); @@ -341,7 +406,7 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage( //fixing input parameters std::vector words; - CDMUtilities::splitter::split(words,name," ",CDMUtilities::splitter::no_empties); + CDMUtilities::splitter::split(words,name," '/\"\\,.",CDMUtilities::splitter::no_empties); std::string nameFixed = ""; for (int i = 0; i < (int)(words.size()); i++) { @@ -349,7 +414,7 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage( } words.clear(); - CDMUtilities::splitter::split(words,authors," ",CDMUtilities::splitter::no_empties); + CDMUtilities::splitter::split(words,authors," '/\"\\,.",CDMUtilities::splitter::no_empties); std::string authorFixed; for (int i = 0; i < (int)(words.size()); i++) { @@ -358,13 +423,13 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage( words.clear(); std::string descriptionFixed; - CDMUtilities::splitter::split(words,authorsEmail," ",CDMUtilities::splitter::no_empties); + CDMUtilities::splitter::split(words,authorsEmail," '/\"\\,",CDMUtilities::splitter::no_empties); for (int i = 0; i < (int)(words.size()); i++) { - descriptionFixed += words[i]; + descriptionFixed += words[i] + "/"; } words.clear(); - CDMUtilities::splitter::split(words,description," ",CDMUtilities::splitter::no_empties); + CDMUtilities::splitter::split(words,description," '\"",CDMUtilities::splitter::no_empties); for (int i = 0; i < (int)(words.size()); i++) { descriptionFixed += "_" + words[i]; @@ -373,12 +438,24 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage( //call project to create package : use bbCreatePackage [author] [description] std::string creationCommand = "bbCreatePackage \"" + this->path + "\" \"" + nameFixed + "\" \"" + authorFixed + "\" \"" + descriptionFixed + "\""; //TODO: bbCreatePackage script always returning 0. It should return 1 or greater if any error - if(system(creationCommand.c_str())) + bool resultCommand = 0 != system(creationCommand.c_str()); +#ifdef _WIN32 + resultCommand = false; +#endif + if(resultCommand) { result = new std::string("An error occurred while running '" + creationCommand + "'."); return NULL; } + //add library to project CMakeLists + std::fstream out1((this->path + CDMUtilities::SLASH + "CMakeLists.txt").c_str(), std::fstream::in | std::fstream::out | std::fstream::app); + if (out1.is_open()) + { + out1 << "ADD_SUBDIRECTORY(bbtk_" << nameFixed << "_PKG)" << std::endl; + out1.close(); + } + //add library to model modelCDMPackage* package = new modelCDMPackage(this, this->path + CDMUtilities::SLASH + "bbtk_" + nameFixed + "_PKG", "bbtk_" + nameFixed + "_PKG", this->level + 1); this->packages.push_back(package); @@ -408,13 +485,14 @@ modelCDMIProjectTreeNode* modelCDMProject::CreateLibrary( modelCDMIProjectTreeNode* modelCDMProject::CreateApplication( const std::string& name, + const int& type, std::string*& result, const std::string& path ) { if(this->appli != NULL) { - return this->appli->CreateApplication(name, result); + return this->appli->CreateApplication(name, type, result); } result = new std::string("there is no appli folder in this project."); return NULL; @@ -559,7 +637,7 @@ const bool modelCDMProject::Refresh(std::string*& result) } //if package , create package - else if(stdfileName.size() > 9 && stdfileName.substr(0,5) == "bbtk_" && stdfileName.substr(stdfileName.size()-4,4) == "_PKG") + /*else if(stdfileName.size() > 9 && stdfileName.substr(0,5) == "bbtk_" && stdfileName.substr(stdfileName.size()-4,4) == "_PKG") { bool found = false; for (int i = 0; !found && i < (int)(this->packages.size()); i++) @@ -581,26 +659,85 @@ const bool modelCDMProject::Refresh(std::string*& result) this->children.push_back(package); } - } - //if is an unknown folder, create folder + }*/ + // package or folder else { - bool found = false; - for (int i = 0; !found && i < (int)(this->children.size()); i++) + bool isPackage = false; + + // check if cmakelists file exist in folder. + std::string tmppath = this->GetPath() + CDMUtilities::SLASH + stdfileName + CDMUtilities::SLASH + "CMakeLists.txt"; + CDMUtilities::CMLFile CMfile = CDMUtilities::readCMLFile(tmppath.c_str()); + if (CMfile.size() > 0) + { - if (this->children[i]->GetName() == stdfileName) + // check if cmakelists file has the SET(BBTK_PACKAGE_NAME [pkgname]) instruction. + for (int i = 0; !isPackage && i < CMfile.size(); ++i) { + if (CMfile[i].first == "command" && CMfile[i].second.size() > 1) + { + std::string cm = CMfile[i].second[0]; + + int pos = 1; + while(pos < CMfile[i].second.size()-1 && !isalpha(CMfile[i].second[pos][0])) + pos++; + + std::string pm1 = CMfile[i].second[pos]; + + std::cout << cm << " " << pm1 << std::endl; + std::transform(cm.begin(), cm.end(), cm.begin(), ::toupper); + std::transform(pm1.begin(), pm1.end(), pm1.begin(), ::toupper); + if(cm == "SET" && pm1 == "BBTK_PACKAGE_NAME") + { + isPackage = true; + } + } + } + } + + // if package, create package + if (isPackage) + { + bool found = false; + for (int i = 0; !found && i < (int)(this->packages.size()); i++) { - found = true; - checked[i] = true; - if(!this->children[i]->Refresh(result)) - return false; + if (this->packages[i]->GetName() == stdfileName) + { + found = true; + int pos = std::find(this->children.begin(), this->children.end(), this->packages[i]) - this->children.begin(); + checked[pos] = true; + checkedPackages[i] = true; + if(!this->packages[i]->Refresh(result)) + return false; + } } - } - if(!found) + if (!found) + { + modelCDMPackage* package = new modelCDMPackage(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); + this->packages.push_back(package); + this->children.push_back(package); + } + } + //if is an unknown folder, create folder + else { - modelCDMFolder* folder = new modelCDMFolder(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); - this->children.push_back(folder); + bool found = false; + for (int i = 0; !found && i < (int)(this->children.size()); i++) + { + if (this->children[i]->GetName() == stdfileName) + { + found = true; + checked[i] = true; + if(!this->children[i]->Refresh(result)) + return false; + } + } + + if(!found) + { + modelCDMFolder* folder = new modelCDMFolder(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); + this->children.push_back(folder); + } } } @@ -611,6 +748,12 @@ const bool modelCDMProject::Refresh(std::string*& result) while (cont) { std::string stdfileName = crea::wx2std(fileName); + std::size_t fileTypePos = stdfileName.find_last_of("."); + std::string fileType; + if(fileTypePos != std::string::npos) + fileType = stdfileName.substr(fileTypePos); + else + fileType = ""; //if CMakeLists, create CMakeLists if(stdfileName == "CMakeLists.txt") @@ -628,6 +771,7 @@ const bool modelCDMProject::Refresh(std::string*& result) return false; } } + //if is a code file, create modelCDMCodeFile //if is an unknown file, create file else { @@ -645,8 +789,21 @@ const bool modelCDMProject::Refresh(std::string*& result) if(!found) { - modelCDMFile* file = new modelCDMFile(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); - this->children.push_back(file); + if( + fileType == ".c" || + fileType == ".cxx" || + fileType == ".h" || + fileType == ".cpp" || + fileType == ".txx" || + fileType == ".cmake" ) + { + this->children.push_back(new modelCDMCodeFile(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1)); + } + else + { + modelCDMFile* file = new modelCDMFile(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); + this->children.push_back(file); + } } } @@ -684,6 +841,13 @@ bool modelCDMProject::ConfigureBuild(std::string*& result) //TODO: adjust for windows and mac #ifdef _WIN32 // ------ Windows + if(0 == system("cmake-gui")) + return true; + else + { + result = new std::string("There was an error opening cmake-gui. Please make sure it's installed and that cmake's bin folder is in the system path."); + return false; + } #elif __APPLE__ // ------ Apple #else @@ -723,6 +887,15 @@ bool modelCDMProject::Build(std::string*& result, const std::string& line) //TODO: adjust for windows and mac #ifdef _WIN32 // ------ Windows + std::string command = "start \"\" \"" + this->buildPath + CDMUtilities::SLASH + this->nameProject + ".sln\""; + //wxMessageBox(crea::std2wx(command), wxT("Project Compilation - Check!")); + if(0 == system(command.c_str())) + return true; + else + { + result = new std::string("An error has happened running: \"" + command + "\". Please make sure to have visual c++ installed."); + return false; + } #elif __APPLE__ // ------ Apple #else @@ -768,29 +941,69 @@ bool modelCDMProject::Build(std::string*& result, const std::string& line) return true; } -bool modelCDMProject::Connect(std::string*& result) +bool modelCDMProject::Connect(std::string*& result, const std::string& folder) { - //TODO: adjust for windows and mac + //TODO: adjust for mac #ifdef _WIN32 // ------ Windows + //open binary folder + wxDir dir(crea::std2wx(folder)); + + //if binary folder can't be opened then return false + if (!dir.IsOpened()) + { + result = new std::string("The path could not be opened. Make sure the folder exists and contains a bbtkPackage file."); + return false; + } + //create plug command + std::string plugComm = "bbPlugPackage \"" + folder + "\""; + std::cout << "executing '" << plugComm << "'" << std::endl; + //execute plug command + if(system(std::string("start cmd.exe /k \"" + plugComm + "\"").c_str())) + { + //if there was an error then report it + result = new std::string("There was an error plugging the packages of the project, please check the console to read more about the problem."); + return false; + } #elif __APPLE__ // ------ Apple #else // ------ Linux //open binary folder - wxDir dir(crea::std2wx((this->buildPath).c_str())); + wxDir dir(crea::std2wx(folder)); //if binary folder can't be opened then return false if (!dir.IsOpened()) { - result = new std::string("The build path could not be opened. Make sure to configure the project before compiling it"); + result = new std::string("The path could not be opened. Make sure the folder exists and contains a bbtkPackage file."); return false; } //create plug command - std::string plugComm = "bbPlugPackage \"" + this->buildPath + "\" > \"" + this->buildPath + CDMUtilities::SLASH + "plugging.log\" 2>&1"; - std::cout << "executing '" << plugComm << "'" << std::endl; + std::string plugComm = "bbPlugPackage \"" + this->buildPath + "\""; + + std::string Comm = "gnome-terminal -e \"bash -c \\\""; + for (int i = 0; i < plugComm.size(); i++) + { + if(plugComm[i] == '"') + { + Comm+="\\\\\\\""; + } + else if(plugComm[i] == '\\') + { + Comm+="\\\\\\\\"; + } + else + { + Comm.push_back(plugComm[i]); + } + } + Comm += "; echo -e '\\a'; bash"; + Comm += "\\\"\""; + + + std::cout << "executing '" << Comm << "'" << std::endl; //execute plug command - if(system(plugComm.c_str())) + if(system(Comm.c_str())) { //if there was an error then report it result = new std::string("There was an error plugging the packages of the project, please check the console to read more about the problem."); @@ -934,3 +1147,299 @@ void modelCDMProject::CheckStructure(std::map& properties) this->packages[i]->CheckStructure(properties); } } + +bool modelCDMProject::IsPackageIncluded(const std::string& package_name) +{ + if (this->HasCMakeLists()) + { + CDMUtilities::CMLFile cmlFile = CDMUtilities::readCMLFile(this->CMakeLists->GetPath().c_str()); + for (int i = 0; i < cmlFile.size(); ++i) + { + if (cmlFile[i].first=="command" && cmlFile[i].second[0] == "ADD_SUBDIRECTORY") + { + int pos = 1; + while (pos < cmlFile[i].second.size()) + { + if (!isspace(cmlFile[i].second[pos][0]) && cmlFile[i].second[pos][0] != '(' && cmlFile[i].second[pos][0] != '#') + { + if (package_name == cmlFile[i].second[pos]) + return true; + break; + } + pos++; + } + } + } + } + return false; + +} + +bool modelCDMProject::SetPackageInclude(const std::string& package_name, const bool& toInclude) +{ + if (this->HasCMakeLists()) + { + CDMUtilities::CMLFile cmlFile = CDMUtilities::readCMLFile(this->CMakeLists->GetPath().c_str()); + + bool found = false; + + for (int i = 0; i < cmlFile.size(); ++i) + { + if(toInclude && cmlFile[i].first == "comment") + { + std::vector segments; + std::string line = cmlFile[i].second[0]; + while(line[0] == '#') + line.erase(0,1); + + CDMUtilities::splitter::split(segments, line, " ()", CDMUtilities::splitter::no_empties); + if (segments.size() > 1 && segments[0] == "ADD_SUBDIRECTORY" && segments[1] == package_name) + { + found = true; + while(cmlFile[i].second[0][0] == '#') + cmlFile[i].second[0].erase(0,1); + } + } + else if(cmlFile[i].first == "command" && cmlFile[i].second[0] == "ADD_SUBDIRECTORY") + { + int pos = 1; + while (pos < cmlFile[i].second.size()) + { + if (!isspace(cmlFile[i].second[pos][0]) && cmlFile[i].second[pos][0] != '(' && cmlFile[i].second[pos][0] != '#') + { + if (package_name == cmlFile[i].second[pos]) + { + found = true; + if (!toInclude) + { + cmlFile[i].first = "comment"; + cmlFile[i].second[0] = "#" + cmlFile[i].second[0]; + while (cmlFile[i].second.size() > 1) + { + cmlFile[i].second[0] += cmlFile[i].second[1]; + cmlFile[i].second.erase(cmlFile[i].second.begin()+1); + } + + } + } + break; + } + pos++; + } + } + } + if (!found && toInclude) + { + CDMUtilities::syntaxElement element; + element.first = "command"; + element.second.push_back("ADD_SUBDIRECTORY(" + package_name + ")"); + cmlFile.push_back(element); + } + + return CDMUtilities::writeCMLFile(this->CMakeLists->GetPath().c_str(),cmlFile); + } + return false; +} + +std::map modelCDMProject::Get3rdPartyLibraries() +{ + std::map correspondence; + correspondence["USE_CREA"] = "Crea"; + correspondence["USE_GDCM"] = "GDCM"; + correspondence["USE_GDCM_VTK"] = "GDCM_VTK"; + correspondence["USE_GDCM2"] = "GDCM2"; + correspondence["USE_WXWIDGETS"] = "WxWidgets"; + correspondence["USE_KWWIDGETS"] = "KWWidgets"; + correspondence["USE_VTK"] = "VTK"; + correspondence["USE_ITK"] = "ITK"; + correspondence["USE_BOOST"] = "Boost"; + + std::map res; + res["Crea"] = false; + res["GDCM"] = false; + res["GDCM_VTK"] = false; + res["GDCM2"] = false; + res["WxWidgets"] = false; + res["KWWidgets"] = false; + res["VTK"] = false; + res["ITK"] = false; + res["Boost"] = false; + + if (this->HasCMakeLists()) + { + std::string CMfile = CDMUtilities::readFile(this->CMakeLists->GetPath().c_str()); + + boost::regex expression("^\\h*SET([\\s]|#[^\\n]*\\n)*\\(([\\s]|#[^\\n]*\\n)*USE_\\w+\\s+ON"); + std::string::const_iterator start, end; + start = CMfile.begin(); + end = CMfile.end(); + boost::match_results what; + boost::match_flag_type flags = boost::match_default; + while(boost::regex_search(start, end, what, expression, flags)) + { + //std::cout << what[0].str() << std::endl; + boost::regex expression1 = boost::regex("USE_\\w+"); + std::string::const_iterator start1, end1; + start1 = what[0].first; + end1 = what[0].second; + boost::match_results what1; + if(boost::regex_search(start1, end1, what1, expression1, flags)) + { + std::string dete = what1.str(); + CDMUtilities::normalizeStr(dete); + //std::cout << dete << std::endl; + if(correspondence.find(dete) != correspondence.end()) + res[correspondence[dete]] = true; + } + start = what[0].second; + } + } + + return res; +} + +bool modelCDMProject::Set3rdPartyLibrary(const std::string& library_name, + const bool& toInclude) +{ + std::map correspondence; + correspondence["Crea"] = "USE_CREA"; + correspondence["GDCM"] = "USE_GDCM"; + correspondence["GDCM_VTK"] = "USE_GDCM_VTK"; + correspondence["GDCM2"] = "USE_GDCM2"; + correspondence["WxWidgets"] = "USE_WXWIDGETS"; + correspondence["KWWidgets"] = "USE_KWWIDGETS"; + correspondence["VTK"] = "USE_VTK"; + correspondence["ITK"] = "USE_ITK"; + correspondence["Boost"] = "USE_BOOST"; + + if (correspondence.find(library_name) != correspondence.end()) + { + std::string library_command = correspondence[library_name]; + + if (this->HasCMakeLists()) + { + std::string CMfile = CDMUtilities::readFile(this->CMakeLists->GetPath().c_str()); + std::string resCMfile = ""; + + std::string::const_iterator start, end; + boost::match_results what, tmp; + boost::match_flag_type flags = boost::match_default; + bool found = false; + + start = CMfile.begin(); + end = CMfile.end(); + + //search for existing inclusions + boost::regex expression("^\\h*SET([\\s]|#[^\\n]*\\n)*\\(([\\s]|#[^\\n]*\\n)*" + library_command + "\\s+ON\\s*\\)"); + while(boost::regex_search(start, end, what, expression, flags)) + { + found = true; + resCMfile += what.prefix().str(); + if(!toInclude) + { + std::string dete = what.str(); + int pos = dete.find("ON",0); + dete.replace(pos, 2, "OFF"); + resCMfile += dete; + } + else + resCMfile += what.str(); + tmp = what; + start = what[0].second; + } + + if (found) + resCMfile += tmp.suffix().str(); + else + { + start = CMfile.begin(); + end = CMfile.end(); + + //search for existing exclusions + boost::regex expression("^\\h*SET([\\s]|#[^\\n]*\\n)*\\(([\\s]|#[^\\n]*\\n)*" + library_command + "\\s+OFF\\s*\\)"); + while(boost::regex_search(start, end, what, expression, flags)) + { + found = true; + resCMfile += what.prefix().str(); + if(toInclude) + { + std::string dete = what.str(); + int pos = dete.find("OFF",0); + dete.replace(pos, 3, "ON"); + resCMfile += dete; + } + else + resCMfile += what.str(); + tmp = what; + start = what[0].second; + } + + if (found) + resCMfile += tmp.suffix().str(); + else + { + start = CMfile.begin(); + end = CMfile.end(); + + //search for existing commented inclusions + expression = boost::regex("^\\h*#+\\h*SET([\\s]|#[^\\n]*\\n)*\\(([\\s]|#[^\\n]*\\n)*" + library_command + "\\s+ON\\s*\\)"); + while(boost::regex_search(start, end, what, expression, flags)) + { + found = true; + resCMfile += what.prefix().str(); + if(toInclude) + { + std::string dete = what.str(); + for (int i = 0; i < dete.size(); ++i) { + if(dete[i] == '#') + { + dete.erase(i,1); + i--; + } + } + resCMfile += dete; + } + else + resCMfile += what.str(); + + tmp = what; + start = what[0].second; + } + + if (found) + resCMfile += tmp.suffix().str(); + else + { + if(toInclude) + { + start = CMfile.begin(); + end = CMfile.end(); + + //search for position to insert + expression = boost::regex("^\\h*#\\h*Libraries\\/tools used\\h*$"); + if(boost::regex_search(start, end, what, expression, flags)) + { + found = true; + resCMfile += what.prefix().str(); + resCMfile += what.str(); + resCMfile += "\nSET(" + library_command + " ON)"; + resCMfile += what.suffix().str(); + } + } + else + { + found = true; + } + } + } + } + if (!found) { + return false; + } + else + return CDMUtilities::writeFile(this->CMakeLists->GetPath().c_str(), resCMfile); + } + } + + return false; +}