diff --git a/Modules/CPack.cmake b/Modules/CPack.cmake index 8148aaeae..eb9ba4349 100644 --- a/Modules/CPack.cmake +++ b/Modules/CPack.cmake @@ -179,7 +179,7 @@ cpack_set_if_not_set(CPACK_OUTPUT_CONFIG_FILE cpack_set_if_not_set(CPACK_SOURCE_OUTPUT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CPackSourceConfig.cmake") -cpack_set_if_not_set(CPACK_USE_DESTDIR ON) +cpack_set_if_not_set(CPACK_SET_DESTDIR OFF) cpack_set_if_not_set(CPACK_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") cpack_set_if_not_set(CPACK_NSIS_INSTALLER_ICON_CODE "") diff --git a/Source/CPack/cmCPackCygwinBinaryGenerator.cxx b/Source/CPack/cmCPackCygwinBinaryGenerator.cxx index 7d2ffb819..e8e1f7f79 100644 --- a/Source/CPack/cmCPackCygwinBinaryGenerator.cxx +++ b/Source/CPack/cmCPackCygwinBinaryGenerator.cxx @@ -41,6 +41,7 @@ cmCPackCygwinBinaryGenerator::~cmCPackCygwinBinaryGenerator() //---------------------------------------------------------------------- int cmCPackCygwinBinaryGenerator::InitializeInternal() { + this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr"); this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "0"); std::vector path; std::string pkgPath = cmSystemTools::FindProgram("bzip2", path, false); diff --git a/Source/CPack/cmCPackCygwinBinaryGenerator.h b/Source/CPack/cmCPackCygwinBinaryGenerator.h index c415f3292..25599bbf6 100644 --- a/Source/CPack/cmCPackCygwinBinaryGenerator.h +++ b/Source/CPack/cmCPackCygwinBinaryGenerator.h @@ -34,7 +34,6 @@ public: cmCPackCygwinBinaryGenerator(); virtual ~cmCPackCygwinBinaryGenerator(); protected: - virtual const char* GetInstallPrefix() { return "/usr"; } virtual int InitializeInternal(); int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); diff --git a/Source/CPack/cmCPackCygwinSourceGenerator.cxx b/Source/CPack/cmCPackCygwinSourceGenerator.cxx index c9062550a..0856452a4 100644 --- a/Source/CPack/cmCPackCygwinSourceGenerator.cxx +++ b/Source/CPack/cmCPackCygwinSourceGenerator.cxx @@ -166,7 +166,7 @@ int cmCPackCygwinSourceGenerator::CompressFiles(const char* outFileName, return 1; } -const char* cmCPackCygwinSourceGenerator::GetInstallPrefix() +const char* cmCPackCygwinSourceGenerator::GetPackagingInstallPrefix() { this->InstallPrefix = "/"; this->InstallPrefix += this->GetOption("CPACK_PACKAGE_FILE_NAME"); diff --git a/Source/CPack/cmCPackCygwinSourceGenerator.h b/Source/CPack/cmCPackCygwinSourceGenerator.h index a4e4656e3..6be26a597 100644 --- a/Source/CPack/cmCPackCygwinSourceGenerator.h +++ b/Source/CPack/cmCPackCygwinSourceGenerator.h @@ -34,7 +34,7 @@ public: cmCPackCygwinSourceGenerator(); virtual ~cmCPackCygwinSourceGenerator(); protected: - const char* GetInstallPrefix(); + const char* GetPackagingInstallPrefix(); virtual int InitializeInternal(); int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); diff --git a/Source/CPack/cmCPackDebGenerator.cxx b/Source/CPack/cmCPackDebGenerator.cxx index 88a4e25e9..75bf36fec 100644 --- a/Source/CPack/cmCPackDebGenerator.cxx +++ b/Source/CPack/cmCPackDebGenerator.cxx @@ -42,6 +42,14 @@ cmCPackDebGenerator::~cmCPackDebGenerator() { } +//---------------------------------------------------------------------- +int cmCPackDebGenerator::InitializeInternal() +{ + this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr"); + + return this->Superclass::InitializeInternal(); +} + //---------------------------------------------------------------------- int cmCPackDebGenerator::CompressFiles(const char* outFileName, const char* toplevel, diff --git a/Source/CPack/cmCPackDebGenerator.h b/Source/CPack/cmCPackDebGenerator.h index 6683f2b4b..fd18c9d6c 100644 --- a/Source/CPack/cmCPackDebGenerator.h +++ b/Source/CPack/cmCPackDebGenerator.h @@ -37,10 +37,10 @@ public: virtual ~cmCPackDebGenerator(); protected: + virtual int InitializeInternal(); virtual int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); virtual const char* GetOutputExtension() { return ".deb"; } - virtual const char* GetInstallPrefix() { return "/usr"; } }; diff --git a/Source/CPack/cmCPackGenericGenerator.cxx b/Source/CPack/cmCPackGenericGenerator.cxx index 1987a4dfd..e961357f5 100644 --- a/Source/CPack/cmCPackGenericGenerator.cxx +++ b/Source/CPack/cmCPackGenericGenerator.cxx @@ -61,6 +61,7 @@ void cmCPackGenericGenerator::DisplayVerboseOutput(const char* msg, int cmCPackGenericGenerator::PrepareNames() { this->SetOption("CPACK_GENERATOR", this->Name.c_str()); + std::string tempDirectory = this->GetOption("CPACK_PACKAGE_DIRECTORY"); tempDirectory += "/_CPack_Packages/"; const char* toplevelTag = this->GetOption("CPACK_TOPLEVEL_TAG"); @@ -80,7 +81,14 @@ int cmCPackGenericGenerator::PrepareNames() destFile += "/" + outName; std::string outFile = topDirectory + "/" + outName; - std::string installPrefix = tempDirectory + this->GetInstallPrefix(); + + bool setDestDir = cmSystemTools::IsOn(this->GetOption("CPACK_SET_DESTDIR")); + std::string installPrefix = tempDirectory; + if (!setDestDir) + { + installPrefix += this->GetPackagingInstallPrefix(); + } + this->SetOptionIfNotSet("CPACK_TOPLEVEL_DIRECTORY", topDirectory.c_str()); this->SetOptionIfNotSet("CPACK_TEMPORARY_DIRECTORY", tempDirectory.c_str()); this->SetOptionIfNotSet("CPACK_OUTPUT_FILE_NAME", outName.c_str()); @@ -147,8 +155,6 @@ int cmCPackGenericGenerator::InstallProject() this->CleanTemporaryDirectory(); std::string tempInstallDirectoryWithPostfix = this->GetOption("CPACK_TEMPORARY_INSTALL_DIRECTORY"); - tempInstallDirectoryWithPostfix - += this->GetTemporaryInstallDirectoryPostfix(); const char* tempInstallDirectory = tempInstallDirectoryWithPostfix.c_str(); int res = 1; if ( !cmsys::SystemTools::MakeDirectory(tempInstallDirectory)) @@ -160,23 +166,23 @@ int cmCPackGenericGenerator::InstallProject() return 0; } - bool movable = true; - if ( movable ) - { - // Make sure there is no destdir - cmSystemTools::PutEnv("DESTDIR="); - } - else + bool setDestDir = cmSystemTools::IsOn(this->GetOption("CPACK_SET_DESTDIR")); + if ( setDestDir ) { std::string destDir = "DESTDIR="; destDir += tempInstallDirectory; cmSystemTools::PutEnv(destDir.c_str()); } + else + { + // Make sure there is no destdir + cmSystemTools::PutEnv("DESTDIR="); + } // If the CPackConfig file sets CPACK_INSTALL_COMMANDS then run them // as listed if ( !this->InstallProjectViaInstallCommands( - movable, tempInstallDirectory) ) + setDestDir, tempInstallDirectory) ) { return 0; } @@ -184,7 +190,7 @@ int cmCPackGenericGenerator::InstallProject() // If the CPackConfig file sets CPACK_INSTALL_SCRIPT then run them // as listed if ( !this->InstallProjectViaInstallScript( - movable, tempInstallDirectory) ) + setDestDir, tempInstallDirectory) ) { return 0; } @@ -193,7 +199,7 @@ int cmCPackGenericGenerator::InstallProject() // then glob it and copy it to CPACK_TEMPORARY_DIRECTORY // This is used in Source packageing if ( !this->InstallProjectViaInstalledDirectories( - movable, tempInstallDirectory) ) + setDestDir, tempInstallDirectory) ) { return 0; } @@ -202,12 +208,12 @@ int cmCPackGenericGenerator::InstallProject() // If the project is a CMAKE project then run pre-install // and then read the cmake_install script to run it if ( !this->InstallProjectViaInstallCMakeProjects( - movable, tempInstallDirectory) ) + setDestDir, tempInstallDirectory) ) { return 0; } - if ( !movable ) + if ( setDestDir ) { cmSystemTools::PutEnv("DESTDIR="); } @@ -217,9 +223,9 @@ int cmCPackGenericGenerator::InstallProject() //---------------------------------------------------------------------- int cmCPackGenericGenerator::InstallProjectViaInstallCommands( - bool movable, const char* tempInstallDirectory) + bool setDestDir, const char* tempInstallDirectory) { - (void)movable; + (void)setDestDir; (void)tempInstallDirectory; const char* installCommands = this->GetOption("CPACK_INSTALL_COMMANDS"); if ( installCommands && *installCommands ) @@ -261,9 +267,9 @@ int cmCPackGenericGenerator::InstallProjectViaInstallCommands( //---------------------------------------------------------------------- int cmCPackGenericGenerator::InstallProjectViaInstalledDirectories( - bool movable, const char* tempInstallDirectory) + bool setDestDir, const char* tempInstallDirectory) { - (void)movable; + (void)setDestDir; (void)tempInstallDirectory; std::vector ignoreFilesRegex; const char* cpackIgnoreFiles = this->GetOption("CPACK_IGNORE_FILES"); @@ -299,7 +305,6 @@ int cmCPackGenericGenerator::InstallProjectViaInstalledDirectories( } std::vector::iterator it; const char* tempDir = tempInstallDirectory; -// this->GetOption("CPACK_TEMPORARY_DIRECTORY"); for ( it = installDirectoriesVector.begin(); it != installDirectoriesVector.end(); ++it ) @@ -362,7 +367,7 @@ int cmCPackGenericGenerator::InstallProjectViaInstalledDirectories( //---------------------------------------------------------------------- int cmCPackGenericGenerator::InstallProjectViaInstallScript( - bool movable, const char* tempInstallDirectory) + bool setDestDir, const char* tempInstallDirectory) { const char* cmakeScripts = this->GetOption("CPACK_INSTALL_SCRIPT"); @@ -384,10 +389,37 @@ int cmCPackGenericGenerator::InstallProjectViaInstallScript( cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- Install script: " << installScript << std::endl); - if ( movable ) + + if ( setDestDir ) + { + // For DESTDIR based packaging, use the *project* CMAKE_INSTALL_PREFIX + // underneath the tempInstallDirectory. The value of the project's + // CMAKE_INSTALL_PREFIX is sent in here as the value of the + // CPACK_INSTALL_PREFIX variable. + std::string dir = tempInstallDirectory; + if (this->GetOption("CPACK_INSTALL_PREFIX")) + { + dir += this->GetOption("CPACK_INSTALL_PREFIX"); + } + this->SetOption("CMAKE_INSTALL_PREFIX", dir.c_str()); + + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Using DESTDIR + CPACK_INSTALL_PREFIX... (this->SetOption)" + << std::endl); + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Setting CMAKE_INSTALL_PREFIX to '" << dir << "'" << std::endl); + } + else { this->SetOption("CMAKE_INSTALL_PREFIX", tempInstallDirectory); + + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Using non-DESTDIR install... (this->SetOption)" << std::endl); + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Setting CMAKE_INSTALL_PREFIX to '" << tempInstallDirectory + << "'" << std::endl); } + this->SetOptionIfNotSet("CMAKE_CURRENT_BINARY_DIR", tempInstallDirectory); this->SetOptionIfNotSet("CMAKE_CURRENT_SOURCE_DIR", @@ -404,7 +436,7 @@ int cmCPackGenericGenerator::InstallProjectViaInstallScript( //---------------------------------------------------------------------- int cmCPackGenericGenerator::InstallProjectViaInstallCMakeProjects( - bool movable, const char* tempInstallDirectory) + bool setDestDir, const char* tempInstallDirectory) { const char* cmakeProjects = this->GetOption("CPACK_INSTALL_CMAKE_PROJECTS"); @@ -517,10 +549,37 @@ int cmCPackGenericGenerator::InstallProjectViaInstallCMakeProjects( { realInstallDirectory += installSubDirectory; } - if ( movable ) + + if ( setDestDir ) + { + // For DESTDIR based packaging, use the *project* CMAKE_INSTALL_PREFIX + // underneath the tempInstallDirectory. The value of the project's + // CMAKE_INSTALL_PREFIX is sent in here as the value of the + // CPACK_INSTALL_PREFIX variable. + std::string dir = tempInstallDirectory; + if (this->GetOption("CPACK_INSTALL_PREFIX")) + { + dir += this->GetOption("CPACK_INSTALL_PREFIX"); + } + mf->AddDefinition("CMAKE_INSTALL_PREFIX", dir.c_str()); + + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Using DESTDIR + CPACK_INSTALL_PREFIX... (mf->AddDefinition)" + << std::endl); + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Setting CMAKE_INSTALL_PREFIX to '" << dir << "'" << std::endl); + } + else { mf->AddDefinition("CMAKE_INSTALL_PREFIX", tempInstallDirectory); + + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Using non-DESTDIR install... (mf->AddDefinition)" << std::endl); + cmCPackLogger(cmCPackLog::LOG_DEBUG, + "- Setting CMAKE_INSTALL_PREFIX to '" << tempInstallDirectory + << "'" << std::endl); } + if ( buildConfig && *buildConfig ) { mf->AddDefinition("BUILD_TYPE", buildConfig); @@ -701,6 +760,11 @@ int cmCPackGenericGenerator::Initialize(const char* name, cmMakefile* mf, return 0; } + // If a generator subclass did not already set this option in its + // InitializeInternal implementation, and the project did not already set + // it, the default value should be: + this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/"); + return result; } @@ -927,6 +991,15 @@ const char* cmCPackGenericGenerator::GetInstallPath() return this->InstallPath.c_str(); } +//---------------------------------------------------------------------- +const char* cmCPackGenericGenerator::GetPackagingInstallPrefix() +{ + cmCPackLogger(cmCPackLog::LOG_DEBUG, "GetPackagingInstallPrefix: '" + << this->GetOption("CPACK_PACKAGING_INSTALL_PREFIX") << "'" << std::endl); + + return this->GetOption("CPACK_PACKAGING_INSTALL_PREFIX"); +} + //---------------------------------------------------------------------- std::string cmCPackGenericGenerator::FindTemplate(const char* name) { @@ -960,8 +1033,6 @@ int cmCPackGenericGenerator::CleanTemporaryDirectory() { std::string tempInstallDirectoryWithPostfix = this->GetOption("CPACK_TEMPORARY_INSTALL_DIRECTORY"); - tempInstallDirectoryWithPostfix - += this->GetTemporaryInstallDirectoryPostfix(); const char* tempInstallDirectory = tempInstallDirectoryWithPostfix.c_str(); if(cmsys::SystemTools::FileExists(tempInstallDirectory)) { diff --git a/Source/CPack/cmCPackGenericGenerator.h b/Source/CPack/cmCPackGenericGenerator.h index 7e0b10a3d..ea59a913e 100644 --- a/Source/CPack/cmCPackGenericGenerator.h +++ b/Source/CPack/cmCPackGenericGenerator.h @@ -18,7 +18,6 @@ #ifndef cmCPackGenericGenerator_h #define cmCPackGenericGenerator_h - #include "cmObject.h" #define cmCPackTypeMacro(class, superclass) \ @@ -102,8 +101,7 @@ protected: virtual int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); virtual const char* GetInstallPath(); - virtual const char* GetInstallPrefix() { return "/"; } - virtual const char* GetTemporaryInstallDirectoryPostfix() { return ""; } + virtual const char* GetPackagingInstallPrefix(); virtual std::string FindTemplate(const char* name); virtual bool ConfigureFile(const char* inName, const char* outName, @@ -114,13 +112,13 @@ protected: //! Run install commands if specified virtual int InstallProjectViaInstallCommands( - bool movable, const char* tempInstallDirectory); + bool setDestDir, const char* tempInstallDirectory); virtual int InstallProjectViaInstallScript( - bool movable, const char* tempInstallDirectory); + bool setDestDir, const char* tempInstallDirectory); virtual int InstallProjectViaInstalledDirectories( - bool movable, const char* tempInstallDirectory); + bool setDestDir, const char* tempInstallDirectory); virtual int InstallProjectViaInstallCMakeProjects( - bool movable, const char* tempInstallDirectory); + bool setDestDir, const char* tempInstallDirectory); bool GeneratorVerbose; std::string Name; diff --git a/Source/CPack/cmCPackOSXX11Generator.cxx b/Source/CPack/cmCPackOSXX11Generator.cxx index 27c411f4e..6d04b6e76 100644 --- a/Source/CPack/cmCPackOSXX11Generator.cxx +++ b/Source/CPack/cmCPackOSXX11Generator.cxx @@ -178,8 +178,6 @@ int cmCPackOSXX11Generator::InitializeInternal() this->SetOptionIfNotSet("CPACK_INSTALLER_PROGRAM_DISK_IMAGE", pkgPath.c_str()); - - return this->Superclass::InitializeInternal(); } @@ -228,6 +226,7 @@ bool cmCPackOSXX11Generator::CopyCreateResourceFile(const char* name) } */ +//---------------------------------------------------------------------- bool cmCPackOSXX11Generator::CopyResourcePlistFile(const char* name, const char* dir, const char* outputFileName /* = 0 */, bool copyOnly /* = false */) @@ -259,7 +258,7 @@ bool cmCPackOSXX11Generator::CopyResourcePlistFile(const char* name, } //---------------------------------------------------------------------- -const char* cmCPackOSXX11Generator::GetInstallPrefix() +const char* cmCPackOSXX11Generator::GetPackagingInstallPrefix() { this->InstallPrefix = "/"; this->InstallPrefix += this->GetOption("CPACK_PACKAGE_FILE_NAME"); diff --git a/Source/CPack/cmCPackOSXX11Generator.h b/Source/CPack/cmCPackOSXX11Generator.h index 8d9fef5da..c4c5ae94f 100644 --- a/Source/CPack/cmCPackOSXX11Generator.h +++ b/Source/CPack/cmCPackOSXX11Generator.h @@ -40,7 +40,7 @@ protected: virtual int InitializeInternal(); int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); - virtual const char* GetInstallPrefix(); + virtual const char* GetPackagingInstallPrefix(); virtual const char* GetOutputExtension() { return ".dmg"; } //bool CopyCreateResourceFile(const char* name, const char* dir); diff --git a/Source/CPack/cmCPackPackageMakerGenerator.cxx b/Source/CPack/cmCPackPackageMakerGenerator.cxx index 95c1e1d7c..79dac067e 100644 --- a/Source/CPack/cmCPackPackageMakerGenerator.cxx +++ b/Source/CPack/cmCPackPackageMakerGenerator.cxx @@ -141,6 +141,7 @@ int cmCPackPackageMakerGenerator::InitializeInternal() { cmCPackLogger(cmCPackLog::LOG_DEBUG, "cmCPackPackageMakerGenerator::Initialize()" << std::endl); + this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr"); std::vector path; std::string pkgPath = "/Developer/Applications/Utilities/PackageMaker.app/Contents"; diff --git a/Source/CPack/cmCPackPackageMakerGenerator.h b/Source/CPack/cmCPackPackageMakerGenerator.h index 17adb148a..21cb4fca2 100644 --- a/Source/CPack/cmCPackPackageMakerGenerator.h +++ b/Source/CPack/cmCPackPackageMakerGenerator.h @@ -44,7 +44,6 @@ protected: const std::vector& files); virtual const char* GetOutputExtension() { return ".dmg"; } virtual const char* GetOutputPostfix() { return "darwin"; } - virtual const char* GetInstallPrefix() { return "/usr"; } bool CopyCreateResourceFile(const char* name); bool CopyResourcePlistFile(const char* name); diff --git a/Source/CPack/cmCPackRPMGenerator.cxx b/Source/CPack/cmCPackRPMGenerator.cxx index 4816570f0..18544b85f 100644 --- a/Source/CPack/cmCPackRPMGenerator.cxx +++ b/Source/CPack/cmCPackRPMGenerator.cxx @@ -27,6 +27,14 @@ cmCPackRPMGenerator::~cmCPackRPMGenerator() { } +//---------------------------------------------------------------------- +int cmCPackRPMGenerator::InitializeInternal() +{ + this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr"); + + return this->Superclass::InitializeInternal(); +} + //---------------------------------------------------------------------- int cmCPackRPMGenerator::CompressFiles(const char* /*outFileName*/, const char* /*toplevel*/, diff --git a/Source/CPack/cmCPackRPMGenerator.h b/Source/CPack/cmCPackRPMGenerator.h index 4279c3a82..e4ddf97b1 100644 --- a/Source/CPack/cmCPackRPMGenerator.h +++ b/Source/CPack/cmCPackRPMGenerator.h @@ -41,10 +41,10 @@ public: virtual ~cmCPackRPMGenerator(); protected: + virtual int InitializeInternal(); virtual int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); virtual const char* GetOutputExtension() { return ".rpm"; } - virtual const char* GetInstallPrefix() { return "/usr"; } };