X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcreaDevManagerLib%2FmodelCDMApplication.cpp;h=0ee18a913fa037ed71e1065488b54f6cb5785d57;hb=ef630179c0efdb37f43994958b727f585cf2c3ec;hp=c15bedf6c2cb04bdf49cd95282d5a03209b1be4e;hpb=5a17d994576296f2a5a85f3a01ad5631786a0c56;p=crea.git diff --git a/lib/creaDevManagerLib/modelCDMApplication.cpp b/lib/creaDevManagerLib/modelCDMApplication.cpp index c15bedf..0ee18a9 100644 --- a/lib/creaDevManagerLib/modelCDMApplication.cpp +++ b/lib/creaDevManagerLib/modelCDMApplication.cpp @@ -534,57 +534,41 @@ std::map modelCDMApplication::Get3rdPartyLibraries() res["GDCM"] = false; res["Boost"] = false; - 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()); + // look at every syntax element + for (int i = 0; i < cmlFile.size(); ++i) { - std::string line; - while(!CMFile.eof()) + // if the element is a command and is a SET command + if (cmlFile[i].first == "command" && cmlFile[i].second[0] == "SET") { - std::getline(CMFile, line, '('); - - std::vector lineSeg; - CDMUtilities::splitter::split(lineSeg,line,"\n ",CDMUtilities::splitter::no_empties); - - if(lineSeg.size() > 0 && lineSeg[lineSeg.size()-1] == "SET") + // search first parameter + int pos = 1; + while (pos < cmlFile[i].second.size()) { - //std::cout << "found set" << std::endl; - std::getline(CMFile, line, ')'); - //std::cout << line << std::endl; - CDMUtilities::splitter::split(lineSeg,line,"\n",CDMUtilities::splitter::no_empties); - if(lineSeg.size() > 0) + // see if it is ${LIBRARY_NAME}_LINK_LIBRARIES + if (cmlFile[i].second[pos] == "${EXE_NAME}_LINK_LIBRARIES") { - //std::cout << lineSeg[0] << std::endl; - for(int i = 0; i < lineSeg[0].size(); ++i) - if (lineSeg[0][i] == ' ') - { - lineSeg[0].erase(i,1); - --i; - } - //std::cout << lineSeg[0] << std::endl; - if (lineSeg[0] == "${EXE_NAME}_LINK_LIBRARIES") + pos++; + // look for all the third party libraries included + while (pos < cmlFile[i].second.size()) { - //std::cout << "link" << std::endl; - for (int l = 1; l < lineSeg.size(); ++l) + if (cmlFile[i].second[pos][0] == '$' && correspondence.find(cmlFile[i].second[pos]) != correspondence.end()) { - for(int i = 0;i < lineSeg[l].size(); i++) - if (lineSeg[l][i] == ' ') - { - lineSeg[l].erase(i,1); - i--; - } - if(lineSeg[l].size() > 0 && lineSeg[l][0] == '$') - { - //std::cout << "found " << lineSeg[l] << std::endl; - res[correspondence[lineSeg[l]]] = true; - } + res[correspondence[cmlFile[i].second[pos]]] = true; } + pos++; } } + // if it is the first parameter but is not ${LIBRARY_NAME}_LINK_LIBRARIES then finish with this command + else if (!isspace(cmlFile[i].second[pos][0]) && cmlFile[i].second[pos][0] != '#' && cmlFile[i].second[pos][0] != '(' && cmlFile[i].second[pos][0] != ')') + { + break; + } + pos++; } } - CMFile.close(); } } return res; @@ -592,6 +576,104 @@ std::map modelCDMApplication::Get3rdPartyLibraries() bool modelCDMApplication::Set3rdPartyLibrary(const std::string& library_name, const bool& toInclude) { + std::map correspondence; + + correspondence["Crea"] = "${crea_LIBRARIES}"; + correspondence["WxWidgets"] = "${WXWIDGETS_LIBRARIES}"; + correspondence["KWWidgets"] = "${KWWidgets_LIBRARIES}"; + correspondence["VTK"] = "${VTK_LIBRARIES}"; + correspondence["ITK"] = "${ITK_LIBRARIES}"; + correspondence["GDCM"] = "${GDCM_LIBRARIES}"; + correspondence["Boost"] = "${BOOST_LIBRARIES}"; + + if (correspondence.find(library_name) != correspondence.end()) + { + std::string library_command = correspondence[library_name]; + if (this->HasCMakeLists()) + { + CDMUtilities::CMLFile cmlFile = CDMUtilities::readCMLFile(this->CMakeLists->GetPath()); + + // look at every syntax element + for (int i = 0; i < cmlFile.size(); ++i) + { + // if the element is a command and is a SET command + if (cmlFile[i].first == "command" && cmlFile[i].second[0] == "SET") + { + // search first parameter + int pos = 1; + while (pos < cmlFile[i].second.size()) + { + // see if it is ${LIBRARY_NAME}_LINK_LIBRARIES + if (cmlFile[i].second[pos] == "${EXE_NAME}_LINK_LIBRARIES") + { + bool found = false; + pos++; + // look for all the third party libraries included + while (pos < cmlFile[i].second.size() && cmlFile[i].second[pos] != ")") + { + // if is library_command then found + if (cmlFile[i].second[pos] == library_command) + { + found = true; + //if toInclude is false the make it a comment + if (!toInclude) + { + cmlFile[i].second[pos] = "#" + cmlFile[i].second[pos]; + std::cout << "library commented: " << library_name << std::endl; + } + break; + } + else if (toInclude && cmlFile[i].second[pos][0] == '#') + { + std::vector segments; + CDMUtilities::splitter::split(segments, cmlFile[i].second[pos], "#", CDMUtilities::splitter::no_empties); + if(segments.size()) + { + for (int j = 0; j < segments[0].size(); ++j) + { + if(isspace(segments[0][j])) + { + segments[0].erase(j,1); + j--; + } + } + + if(segments[0].size() && segments[0] == library_command) + { + found = true; + while(cmlFile[i].second[pos][0] == '#') + { + cmlFile[i].second[pos].erase(0,1); + } + std::cout << "library uncommented: " << library_name << std::endl; + break; + } + } + } + pos++; + } + + //if the library was not found and is an inclusion then include it + if (!found && toInclude && pos < cmlFile[i].second.size() && cmlFile[i].second[pos] == ")") + { + cmlFile[i].second.insert(cmlFile[i].second.begin()+pos, library_command); + cmlFile[i].second.insert(cmlFile[i].second.begin()+pos+1, "\n"); + std::cout << "library included: " << library_name << std::endl; + } + } + // if it is the first parameter but is not ${LIBRARY_NAME}_LINK_LIBRARIES then finish with this command + else if (!isspace(cmlFile[i].second[pos][0]) && cmlFile[i].second[pos][0] != '#' && cmlFile[i].second[pos][0] != '(' && cmlFile[i].second[pos][0] != ')') + { + break; + } + pos++; + } + } + } + + return CDMUtilities::writeCMLFile(this->CMakeLists->GetPath(), cmlFile); + } + } return false; }