X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcreaDevManagerLib%2FmodelCDMProject.cpp;h=520fc0e8d822c92d637a3e1b0e21920ff9df9729;hb=03aef77bacc41f53b1d21b88e683302e7e1600c2;hp=501d059d9892e0bbc0742f8cfe82ccba3426263c;hpb=bbdef4f90fba618806e17e589b7d71cc76095f5b;p=crea.git diff --git a/lib/creaDevManagerLib/modelCDMProject.cpp b/lib/creaDevManagerLib/modelCDMProject.cpp index 501d059..520fc0e 100644 --- a/lib/creaDevManagerLib/modelCDMProject.cpp +++ b/lib/creaDevManagerLib/modelCDMProject.cpp @@ -87,7 +87,7 @@ modelCDMProject::modelCDMProject( CDMUtilities::splitter::split(nameBits, word, " ", CDMUtilities::splitter::no_empties); this->name = this->nameProject = ""; - for (int i = 0; i < nameBits.size(); i++) + for (int i = 0; i < (int)(nameBits.size()); i++) { if(i != 0) this->name += " "; @@ -261,10 +261,16 @@ bool modelCDMProject::SetVersion(const std::string& version, std::string*& resul CDMUtilities::splitter::split(vers, version, " .", CDMUtilities::splitter::no_empties); time_t now = time(0); - tm* ltm = localtime(&now); + + tm ltm; +#ifdef _WIN32 + localtime_s(<m, &now); +#else + ltm = *(localtime(&now)); +#endif std::stringstream date; - date << ltm->tm_mday << "/" << 1 + ltm->tm_mon << "/" << 1900 + ltm->tm_year; + date << ltm.tm_mday << "/" << 1 + ltm.tm_mon << "/" << 1900 + ltm.tm_year; //set name of library in CMakeLists inside copied folder std::string line; @@ -295,7 +301,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 + "'."); @@ -337,7 +347,7 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage( CDMUtilities::splitter::split(words,name," ",CDMUtilities::splitter::no_empties); std::string nameFixed = ""; - for (int i = 0; i < words.size(); i++) + for (int i = 0; i < (int)(words.size()); i++) { nameFixed += words[i]; } @@ -345,7 +355,7 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage( words.clear(); CDMUtilities::splitter::split(words,authors," ",CDMUtilities::splitter::no_empties); std::string authorFixed; - for (int i = 0; i < words.size(); i++) + for (int i = 0; i < (int)(words.size()); i++) { authorFixed += words[i]; } @@ -353,13 +363,13 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage( words.clear(); std::string descriptionFixed; CDMUtilities::splitter::split(words,authorsEmail," ",CDMUtilities::splitter::no_empties); - for (int i = 0; i < words.size(); i++) + for (int i = 0; i < (int)(words.size()); i++) { descriptionFixed += words[i]; } words.clear(); CDMUtilities::splitter::split(words,description," ",CDMUtilities::splitter::no_empties); - for (int i = 0; i < words.size(); i++) + for (int i = 0; i < (int)(words.size()); i++) { descriptionFixed += "_" + words[i]; } @@ -367,7 +377,11 @@ 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; @@ -402,13 +416,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; @@ -463,7 +478,7 @@ const bool modelCDMProject::Refresh(std::string*& result) CDMUtilities::splitter::split(nameBits, word, " ", CDMUtilities::splitter::no_empties); this->name = this->nameProject = ""; - for (int i = 0; i < nameBits.size(); i++) + for (int i = 0; i < (int)(nameBits.size()); i++) { if(i != 0) this->name += " "; @@ -556,7 +571,7 @@ const bool modelCDMProject::Refresh(std::string*& result) 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 < this->packages.size(); i++) + for (int i = 0; !found && i < (int)(this->packages.size()); i++) { if (this->packages[i]->GetName() == stdfileName) { @@ -580,7 +595,7 @@ const bool modelCDMProject::Refresh(std::string*& result) else { bool found = false; - for (int i = 0; !found && i < this->children.size(); i++) + for (int i = 0; !found && i < (int)(this->children.size()); i++) { if (this->children[i]->GetName() == stdfileName) { @@ -626,7 +641,7 @@ const bool modelCDMProject::Refresh(std::string*& result) else { bool found = false; - for (int i = 0; !found && i < this->children.size(); i++) + for (int i = 0; !found && i < (int)(this->children.size()); i++) { if (this->children[i]->GetName() == stdfileName) { @@ -648,7 +663,7 @@ const bool modelCDMProject::Refresh(std::string*& result) } } - for (int i = 0; i < checkedPackages.size(); i++) + for (int i = 0; i < (int)(checkedPackages.size()); i++) { if(!checkedPackages[i]) { @@ -657,7 +672,7 @@ const bool modelCDMProject::Refresh(std::string*& result) i--; } } - for (int i = 0; i < checked.size(); i++) + for (int i = 0; i < (int)(checked.size()); i++) { if(!checked[i]) { @@ -678,6 +693,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 @@ -717,6 +739,17 @@ 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())) + 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."); + return false; + } #elif __APPLE__ // ------ Apple #else @@ -762,34 +795,188 @@ 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 - #ifdef _WIN32 - // ------ Windows - #elif __APPLE__ - // ------ Apple - #else - // ------ Linux - //open binary folder - wxDir dir(crea::std2wx((this->buildPath).c_str())); - - //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"); - 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; - //execute plug command - if(system(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; - } - #endif - return true; + //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(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 \"" + this->buildPath + "\" > \"" + this->buildPath + CDMUtilities::SLASH + "plugging.log\" 2>&1"; + std::cout << "executing '" << plugComm << "'" << std::endl; + //execute plug command + if(system(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 plugging.log in the build folder file to read more about the problem."); + return false; + } +#endif + return true; +} + +void modelCDMProject::CheckStructure(std::map& properties) +{ + //check cmake exist + if(this->CMakeLists != NULL) + { + //set properties parameters based on model + properties["project add appli"] = this->appli != NULL; + properties["project add lib"] = this->lib != NULL; + for (int i = 0; i < (int)(this->packages.size()); i++) + properties["project add " + packages[i]->GetName()] = false; + + //open cmakelists + std::ifstream confFile; + confFile.open((this->CMakeLists->GetPath()).c_str()); + + //take everything that is not commented + std::string fileContent; + + std::string word; + std::vector words; + while(confFile.is_open() && !confFile.eof()) + { + std::getline(confFile,word, '\n'); + if(word[0] != '#') + { + CDMUtilities::splitter::split(words, word, "#", CDMUtilities::splitter::empties_ok); + if (words.size() > 0) + { + word = words[0]; + CDMUtilities::splitter::split(words, word, " ", CDMUtilities::splitter::empties_ok); + for (int i = 0; i < (int)(words.size()); i++) + { + if(words[i].substr(0,2) == "//") + break; + fileContent += words[i] + " "; + } + } + + } + } + + //check every instruction + std::stringstream ss(fileContent); + while(!ss.eof()) + { + std::getline(ss,word, '('); + + //check instruction name + CDMUtilities::splitter::split(words, word, " ", CDMUtilities::splitter::no_empties); + + //set instructions + if (words.size() > 0 && words[words.size()-1] == "SET") + { + std::getline(ss,word, ')'); + + CDMUtilities::splitter::split(words, word, " ", CDMUtilities::splitter::no_empties); + if (words.size() > 1) + { + if (words[0] == "USE_CREA" && words[1] == "ON") + { + properties["project set USE_CREA"] = true; + } + else if (words[0] == "USE_GDCM" && words[1] == "ON") + { + properties["project set USE_GDCM"] = true; + } + else if (words[0] == "USE_GDCM_VTK" && words[1] == "ON") + { + properties["project set USE_GDCM_VTK"] = true; + } + else if (words[0] == "USE_GDCM2" && words[1] == "ON") + { + properties["project set USE_GDCM2"] = true; + } + else if (words[0] == "USE_WXWIDGETS" && words[1] == "ON") + { + properties["project set USE_WXWIDGETS"] = true; + } + else if (words[0] == "USE_KWWIDGETS" && words[1] == "ON") + { + properties["project set USE_KWWIDGETS"] = true; + } + else if (words[0] == "USE_VTK" && words[1] == "ON") + { + properties["project set USE_VTK"] = true; + } + else if (words[0] == "USE_ITK" && words[1] == "ON") + { + properties["project set USE_ITK"] = true; + } + else if (words[0] == "USE_BOOST" && words[1] == "ON") + { + properties["project set USE_BOOST"] = true; + } + } + } + //add instructions + else if (words.size() > 0 && words[words.size()-1] == "ADD_SUBDIRECTORY") + { + std::getline(ss,word, ')'); + //std::cout << word << std::endl; + CDMUtilities::splitter::split(words, word, " ", CDMUtilities::splitter::no_empties); + + if (words.size() > 0) + { + if(words[0] == "appli") + { + properties["project add "+words[0]] = this->appli != NULL; + } + else if(words[0] == "lib") + { + properties["project add "+words[0]] = this->lib != NULL; + } + else + { + properties["project add "+words[0]] = true; + } + } + } + } + + } + + //check appli's structure + this->appli->CheckStructure(properties); + //check lib's structure + this->lib->CheckStructure(properties); + //check packages' structure + for (int i = 0; i < (int)(this->packages.size()); i++) + { + properties["package " + this->packages[i]->GetName()] = true; + this->packages[i]->CheckStructure(properties); + } }