X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcreaDevManagerLib%2FmodelCDMProject.cpp;h=dff1b63728b2fe054d5514cd4d4e9d430b717a06;hb=568ae730865efa12b53def3779d38067afd8963a;hp=5bc14e4d4b4ed8460aaef0b6cdab11dd3f578487;hpb=2f886b3dbdc87d142f8363272b2bd226209b8b06;p=crea.git diff --git a/lib/creaDevManagerLib/modelCDMProject.cpp b/lib/creaDevManagerLib/modelCDMProject.cpp index 5bc14e4..dff1b63 100644 --- a/lib/creaDevManagerLib/modelCDMProject.cpp +++ b/lib/creaDevManagerLib/modelCDMProject.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include "CDMUtilities.h" #include "creaWx.h" @@ -747,15 +748,13 @@ bool modelCDMProject::Build(std::string*& result, const std::string& line) //TODO: adjust for windows and mac #ifdef _WIN32 // ------ Windows - //\\..\\IDE\\VCExpress.exe \"" + this->buildPath + CDMUtilities::SLASH + this->nameProject + ".sln\" -// std::string command = "\"" + std::string(getenv("VS90COMNTOOLS")) + "..\\IDE\\VCExpress.exe\" \"" + this->buildPath + CDMUtilities::SLASH + this->nameProject + ".sln\" &"; - std::string command = "\"\"%VS90COMNTOOLS%..\\IDE\\VCExpress.exe\" \"" + this->buildPath + CDMUtilities::SLASH + this->nameProject + ".sln\" &\""; - command = "start cmd.exe /k " + command + " &"; - if(0 == system(command.c_str())) + 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++ express installed and to have the VS90COMNTOOLS environment variable set."); + result = new std::string("An error has happened running: \"" + command + "\". Please make sure to have visual c++ installed."); return false; } #elif __APPLE__ @@ -1012,118 +1011,296 @@ void modelCDMProject::CheckStructure(std::map& properties) bool modelCDMProject::IsPackageIncluded(const std::string& package_name) { - if(this->HasCMakeLists()) + if (this->HasCMakeLists()) { - std::ifstream CMFile(this->CMakeLists->GetPath().c_str()); - if (CMFile.is_open()) + CDMUtilities::CMLFile cmlFile = CDMUtilities::readCMLFile(this->CMakeLists->GetPath().c_str()); + for (int i = 0; i < cmlFile.size(); ++i) { - std::string line; - while(!CMFile.eof()) + if (cmlFile[i].first=="command" && cmlFile[i].second[0] == "ADD_SUBDIRECTORY") { - std::getline(CMFile, line); - while(line[0]==' ') - line.erase(0); - if(line[0] != '#') + int pos = 1; + while (pos < cmlFile[i].second.size()) { - std::vector lineSeg; - CDMUtilities::splitter::split(lineSeg,line,"()",CDMUtilities::splitter::no_empties); - if(lineSeg.size() > 0 && lineSeg[0] == "ADD_SUBDIRECTORY" && lineSeg[1] == package_name) + if (!isspace(cmlFile[i].second[pos][0]) && cmlFile[i].second[pos][0] != '(' && cmlFile[i].second[pos][0] != '#') { - CMFile.close(); - return true; + if (package_name == cmlFile[i].second[pos]) + return true; + break; } + pos++; } } - CMFile.close(); } } return false; + } bool modelCDMProject::SetPackageInclude(const std::string& package_name, const bool& toInclude) { if (this->HasCMakeLists()) { - std::ifstream CMFile(this->CMakeLists->GetPath().c_str()); - if (CMFile.is_open()) + CDMUtilities::CMLFile cmlFile = CDMUtilities::readCMLFile(this->CMakeLists->GetPath().c_str()); + + bool found = false; + + for (int i = 0; i < cmlFile.size(); ++i) { - std::stringstream outs; - std::string line; - bool found = false; - while(!CMFile.eof()) + if(toInclude && cmlFile[i].first == "comment") { - std::getline(CMFile, line); - if (CMFile.eof()) { - break; - } - if(line != "") + 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) { - std::vector segs; - CDMUtilities::splitter::split(segs, line, " ", CDMUtilities::splitter::no_empties); - //is comment - if(segs.size() > 0 && segs[0][0] == '#') + 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(toInclude) + if (package_name == cmlFile[i].second[pos]) { - CDMUtilities::splitter::split(segs, line, " #()", CDMUtilities::splitter::no_empties); - if (segs.size() > 1 && segs[0] == "ADD_SUBDIRECTORY" && segs[1] == package_name) + found = true; + if (!toInclude) { - found = true; - outs << "ADD_SUBDIRECTORY(" << package_name << ")\n"; + 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); + } + } - else - outs << line << "\n"; } - else + 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) { - outs << line << "\n"; + 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; } - //is not comment + + if (found) + resCMfile += tmp.suffix().str(); else { - if (segs.size() > 0 && !toInclude) + if(toInclude) { - CDMUtilities::splitter::split(segs, line, " ()", CDMUtilities::splitter::no_empties); - if (segs.size() > 1 && segs[0] == "ADD_SUBDIRECTORY" && segs[1] == package_name) - { - outs << "#" << line << "\n"; - } - else + 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)) { - outs << line << "\n"; + found = true; + resCMfile += what.prefix().str(); + resCMfile += what.str(); + resCMfile += "\nSET(" + library_command + " ON)"; + resCMfile += what.suffix().str(); } } else { - CDMUtilities::splitter::split(segs, line, " ()", CDMUtilities::splitter::no_empties); - if (segs.size() > 1 && segs[0] == "ADD_SUBDIRECTORY" && segs[1] == package_name) - { - found = true; - } - outs << line << "\n"; + found = true; } } } - else - { - outs << "\n"; - } - } - - CMFile.close(); - - if(!found && toInclude) - outs << "ADD_SUBDIRECTORY(" << package_name << ")\n"; - - std::ofstream CMFileOut(this->CMakeLists->GetPath().c_str()); - if (CMFileOut.is_open()) - { - CMFileOut << outs.rdbuf(); - CMFileOut.close(); - return true; } + if (!found) { + return false; + } + else + return CDMUtilities::writeFile(this->CMakeLists->GetPath().c_str(), resCMfile); } } + return false; }