summaryrefslogtreecommitdiffstats
path: root/Source/CPack/cmCPackGenericGenerator.cxx
diff options
context:
space:
mode:
authorDavid Cole <david.cole@kitware.com>2007-10-31 12:50:17 (GMT)
committerDavid Cole <david.cole@kitware.com>2007-10-31 12:50:17 (GMT)
commit5beb1da7f741c50659204cf1fbd264b5dcb7dd02 (patch)
tree3f380217cabb03a40aac217a2cde19346bb05ab9 /Source/CPack/cmCPackGenericGenerator.cxx
parent0386e711b8de89051bf1e1fdb178c0ab7a28132b (diff)
downloadCMake-5beb1da7f741c50659204cf1fbd264b5dcb7dd02.zip
CMake-5beb1da7f741c50659204cf1fbd264b5dcb7dd02.tar.gz
CMake-5beb1da7f741c50659204cf1fbd264b5dcb7dd02.tar.bz2
ENH: Add CPACK_SET_DESTDIR handling to enable packaging of installed files in absolute locations. With this setting on, cpack will set the DESTDIR env var when building the package so that files end up in their intended locations. Default behavior is not to set DESTDIR for backwards compatibility. Helps address issue #4993 and issue #5257. Also, remove unused CPACK_USE_DESTDIR variable. ENH: Add variable CPACK_PACKAGING_INSTALL_PREFIX to allow overriding the CPack GetPackagingInstallPrefix from a project's CMakeLists file if necessary. Could be used to remove the annoying /usr prefix still used by default in the Mac PackageMaker generator.
Diffstat (limited to 'Source/CPack/cmCPackGenericGenerator.cxx')
-rw-r--r--Source/CPack/cmCPackGenericGenerator.cxx123
1 files changed, 97 insertions, 26 deletions
diff --git a/Source/CPack/cmCPackGenericGenerator.cxx b/Source/CPack/cmCPackGenericGenerator.cxx
index 1987a4d..e961357 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<cmsys::RegularExpression> ignoreFilesRegex;
const char* cpackIgnoreFiles = this->GetOption("CPACK_IGNORE_FILES");
@@ -299,7 +305,6 @@ int cmCPackGenericGenerator::InstallProjectViaInstalledDirectories(
}
std::vector<std::string>::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;
}
@@ -928,6 +992,15 @@ const char* cmCPackGenericGenerator::GetInstallPath()
}
//----------------------------------------------------------------------
+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)
{
cmCPackLogger(cmCPackLog::LOG_DEBUG, "Look for template: "
@@ -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))
{