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:
parent
6ba055bacd
commit
47f0dbd70b
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -638,6 +638,12 @@ cmCPackNSISGenerator::SupportsSetDestdir() const
|
|||
return cmCPackGenerator::SETDESTDIR_SHOULD_NOT_BE_USED;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
bool cmCPackNSISGenerator::SupportsAbsoluteDestination() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
bool cmCPackNSISGenerator::SupportsComponentInstallation() const
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue