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."
" The script is not called by e.g.: make install.", false,
"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();
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
int res = mf->ReadListFile(0, installFile.c_str());
// Now rebuild the list of files after installation
// of the current component (if we are in component install)
if (componentInstall)
@ -1460,6 +1479,12 @@ cmCPackGenerator::SupportsSetDestdir() const
return cmCPackGenerator::SETDESTDIR_SUPPORTED;
}
//----------------------------------------------------------------------
bool cmCPackGenerator::SupportsAbsoluteDestination() const
{
return true;
}
//----------------------------------------------------------------------
bool cmCPackGenerator::SupportsComponentInstallation() const
{

View File

@ -206,12 +206,21 @@ protected:
/**
* 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.
* @return CPackSetDestdirSupport
*/
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?.
* Some Generators requires the user to set

View File

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

View File

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

View File

@ -80,6 +80,15 @@ void cmInstallGenerator
}
}
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();
if(optional)