summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorEric NOULARD <eric.noulard@gmail.com>2011-03-03 22:43:31 +0100
committerEric NOULARD <eric.noulard@gmail.com>2011-03-03 22:43:31 +0100
commit77333a92c215bb796c8df8a889118b32f64e38e4 (patch)
treec9c71ef5dcfa799947b5dd4cea6e08ea8cb12c49 /Source
parentcbb5ae60be15738a4d6db4607466346153c3dbba (diff)
downloadcmake-77333a92c215bb796c8df8a889118b32f64e38e4.tar.gz
CPack more robust way to collect files belonging to a component
Diffstat (limited to 'Source')
-rw-r--r--Source/CPack/cmCPackGenerator.cxx74
1 files changed, 45 insertions, 29 deletions
diff --git a/Source/CPack/cmCPackGenerator.cxx b/Source/CPack/cmCPackGenerator.cxx
index 86200c1db9..2cc2f341b8 100644
--- a/Source/CPack/cmCPackGenerator.cxx
+++ b/Source/CPack/cmCPackGenerator.cxx
@@ -810,7 +810,52 @@ int cmCPackGenerator::InstallProjectViaInstallCMakeProjects(
{
mf->AddDefinition("CMAKE_INSTALL_DO_STRIP", "1");
}
+ // Remember the list of files before installation
+ // of the current component (if we are in component install)
+ const char* InstallPrefix = tempInstallDirectory.c_str();
+ std::vector<std::string> filesBefore;
+ std::string findExpr(InstallPrefix);
+ if (componentInstall)
+ {
+ cmsys::Glob glB;
+ findExpr += "/*";
+ glB.RecurseOn();
+ glB.FindFiles(findExpr);
+ filesBefore = glB.GetFiles();
+ sort(filesBefore.begin(),filesBefore.end());
+ }
+ // do installation
int res = mf->ReadListFile(0, installFile.c_str());
+ // Now rebuild the list of files after installation
+ // of the current component (if we are in component install)
+ if (componentInstall)
+ {
+ cmsys::Glob glA;
+ glA.RecurseOn();
+ glA.FindFiles(findExpr);
+ std::vector<std::string> filesAfter = glA.GetFiles();
+ sort(filesAfter.begin(),filesAfter.end());
+ std::vector<std::string>::iterator diff;
+ std::vector<std::string> result(filesAfter.size());
+ diff = set_difference (
+ filesAfter.begin(),filesAfter.end(),
+ filesBefore.begin(),filesBefore.end(),
+ result.begin());
+
+ std::vector<std::string>::iterator fit;
+ std::string localFileName;
+ // Populate the File field of each component
+ for (fit=result.begin();fit!=diff;++fit)
+ {
+ localFileName = cmSystemTools::RelativePath(InstallPrefix, fit->c_str());
+ localFileName = localFileName.substr(localFileName.find('/')+1,std::string::npos);
+ Components[installComponent].Files.push_back(localFileName);
+ cmCPackLogger(cmCPackLog::LOG_DEBUG, "Adding file <"
+ <<localFileName<<"> to component <"
+ <<installComponent<<">"<<std::endl);
+ }
+ }
+
if (NULL !=mf->GetDefinition("CPACK_ABSOLUTE_DESTINATION_FILES")) {
if (absoluteDestFiles.length()>0) {
absoluteDestFiles +=";";
@@ -952,35 +997,6 @@ int cmCPackGenerator::DoPackage()
// The files to be installed
files = gl.GetFiles();
- // For component installations, determine which files go into which
- // components.
- if (!this->Components.empty())
- {
- std::vector<std::string>::const_iterator it;
- for ( it = files.begin(); it != files.end(); ++ it )
- {
- // beware we cannot just use tempDirectory as before
- // because some generator will "CPACK_INCLUDE_TOPLEVEL_DIRECTORY"
- // we really want "CPACK_TEMPORARY_DIRECTORY"
- std::string fileN =
- cmSystemTools::RelativePath(
- this->GetOption("CPACK_TEMPORARY_DIRECTORY"), it->c_str());
-
- // Determine which component we are in.
- std::string componentName = fileN.substr(0, fileN.find('/'));
-
- // Strip off the component part of the path.
- fileN = fileN.substr(fileN.find('/')+1, std::string::npos);
-
- // Add this file to the list of files for the component.
- this->Components[componentName].Files.push_back(fileN);
- cmCPackLogger(cmCPackLog::LOG_DEBUG, "Adding file <"
- <<fileN<<"> to component <"
- <<componentName<<">"<<std::endl);
- }
- }
-
-
packageFileNames.clear();
/* Put at least one file name into the list of
* wanted packageFileNames. The specific generator