From 27a67fb72f22bcff5007b45d96ed810405818833 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 29 Aug 2006 15:04:29 -0400 Subject: [PATCH] ENH: Add support to INSTALL(DIRECTORY) to install an empty directory. This addresses bug#3572. --- Source/cmFileCommand.cxx | 13 +++++++++++-- Source/cmInstallCommand.cxx | 6 ++++++ Tests/SimpleInstall/CMakeLists.txt | 12 ++++++++++++ Tests/SimpleInstallS2/CMakeLists.txt | 12 ++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 1b4ad5583..d5d1eb27f 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -519,6 +519,11 @@ bool cmFileInstaller::InstallDirectory(const char* source, return true; } + // Inform the user about this directory installation. + std::string message = "Installing "; + message += destination; + this->Makefile->DisplayStatus(message.c_str(), -1); + // Make sure the destination directory exists. if(!cmSystemTools::MakeDirectory(destination)) { @@ -568,7 +573,10 @@ bool cmFileInstaller::InstallDirectory(const char* source, // Load the directory contents to traverse it recursively. cmsys::Directory dir; - dir.Load(source); + if(source && *source) + { + dir.Load(source); + } unsigned long numFiles = static_cast(dir.GetNumberOfFiles()); for(unsigned long fileNum = 0; fileNum < numFiles; ++fileNum) { @@ -1280,7 +1288,8 @@ bool cmFileCommand::HandleInstallCommand( if(!cmSystemTools::SameFile(fromFile.c_str(), toFile.c_str())) { if(itype == cmTarget::INSTALL_DIRECTORY && - cmSystemTools::FileIsDirectory(fromFile.c_str())) + (fromFile.empty() || + cmSystemTools::FileIsDirectory(fromFile.c_str()))) { // Try installing this directory. if(!installer.InstallDirectory(fromFile.c_str(), toFile.c_str(), diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx index a5c040886..9cb37c9c3 100644 --- a/Source/cmInstallCommand.cxx +++ b/Source/cmInstallCommand.cxx @@ -1000,6 +1000,12 @@ cmInstallCommand::HandleDirectoryMode(std::vector const& args) } } + // Support installing an empty directory. + if(dirs.empty() && destination) + { + dirs.push_back(""); + } + // Check if there is something to do. if(dirs.empty()) { diff --git a/Tests/SimpleInstall/CMakeLists.txt b/Tests/SimpleInstall/CMakeLists.txt index 4559f087e..a99f6d32f 100644 --- a/Tests/SimpleInstall/CMakeLists.txt +++ b/Tests/SimpleInstall/CMakeLists.txt @@ -107,6 +107,15 @@ IF(STAGE2) MESSAGE(FATAL_ERROR "Bad sample script output: [${SAMPLE_SCRIPT_OUTPUT}]") ENDIF(NOT "${SAMPLE_SCRIPT_OUTPUT}" MATCHES "Sample Script Output") + # Check for failure of empty directory installation. + IF(NOT EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/empty") + MESSAGE(FATAL_ERROR "Empty directory installation did not install.") + ENDIF(NOT EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/empty") + FILE(GLOB EMPTY_FILES "${CMAKE_INSTALL_PREFIX}/MyTest/share/empty/*") + IF(EMPTY_FILES) + MESSAGE(FATAL_ERROR "Empty directory installed [${EMPTY_FILES}].") + ENDIF(EMPTY_FILES) + # Make sure the test executable can run from the install tree. SET_TARGET_PROPERTIES(SimpleInstallS2 PROPERTIES INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/MyTest/lib) @@ -174,6 +183,9 @@ ELSE(STAGE2) PATTERN "scripts/*" PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ ) + # Test empty directory installation. + INSTALL(DIRECTORY DESTINATION MyTest/share/empty) + # Test user-specified install scripts. INSTALL( SCRIPT InstallScript1.cmake diff --git a/Tests/SimpleInstallS2/CMakeLists.txt b/Tests/SimpleInstallS2/CMakeLists.txt index 4559f087e..a99f6d32f 100644 --- a/Tests/SimpleInstallS2/CMakeLists.txt +++ b/Tests/SimpleInstallS2/CMakeLists.txt @@ -107,6 +107,15 @@ IF(STAGE2) MESSAGE(FATAL_ERROR "Bad sample script output: [${SAMPLE_SCRIPT_OUTPUT}]") ENDIF(NOT "${SAMPLE_SCRIPT_OUTPUT}" MATCHES "Sample Script Output") + # Check for failure of empty directory installation. + IF(NOT EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/empty") + MESSAGE(FATAL_ERROR "Empty directory installation did not install.") + ENDIF(NOT EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/empty") + FILE(GLOB EMPTY_FILES "${CMAKE_INSTALL_PREFIX}/MyTest/share/empty/*") + IF(EMPTY_FILES) + MESSAGE(FATAL_ERROR "Empty directory installed [${EMPTY_FILES}].") + ENDIF(EMPTY_FILES) + # Make sure the test executable can run from the install tree. SET_TARGET_PROPERTIES(SimpleInstallS2 PROPERTIES INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/MyTest/lib) @@ -174,6 +183,9 @@ ELSE(STAGE2) PATTERN "scripts/*" PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ ) + # Test empty directory installation. + INSTALL(DIRECTORY DESTINATION MyTest/share/empty) + # Test user-specified install scripts. INSTALL( SCRIPT InstallScript1.cmake