CPack add necessary check to detect/warns/error on ABSOLUTE DESTINATION

The [usually] wrong usage of absolute DESTINATION in INSTALL rules
keeps popping-up on the ML. We shall have some way to:
  1) easily detect it.
  2) forbids this for some CPack generator like NSIS
In fact it should certainly be forbidden for *any* generators
when used on Windows but we may implements that on top of the current
patch.
The patch ask the task to the generated cmake_install.cmake scripts.
Those scripts are a little bit more complicated with that but
iff there are absolute DESTINATION. This cost nothing if relative
DESTINATION are used.
Two new vars are introduced (and documented to handle that):
CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION
and
CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION
This commit is contained in:
Eric NOULARD 2012-05-14 23:29:42 +02:00
parent 6ba055bacd
commit 47f0dbd70b
6 changed files with 67 additions and 1 deletions

View File

@ -77,4 +77,20 @@ void cmCPackDocumentVariables::DefineVariables(cmake* cm)
"which is done right before packaging the files." "which is done right before packaging the files."
" The script is not called by e.g.: make install.", false, " The script is not called by e.g.: make install.", false,
"Variables common to all CPack generators"); "Variables common to all CPack generators");
cm->DefineProperty
("CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION", cmProperty::VARIABLE,
"Ask CPack to warn each time a file with absolute INSTALL"
" DESTINATION is encountered.",
"", false,
"Variables common to all CPack generators");
cm->DefineProperty
("CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION", cmProperty::VARIABLE,
"Ask CPack to error out as soon as a file with absolute INSTALL"
" DESTINATION is encountered",
"The fatal error is emitted before the installation of "
"the offending file takes place. Some CPack generators, like NSIS,"
"enforce this internally.", false,
"Variables common to all CPack generators");
} }

View File

@ -849,8 +849,27 @@ int cmCPackGenerator::InstallProjectViaInstallCMakeProjects(
filesBefore = glB.GetFiles(); filesBefore = glB.GetFiles();
std::sort(filesBefore.begin(),filesBefore.end()); std::sort(filesBefore.begin(),filesBefore.end());
} }
// If CPack was asked to warn on ABSOLUTE INSTALL DESTINATION
// then forward request to cmake_install.cmake script
if (this->GetOption("CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION"))
{
mf->AddDefinition("CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION",
"1");
}
// If current CPack generator does support
// ABSOLUTE INSTALL DESTINATION or CPack has been asked for
// then ask cmake_install.cmake script to error out
// as soon as it occurs (before installing file)
if (!SupportsAbsoluteDestination() ||
this->GetOption("CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION"))
{
mf->AddDefinition("CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION",
"1");
}
// do installation // do installation
int res = mf->ReadListFile(0, installFile.c_str()); int res = mf->ReadListFile(0, installFile.c_str());
// Now rebuild the list of files after installation // Now rebuild the list of files after installation
// of the current component (if we are in component install) // of the current component (if we are in component install)
if (componentInstall) if (componentInstall)
@ -1460,6 +1479,12 @@ cmCPackGenerator::SupportsSetDestdir() const
return cmCPackGenerator::SETDESTDIR_SUPPORTED; return cmCPackGenerator::SETDESTDIR_SUPPORTED;
} }
//----------------------------------------------------------------------
bool cmCPackGenerator::SupportsAbsoluteDestination() const
{
return true;
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool cmCPackGenerator::SupportsComponentInstallation() const bool cmCPackGenerator::SupportsComponentInstallation() const
{ {

View File

@ -206,12 +206,21 @@ protected:
/** /**
* Does the CPack generator support CPACK_SET_DESTDIR? * Does the CPack generator support CPACK_SET_DESTDIR?
* The default legacy value is 'true' generator * The default legacy value is 'SETDESTDIR_SUPPORTED' generator
* have to override it in order change this. * have to override it in order change this.
* @return CPackSetDestdirSupport * @return CPackSetDestdirSupport
*/ */
virtual enum CPackSetDestdirSupport SupportsSetDestdir() const; virtual enum CPackSetDestdirSupport SupportsSetDestdir() const;
/**
* Does the CPack generator support absolute path
* in INSTALL DESTINATION?
* The default legacy value is 'true' generator
* have to override it in order change this.
* @return true if supported false otherwise
*/
virtual bool SupportsAbsoluteDestination() const;
/** /**
* Does the CPack generator support component installation?. * Does the CPack generator support component installation?.
* Some Generators requires the user to set * Some Generators requires the user to set

View File

@ -638,6 +638,12 @@ cmCPackNSISGenerator::SupportsSetDestdir() const
return cmCPackGenerator::SETDESTDIR_SHOULD_NOT_BE_USED; return cmCPackGenerator::SETDESTDIR_SHOULD_NOT_BE_USED;
} }
//----------------------------------------------------------------------
bool cmCPackNSISGenerator::SupportsAbsoluteDestination() const
{
return false;
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool cmCPackNSISGenerator::SupportsComponentInstallation() const bool cmCPackNSISGenerator::SupportsComponentInstallation() const
{ {

View File

@ -45,6 +45,7 @@ protected:
std::vector<std::string>& dirs); std::vector<std::string>& dirs);
enum cmCPackGenerator::CPackSetDestdirSupport SupportsSetDestdir() const; enum cmCPackGenerator::CPackSetDestdirSupport SupportsSetDestdir() const;
virtual bool SupportsAbsoluteDestination() const;
virtual bool SupportsComponentInstallation() const; virtual bool SupportsComponentInstallation() const;
/// Produce a string that contains the NSIS code to describe a /// Produce a string that contains the NSIS code to describe a

View File

@ -80,6 +80,15 @@ void cmInstallGenerator
} }
} }
os << "\")\n"; os << "\")\n";
os << indent << "IF (CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION)\n";
os << indent << indent << "message(WARNING \"ABSOLUTE path INSTALL "
<< "DESTINATION : ${CPACK_ABSOLUTE_DESTINATION_FILES}\")\n";
os << indent << "ENDIF (CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION)\n";
os << indent << "IF (CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION)\n";
os << indent << indent << "message(FATAL_ERROR \"ABSOLUTE path INSTALL "
<< "DESTINATION forbidden (by CPack): ${CPACK_ABSOLUTE_DESTINATION_FILES}\")\n";
os << indent << "ENDIF (CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION)\n";
} }
os << "FILE(INSTALL DESTINATION \"" << dest << "\" TYPE " << stype.c_str(); os << "FILE(INSTALL DESTINATION \"" << dest << "\" TYPE " << stype.c_str();
if(optional) if(optional)