浏览代码

Merge topic 'cpack-package-empty-dirs'

b58de9fe CPack: allow packaging of empty directories
47b060ae CPackDeb: allow empty directories in component packages
Brad King 10 年之前
父节点
当前提交
442d17ef6c

+ 4 - 0
Help/release/dev/cpack-package-empty-dirs.rts

@@ -0,0 +1,4 @@
+cpack-package-empty-dirs
+------------------------
+
+* The :module:`CPack` module learned to package empty directories.

+ 2 - 0
Source/CPack/cmCPackDebGenerator.cxx

@@ -95,6 +95,7 @@ int cmCPackDebGenerator::PackageOnePack(std::string initialTopLevel,
   std::string findExpr(this->GetOption("GEN_WDIR"));
   std::string findExpr(this->GetOption("GEN_WDIR"));
   findExpr += "/*";
   findExpr += "/*";
   gl.RecurseOn();
   gl.RecurseOn();
+  gl.SetRecurseListDirs(true);
   if ( !gl.FindFiles(findExpr) )
   if ( !gl.FindFiles(findExpr) )
     {
     {
     cmCPackLogger(cmCPackLog::LOG_ERROR,
     cmCPackLogger(cmCPackLog::LOG_ERROR,
@@ -222,6 +223,7 @@ int cmCPackDebGenerator::PackageComponentsAllInOne()
   std::string findExpr(this->GetOption("GEN_WDIR"));
   std::string findExpr(this->GetOption("GEN_WDIR"));
   findExpr += "/*";
   findExpr += "/*";
   gl.RecurseOn();
   gl.RecurseOn();
+  gl.SetRecurseListDirs(true);
   if ( !gl.FindFiles(findExpr) )
   if ( !gl.FindFiles(findExpr) )
     {
     {
     cmCPackLogger(cmCPackLog::LOG_ERROR,
     cmCPackLogger(cmCPackLog::LOG_ERROR,

+ 5 - 0
Source/CPack/cmCPackGenerator.cxx

@@ -367,6 +367,8 @@ int cmCPackGenerator::InstallProjectViaInstalledDirectories(
       cmCPackLogger(cmCPackLog::LOG_OUTPUT,
       cmCPackLogger(cmCPackLog::LOG_OUTPUT,
         "- Install directory: " << top << std::endl);
         "- Install directory: " << top << std::endl);
       gl.RecurseOn();
       gl.RecurseOn();
+      gl.SetRecurseListDirs(true);
+//      gl.SetRecurseThroughSymlinks(false);
       if ( !gl.FindFiles(findExpr) )
       if ( !gl.FindFiles(findExpr) )
         {
         {
         cmCPackLogger(cmCPackLog::LOG_ERROR,
         cmCPackLogger(cmCPackLog::LOG_ERROR,
@@ -869,6 +871,7 @@ int cmCPackGenerator::InstallProjectViaInstallCMakeProjects(
           cmsys::Glob glB;
           cmsys::Glob glB;
           findExpr += "/*";
           findExpr += "/*";
           glB.RecurseOn();
           glB.RecurseOn();
+          glB.SetRecurseListDirs(true);
           glB.FindFiles(findExpr);
           glB.FindFiles(findExpr);
           filesBefore = glB.GetFiles();
           filesBefore = glB.GetFiles();
           std::sort(filesBefore.begin(),filesBefore.end());
           std::sort(filesBefore.begin(),filesBefore.end());
@@ -908,6 +911,7 @@ int cmCPackGenerator::InstallProjectViaInstallCMakeProjects(
           {
           {
           cmsys::Glob glA;
           cmsys::Glob glA;
           glA.RecurseOn();
           glA.RecurseOn();
+          glA.SetRecurseListDirs(true);
           glA.FindFiles(findExpr);
           glA.FindFiles(findExpr);
           std::vector<std::string> filesAfter = glA.GetFiles();
           std::vector<std::string> filesAfter = glA.GetFiles();
           std::sort(filesAfter.begin(),filesAfter.end());
           std::sort(filesAfter.begin(),filesAfter.end());
@@ -1074,6 +1078,7 @@ int cmCPackGenerator::DoPackage()
   std::string findExpr = tempDirectory;
   std::string findExpr = tempDirectory;
   findExpr += "/*";
   findExpr += "/*";
   gl.RecurseOn();
   gl.RecurseOn();
+  gl.SetRecurseListDirs(true);
   gl.SetRecurseThroughSymlinks(false);
   gl.SetRecurseThroughSymlinks(false);
   if ( !gl.FindFiles(findExpr) )
   if ( !gl.FindFiles(findExpr) )
     {
     {

+ 21 - 0
Source/cmSystemTools.cxx

@@ -895,12 +895,33 @@ std::string cmSystemTools::FileExistsInParentDirectories(const char* fname,
 
 
 bool cmSystemTools::cmCopyFile(const char* source, const char* destination)
 bool cmSystemTools::cmCopyFile(const char* source, const char* destination)
 {
 {
+  // FIXME remove if statement once kwsys SystemTools get support for
+  // source is directory handling in CopyFileAlways function
+  if(cmSystemTools::FileIsDirectory(source))
+    {
+    return Superclass::MakeDirectory(destination);
+    }
+
   return Superclass::CopyFileAlways(source, destination);
   return Superclass::CopyFileAlways(source, destination);
 }
 }
 
 
 bool cmSystemTools::CopyFileIfDifferent(const char* source,
 bool cmSystemTools::CopyFileIfDifferent(const char* source,
   const char* destination)
   const char* destination)
 {
 {
+  // FIXME remove if statement once kwsys SystemTools get support for
+  // source is directory handling in CopyFileIfDifferent function
+  if(cmSystemTools::FileIsDirectory(source))
+    {
+    if(SystemTools::FileExists(destination))
+      {
+      return true;
+      }
+    else
+      {
+      return Superclass::MakeDirectory(destination);
+      }
+    }
+
   return Superclass::CopyFileIfDifferent(source, destination);
   return Superclass::CopyFileIfDifferent(source, destination);
 }
 }
 
 

+ 1 - 2
Tests/CPackComponentsDEB/CMakeLists.txt

@@ -110,9 +110,8 @@ install(FILES ${CPackComponentsDEB_BINARY_DIR}/symtest
 if(EXISTS "./dirtest")
 if(EXISTS "./dirtest")
   execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ./dirtest)
   execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ./dirtest)
 endif()
 endif()
+# NOTE: directory left empty on purpose
 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ./dirtest)
 execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ./dirtest)
-# BUG: apparently cannot add an empty directory
-execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ../mylibapp ./dirtest/symtest)
 # NOTE: we should not add the trailing "/" to dirtest
 # NOTE: we should not add the trailing "/" to dirtest
 install(DIRECTORY ${CPackComponentsDEB_BINARY_DIR}/dirtest
 install(DIRECTORY ${CPackComponentsDEB_BINARY_DIR}/dirtest
         DESTINATION bin/
         DESTINATION bin/

+ 1 - 1
Tests/RunCMake/CPack/CMakeLists.txt

@@ -8,5 +8,5 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${GENERATOR_TYPE}/${RunCMake_TEST}-specif
   include("${GENERATOR_TYPE}/${RunCMake_TEST}-specifics.cmake")
   include("${GENERATOR_TYPE}/${RunCMake_TEST}-specifics.cmake")
 endif()
 endif()
 
 
-set(CPACK_GENERATOR "${GENERATOR_TYPE}")
+set(CPACK_GENERATOR "${GENERATOR_TYPE};TGZ")
 include(CPack)
 include(CPack)

+ 5 - 0
Tests/RunCMake/CPack/COMPONENTS_EMPTY_DIR.cmake

@@ -0,0 +1,5 @@
+set(CPACK_COMPONENTS_ALL test)
+install(DIRECTORY DESTINATION empty
+        COMPONENT test)
+
+set(CPACK_PACKAGE_NAME "components_empty_dir")

+ 5 - 0
Tests/RunCMake/CPack/DEB/COMPONENTS_EMPTY_DIR-ExpectedFiles.cmake

@@ -0,0 +1,5 @@
+set(whitespaces_ "[\t\n\r ]*")
+
+set(EXPECTED_FILES_COUNT "1")
+set(EXPECTED_FILE_1 "components_empty_dir*.deb")
+set(EXPECTED_FILE_CONTENT_1 "^.*/usr/${whitespaces_}.*/usr/empty/$")

+ 2 - 0
Tests/RunCMake/CPack/DEB/COMPONENTS_EMPTY_DIR-specifics.cmake

@@ -0,0 +1,2 @@
+set(CPACK_PACKAGE_CONTACT "someone")
+set(CPACK_DEB_COMPONENT_INSTALL "ON")

+ 5 - 0
Tests/RunCMake/CPack/DEB/EMPTY_DIR-ExpectedFiles.cmake

@@ -0,0 +1,5 @@
+set(whitespaces_ "[\t\n\r ]*")
+
+set(EXPECTED_FILES_COUNT "1")
+set(EXPECTED_FILE_1 "empty_dir*.deb")
+set(EXPECTED_FILE_CONTENT_1 "^.*/usr/${whitespaces_}.*/usr/empty/$")

+ 1 - 0
Tests/RunCMake/CPack/DEB/EMPTY_DIR-specifics.cmake

@@ -0,0 +1 @@
+set(CPACK_PACKAGE_CONTACT "someone")

+ 4 - 0
Tests/RunCMake/CPack/EMPTY_DIR.cmake

@@ -0,0 +1,4 @@
+install(DIRECTORY DESTINATION empty
+        COMPONENT test)
+
+set(CPACK_PACKAGE_NAME "empty_dir")

+ 5 - 0
Tests/RunCMake/CPack/RPM/COMPONENTS_EMPTY_DIR-ExpectedFiles.cmake

@@ -0,0 +1,5 @@
+set(whitespaces_ "[\t\n\r ]*")
+
+set(EXPECTED_FILES_COUNT "1")
+set(EXPECTED_FILE_1 "components_empty_dir*.rpm")
+set(EXPECTED_FILE_CONTENT_1 "^/usr/empty$")

+ 1 - 0
Tests/RunCMake/CPack/RPM/COMPONENTS_EMPTY_DIR-stderr.txt

@@ -0,0 +1 @@
+^CPackRPM: Will use GENERATED spec file: .*/Tests/RunCMake/RPM/CPack/COMPONENTS_EMPTY_DIR-build/_CPack_Packages/.*/RPM/SPECS/components_empty_dir.spec$

+ 5 - 0
Tests/RunCMake/CPack/RPM/EMPTY_DIR-ExpectedFiles.cmake

@@ -0,0 +1,5 @@
+set(whitespaces_ "[\t\n\r ]*")
+
+set(EXPECTED_FILES_COUNT "1")
+set(EXPECTED_FILE_1 "empty_dir*.rpm")
+set(EXPECTED_FILE_CONTENT_1 "^/usr/empty$")

+ 1 - 0
Tests/RunCMake/CPack/RPM/EMPTY_DIR-stderr.txt

@@ -0,0 +1 @@
+^CPackRPM: Will use GENERATED spec file: .*/Tests/RunCMake/RPM/CPack/EMPTY_DIR-build/_CPack_Packages/.*/RPM/SPECS/empty_dir.spec$

+ 2 - 0
Tests/RunCMake/CPack/RunCMakeTest.cmake

@@ -8,3 +8,5 @@ run_cpack_test(MINIMAL "RPM;DEB" false)
 run_cpack_test(PARTIALLY_RELOCATABLE_WARNING "RPM" false)
 run_cpack_test(PARTIALLY_RELOCATABLE_WARNING "RPM" false)
 run_cpack_test(DEB_EXTRA "DEB" false)
 run_cpack_test(DEB_EXTRA "DEB" false)
 run_cpack_test(DEPENDENCIES "RPM;DEB" true)
 run_cpack_test(DEPENDENCIES "RPM;DEB" true)
+run_cpack_test(EMPTY_DIR "RPM;DEB" true)
+run_cpack_test(COMPONENTS_EMPTY_DIR "RPM;DEB" true)