From b07ece004c197b5430d0e84d9460e400e0acab7e Mon Sep 17 00:00:00 2001 From: Andy Cedilnik Date: Thu, 16 Feb 2006 15:20:23 -0500 Subject: ENH: More work on NSI to improve installing and uninstalling --- Modules/NSIS.template.in | 11 +++---- Source/CPack/cmCPackNSISGenerator.cxx | 59 ++++++++++++++++++++++++++++++++++- Source/CPack/cmCPackNSISGenerator.h | 2 ++ 3 files changed, 64 insertions(+), 8 deletions(-) diff --git a/Modules/NSIS.template.in b/Modules/NSIS.template.in index 41152d0..97ad662 100644 --- a/Modules/NSIS.template.in +++ b/Modules/NSIS.template.in @@ -342,9 +342,7 @@ Section "Dummy Section" SecDummy ;Use the entire tree produced by the INSTALL target. Keep the ;list of directories here in sync with the RMDir commands below. SetOutPath "$INSTDIR" - File /r "${INST_DIR}\bin" - File /r "${INST_DIR}\doc" - File /r "${INST_DIR}\share" + File /r "${INST_DIR}\*.*" @CPACK_NSIS_EXTRA_COMMANDS@ @@ -397,11 +395,10 @@ FunctionEnd Section "Uninstall" - ;Remove directories we installed. + ;Remove files we installed. ;Keep the list of directories here in sync with the File commands above. - RMDir /r "$INSTDIR\bin" - RMDir /r "$INSTDIR\doc" - RMDir /r "$INSTDIR\share" +@CPACK_NSIS_DELETE_FILES@ +@CPACK_NSIS_DELETE_DIRECTORIES@ ;Remove the uninstaller itself. Delete "$INSTDIR\Uninstall.exe" diff --git a/Source/CPack/cmCPackNSISGenerator.cxx b/Source/CPack/cmCPackNSISGenerator.cxx index 415129d..9f1e9e2 100644 --- a/Source/CPack/cmCPackNSISGenerator.cxx +++ b/Source/CPack/cmCPackNSISGenerator.cxx @@ -26,6 +26,7 @@ #include #include +#include //---------------------------------------------------------------------- cmCPackNSISGenerator::cmCPackNSISGenerator() @@ -43,7 +44,6 @@ int cmCPackNSISGenerator::CompressFiles(const char* outFileName, const char* top { (void)outFileName; // TODO: Fix nsis to force out file name (void)toplevel; - (void)files; std::string nsisInFileName = this->FindTemplate("NSIS.template.in"); if ( nsisInFileName.size() == 0 ) { @@ -54,6 +54,35 @@ int cmCPackNSISGenerator::CompressFiles(const char* outFileName, const char* top std::string tmpFile = nsisFileName; tmpFile += "/NSISOutput.log"; nsisFileName += "/project.nsi"; + cmOStringStream str; + std::vector::const_iterator it; + for ( it = files.begin(); it != files.end(); ++ it ) + { + std::string fileN = cmSystemTools::RelativePath(toplevel, + it->c_str()); + cmSystemTools::ReplaceString(fileN, "/", "\\"); + str << " Delete \"$INSTDIR\\" << fileN.c_str() << "\"" << std::endl; + } + cmCPackLogger(cmCPackLog::LOG_DEBUG, "Uninstall Files: " << str.str().c_str() << std::endl); + this->SetOption("CPACK_NSIS_DELETE_FILES", str.str().c_str()); + std::vector dirs; + this->GetListOfSubdirectories(toplevel, dirs); + std::vector::const_iterator sit; + cmOStringStream dstr; + for ( sit = dirs.begin(); sit != dirs.end(); ++ sit ) + { + std::string fileN = cmSystemTools::RelativePath(toplevel, + sit->c_str()); + if ( fileN.empty() ) + { + continue; + } + cmSystemTools::ReplaceString(fileN, "/", "\\"); + dstr << " RMDir \"$INSTDIR\\" << fileN.c_str() << "\"" << std::endl; + } + cmCPackLogger(cmCPackLog::LOG_DEBUG, "Uninstall Dirs: " << dstr.str().c_str() << std::endl); + this->SetOption("CPACK_NSIS_DELETE_DIRECTORIES", dstr.str().c_str()); + cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Configure file: " << nsisInFileName << " to " << nsisFileName << std::endl); this->ConfigureFile(nsisInFileName.c_str(), nsisFileName.c_str()); std::string nsisCmd = "\""; @@ -132,3 +161,31 @@ int cmCPackNSISGenerator::Initialize(const char* name, cmMakefile* mf) return res; } +//---------------------------------------------------------------------- +bool cmCPackNSISGenerator::GetListOfSubdirectories(const char* topdir, std::vector& dirs) +{ + cmsys::Directory dir; + dir.Load(topdir); + size_t fileNum; + for (fileNum = 0; fileNum < dir.GetNumberOfFiles(); ++fileNum) + { + if (strcmp(dir.GetFile(static_cast(fileNum)),".") && + strcmp(dir.GetFile(static_cast(fileNum)),"..")) + { + kwsys_stl::string fullPath = topdir; + fullPath += "/"; + fullPath += dir.GetFile(static_cast(fileNum)); + if(cmsys::SystemTools::FileIsDirectory(fullPath.c_str()) && + !cmsys::SystemTools::FileIsSymlink(fullPath.c_str())) + { + if (!this->GetListOfSubdirectories(fullPath.c_str(), dirs)) + { + return false; + } + } + } + } + dirs.push_back(topdir); + return true; +} + diff --git a/Source/CPack/cmCPackNSISGenerator.h b/Source/CPack/cmCPackNSISGenerator.h index 47d9080..c84347d 100644 --- a/Source/CPack/cmCPackNSISGenerator.h +++ b/Source/CPack/cmCPackNSISGenerator.h @@ -47,6 +47,8 @@ protected: const std::vector& files); virtual const char* GetOutputExtension() { return "exe"; } virtual const char* GetOutputPostfix() { return "win32"; } + + bool GetListOfSubdirectories(const char* dir, std::vector& dirs); }; #endif -- cgit v0.12