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."
|
"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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue