Merge topic 'cpack-properties'

d0b1d2a6 CPackWiX: Implement CPACK_NEVER_OVERWRITE and CPACK_PERMANENT properties
15a8af21 Add an "installed file" property scope
This commit is contained in:
Brad King 2014-05-28 12:34:36 -04:00 committed by CMake Topic Stage
commit 8df4d03d99
47 changed files with 650 additions and 15 deletions

View File

@ -376,10 +376,10 @@ documentation:
See the :manual:`cmake-policies(7)` manual See the :manual:`cmake-policies(7)` manual
and the :command:`cmake_policy` command. and the :command:`cmake_policy` command.
``prop_cache, prop_dir, prop_gbl, prop_sf, prop_test, prop_tgt`` ``prop_cache, prop_dir, prop_gbl, prop_sf, prop_inst, prop_test, prop_tgt``
A CMake cache, directory, global, source file, test, or target A CMake cache, directory, global, source file, installed file, test,
property, respectively. See the :manual:`cmake-properties(7)` manual or target property, respectively. See the :manual:`cmake-properties(7)`
and the :command:`set_property` command. manual and the :command:`set_property` command.
``variable`` ``variable``
A CMake language variable. A CMake language variable.

View File

@ -308,3 +308,12 @@ Properties on Cache Entries
/prop_cache/STRINGS /prop_cache/STRINGS
/prop_cache/TYPE /prop_cache/TYPE
/prop_cache/VALUE /prop_cache/VALUE
Properties on Installed Files
=============================
.. toctree::
:maxdepth: 1
/prop_inst/CPACK_NEVER_OVERWRITE.rst
/prop_inst/CPACK_PERMANENT.rst

View File

@ -0,0 +1,6 @@
CPACK_NEVER_OVERWRITE
---------------------
Request that this file not be overwritten on install or reinstall.
The property is currently only supported by the WIX generator.

View File

@ -0,0 +1,6 @@
CPACK_PERMANENT
---------------
Request that this file not be removed on uninstall.
The property is currently only supported by the WIX generator.

View File

@ -163,6 +163,8 @@ set(SRCS
cmComputeLinkInformation.h cmComputeLinkInformation.h
cmComputeTargetDepends.h cmComputeTargetDepends.h
cmComputeTargetDepends.cxx cmComputeTargetDepends.cxx
cmCPackPropertiesGenerator.h
cmCPackPropertiesGenerator.cxx
cmCryptoHash.cxx cmCryptoHash.cxx
cmCryptoHash.h cmCryptoHash.h
cmCustomCommand.cxx cmCustomCommand.cxx
@ -243,6 +245,8 @@ set(SRCS
cmInstallGenerator.h cmInstallGenerator.h
cmInstallGenerator.cxx cmInstallGenerator.cxx
cmInstallExportGenerator.cxx cmInstallExportGenerator.cxx
cmInstalledFile.h
cmInstalledFile.cxx
cmInstallFilesGenerator.h cmInstallFilesGenerator.h
cmInstallFilesGenerator.cxx cmInstallFilesGenerator.cxx
cmInstallScriptGenerator.h cmInstallScriptGenerator.h

View File

@ -15,6 +15,7 @@
#include <cmSystemTools.h> #include <cmSystemTools.h>
#include <cmGeneratedFileStream.h> #include <cmGeneratedFileStream.h>
#include <cmCryptoHash.h> #include <cmCryptoHash.h>
#include <cmInstalledFile.h>
#include <CPack/cmCPackLog.h> #include <CPack/cmCPackLog.h>
#include <CPack/cmCPackComponentGroup.h> #include <CPack/cmCPackComponentGroup.h>
@ -871,8 +872,11 @@ void cmCPackWIXGenerator::AddDirectoryAndFileDefinitons(
} }
else else
{ {
cmInstalledFile const* installedFile =
this->GetInstalledFile(relativePath);
std::string componentId = fileDefinitions.EmitComponentFile( std::string componentId = fileDefinitions.EmitComponentFile(
directoryId, id, fullPath, *(this->Patch)); directoryId, id, fullPath, *(this->Patch), installedFile);
featureDefinitions.EmitComponentRef(componentId); featureDefinitions.EmitComponentRef(componentId);

View File

@ -12,6 +12,8 @@
#include "cmWIXFilesSourceWriter.h" #include "cmWIXFilesSourceWriter.h"
#include <cmInstalledFile.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -135,7 +137,8 @@ std::string cmWIXFilesSourceWriter::EmitComponentFile(
std::string const& directoryId, std::string const& directoryId,
std::string const& id, std::string const& id,
std::string const& filePath, std::string const& filePath,
cmWIXPatch &patch) cmWIXPatch &patch,
cmInstalledFile const* installedFile)
{ {
std::string componentId = std::string("CM_C") + id; std::string componentId = std::string("CM_C") + id;
std::string fileId = std::string("CM_F") + id; std::string fileId = std::string("CM_F") + id;
@ -147,6 +150,18 @@ std::string cmWIXFilesSourceWriter::EmitComponentFile(
AddAttribute("Id", componentId); AddAttribute("Id", componentId);
AddAttribute("Guid", "*"); AddAttribute("Guid", "*");
if(installedFile)
{
if(installedFile->GetPropertyAsBool("CPACK_NEVER_OVERWRITE"))
{
AddAttribute("NeverOverwrite", "yes");
}
if(installedFile->GetPropertyAsBool("CPACK_PERMANENT"))
{
AddAttribute("Permanent", "yes");
}
}
BeginElement("File"); BeginElement("File");
AddAttribute("Id", fileId); AddAttribute("Id", fileId);
AddAttribute("Source", filePath); AddAttribute("Source", filePath);

View File

@ -53,7 +53,8 @@ public:
std::string const& directoryId, std::string const& directoryId,
std::string const& id, std::string const& id,
std::string const& filePath, std::string const& filePath,
cmWIXPatch &patch); cmWIXPatch &patch,
cmInstalledFile const* installedFile);
private: private:
void EmitInstallRegistryValue( void EmitInstallRegistryValue(

View File

@ -1313,6 +1313,14 @@ int cmCPackGenerator::CleanTemporaryDirectory()
return 1; return 1;
} }
//----------------------------------------------------------------------
cmInstalledFile const* cmCPackGenerator::GetInstalledFile(
std::string const& name) const
{
cmake const* cm = this->MakefileMap->GetCMakeInstance();
return cm->GetInstalledFile(name);
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
int cmCPackGenerator::PrepareGroupingKind() int cmCPackGenerator::PrepareGroupingKind()
{ {

View File

@ -47,6 +47,7 @@
class cmMakefile; class cmMakefile;
class cmCPackLog; class cmCPackLog;
class cmInstalledFile;
/** \class cmCPackGenerator /** \class cmCPackGenerator
* \brief A superclass of all CPack Generators * \brief A superclass of all CPack Generators
@ -129,6 +130,8 @@ protected:
int CleanTemporaryDirectory(); int CleanTemporaryDirectory();
cmInstalledFile const* GetInstalledFile(std::string const& name) const;
virtual const char* GetOutputExtension() { return ".cpack"; } virtual const char* GetOutputExtension() { return ".cpack"; }
virtual const char* GetOutputPostfix() { return 0; } virtual const char* GetOutputPostfix() { return 0; }

View File

@ -257,6 +257,11 @@ int main (int argc, char const* const* argv)
return 1; return 1;
} }
if ( !cpackBuildConfig.empty() )
{
globalMF->AddDefinition("CPACK_BUILD_CONFIG", cpackBuildConfig.c_str());
}
if ( cmSystemTools::FileExists(cpackConfigFile.c_str()) ) if ( cmSystemTools::FileExists(cpackConfigFile.c_str()) )
{ {
cpackConfigFile = cpackConfigFile =
@ -317,10 +322,6 @@ int main (int argc, char const* const* argv)
cpackProjectDirectory.c_str()); cpackProjectDirectory.c_str());
} }
} }
if ( !cpackBuildConfig.empty() )
{
globalMF->AddDefinition("CPACK_BUILD_CONFIG", cpackBuildConfig.c_str());
}
cpackDefinitions::MapType::iterator cdit; cpackDefinitions::MapType::iterator cdit;
for ( cdit = definitions.Map.begin(); for ( cdit = definitions.Map.begin();
cdit != definitions.Map.end(); cdit != definitions.Map.end();

View File

@ -0,0 +1,45 @@
#include "cmCPackPropertiesGenerator.h"
#include "cmLocalGenerator.h"
cmCPackPropertiesGenerator::cmCPackPropertiesGenerator(
cmMakefile* mf,
cmInstalledFile const& installedFile,
std::vector<std::string> const& configurations):
cmScriptGenerator("CPACK_BUILD_CONFIG", configurations),
Makefile(mf),
InstalledFile(installedFile)
{
this->ActionsPerConfig = true;
}
void cmCPackPropertiesGenerator::GenerateScriptForConfig(std::ostream& os,
const std::string& config, Indent const& indent)
{
std::string const& expandedFileName =
this->InstalledFile.GetNameExpression().Evaluate(this->Makefile, config);
cmInstalledFile::PropertyMapType const& properties =
this->InstalledFile.GetProperties();
for(cmInstalledFile::PropertyMapType::const_iterator i = properties.begin();
i != properties.end(); ++i)
{
std::string const& name = i->first;
cmInstalledFile::Property const& property = i->second;
os << indent << "set_property(INSTALL " <<
cmLocalGenerator::EscapeForCMake(expandedFileName) << " PROPERTY " <<
cmLocalGenerator::EscapeForCMake(name);
for(cmInstalledFile::ExpressionVectorType::const_iterator
j = property.ValueExpressions.begin();
j != property.ValueExpressions.end(); ++j)
{
std::string value = (*j)->Evaluate(this->Makefile, config);
os << " " << cmLocalGenerator::EscapeForCMake(value);
}
os << ")\n";
}
}

View File

@ -0,0 +1,38 @@
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2014 Kitware, Inc., Insight Software Consortium
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#ifndef cmCPackPropertiesGenerator_h
#define cmCPackPropertiesGenerator_h
#include "cmScriptGenerator.h"
#include "cmInstalledFile.h"
/** \class cmCPackPropertiesGenerator
* \brief Support class for generating CPackProperties.cmake.
*
*/
class cmCPackPropertiesGenerator: public cmScriptGenerator
{
public:
cmCPackPropertiesGenerator(
cmMakefile* mf,
cmInstalledFile const& installedFile,
std::vector<std::string> const& configurations);
protected:
virtual void GenerateScriptForConfig(std::ostream& os,
const std::string& config, Indent const& indent);
cmMakefile* Makefile;
cmInstalledFile const& InstalledFile;
};
#endif

View File

@ -67,12 +67,16 @@ bool cmGetPropertyCommand
{ {
scope = cmProperty::CACHE; scope = cmProperty::CACHE;
} }
else if(args[1] == "INSTALL")
{
scope = cmProperty::INSTALL;
}
else else
{ {
cmOStringStream e; cmOStringStream e;
e << "given invalid scope " << args[1] << ". " e << "given invalid scope " << args[1] << ". "
<< "Valid scopes are " << "Valid scopes are "
<< "GLOBAL, DIRECTORY, TARGET, SOURCE, TEST, VARIABLE, CACHE."; << "GLOBAL, DIRECTORY, TARGET, SOURCE, TEST, VARIABLE, CACHE, INSTALL.";
this->SetError(e.str()); this->SetError(e.str());
return false; return false;
} }
@ -190,6 +194,7 @@ bool cmGetPropertyCommand
case cmProperty::TEST: return this->HandleTestMode(); case cmProperty::TEST: return this->HandleTestMode();
case cmProperty::VARIABLE: return this->HandleVariableMode(); case cmProperty::VARIABLE: return this->HandleVariableMode();
case cmProperty::CACHE: return this->HandleCacheMode(); case cmProperty::CACHE: return this->HandleCacheMode();
case cmProperty::INSTALL: return this->HandleInstallMode();
case cmProperty::CACHED_VARIABLE: case cmProperty::CACHED_VARIABLE:
break; // should never happen break; // should never happen
@ -395,3 +400,33 @@ bool cmGetPropertyCommand::HandleCacheMode()
this->StoreResult(value); this->StoreResult(value);
return true; return true;
} }
//----------------------------------------------------------------------------
bool cmGetPropertyCommand::HandleInstallMode()
{
if(this->Name.empty())
{
this->SetError("not given name for INSTALL scope.");
return false;
}
// Get the installed file.
cmake* cm = this->Makefile->GetCMakeInstance();
if(cmInstalledFile* file = cm->GetOrCreateInstalledFile(
this->Makefile, this->Name))
{
std::string value;
bool isSet = file->GetProperty(this->PropertyName, value);
return this->StoreResult(isSet ? value.c_str() : 0);
}
else
{
cmOStringStream e;
e << "given INSTALL name that could not be found or created: "
<< this->Name;
this->SetError(e.str());
return false;
}
}

View File

@ -60,6 +60,7 @@ private:
bool HandleTestMode(); bool HandleTestMode();
bool HandleVariableMode(); bool HandleVariableMode();
bool HandleCacheMode(); bool HandleCacheMode();
bool HandleInstallMode();
}; };
#endif #endif

View File

@ -28,6 +28,7 @@
#include "cmGeneratorExpression.h" #include "cmGeneratorExpression.h"
#include "cmGeneratorExpressionEvaluationFile.h" #include "cmGeneratorExpressionEvaluationFile.h"
#include "cmExportBuildFileGenerator.h" #include "cmExportBuildFileGenerator.h"
#include "cmCPackPropertiesGenerator.h"
#include <cmsys/Directory.hxx> #include <cmsys/Directory.hxx>
#include <cmsys/FStream.hxx> #include <cmsys/FStream.hxx>
@ -1269,6 +1270,13 @@ void cmGlobalGenerator::Generate()
} }
this->SetCurrentLocalGenerator(0); this->SetCurrentLocalGenerator(0);
if(!this->GenerateCPackPropertiesFile())
{
this->GetCMakeInstance()->IssueMessage(
cmake::FATAL_ERROR, "Could not write CPack properties file.",
cmListFileBacktrace());
}
for (std::map<std::string, cmExportBuildFileGenerator*>::iterator for (std::map<std::string, cmExportBuildFileGenerator*>::iterator
it = this->BuildExportSets.begin(); it != this->BuildExportSets.end(); it = this->BuildExportSets.begin(); it != this->BuildExportSets.end();
++it) ++it)
@ -3014,3 +3022,39 @@ std::string cmGlobalGenerator::ExpandCFGIntDir(const std::string& str,
{ {
return str; return str;
} }
//----------------------------------------------------------------------------
bool cmGlobalGenerator::GenerateCPackPropertiesFile()
{
cmake::InstalledFilesMap const& installedFiles =
this->CMakeInstance->GetInstalledFiles();
cmMakefile* mf = this->LocalGenerators[0]->GetMakefile();
std::vector<std::string> configs;
std::string config = mf->GetConfigurations(configs, false);
std::string path = this->CMakeInstance->GetStartOutputDirectory();
path += "/CPackProperties.cmake";
if(!cmSystemTools::FileExists(path.c_str()) && installedFiles.empty())
{
return true;
}
cmGeneratedFileStream file(path.c_str());
file << "# CPack properties\n";
for(cmake::InstalledFilesMap::const_iterator i = installedFiles.begin();
i != installedFiles.end(); ++i)
{
cmInstalledFile const& installedFile = i->second;
cmCPackPropertiesGenerator cpackPropertiesGenerator(
mf, installedFile, configs);
cpackPropertiesGenerator.Generate(file, config, configs);
}
return true;
}

View File

@ -329,6 +329,8 @@ public:
virtual void ComputeTargetObjectDirectory(cmGeneratorTarget* gt) const; virtual void ComputeTargetObjectDirectory(cmGeneratorTarget* gt) const;
bool GenerateCPackPropertiesFile();
protected: protected:
typedef std::vector<cmLocalGenerator*> GeneratorVector; typedef std::vector<cmLocalGenerator*> GeneratorVector;
// for a project collect all its targets by following depend // for a project collect all its targets by following depend

115
Source/cmInstalledFile.cxx Normal file
View File

@ -0,0 +1,115 @@
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2014 Kitware, Inc., Insight Software Consortium
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#include "cmInstalledFile.h"
#include "cmSystemTools.h"
#include "cmMakefile.h"
//----------------------------------------------------------------------------
cmInstalledFile::cmInstalledFile():
NameExpression(0)
{
}
//----------------------------------------------------------------------------
cmInstalledFile::~cmInstalledFile()
{
if(NameExpression)
{
delete NameExpression;
}
}
//----------------------------------------------------------------------------
void cmInstalledFile::SetName(cmMakefile* mf, const std::string& name)
{
cmListFileBacktrace backtrace;
mf->GetBacktrace(backtrace);
cmGeneratorExpression ge(backtrace);
this->Name = name;
this->NameExpression = ge.Parse(name).release();
}
//----------------------------------------------------------------------------
std::string const& cmInstalledFile::GetName() const
{
return this->Name;
}
//----------------------------------------------------------------------------
cmCompiledGeneratorExpression const& cmInstalledFile::GetNameExpression() const
{
return *(this->NameExpression);
}
//----------------------------------------------------------------------------
void cmInstalledFile::RemoveProperty(const std::string& prop)
{
this->Properties.erase(prop);
}
//----------------------------------------------------------------------------
void cmInstalledFile::SetProperty(cmMakefile const* mf,
const std::string& prop, const char* value)
{
this->RemoveProperty(prop);
this->AppendProperty(mf, prop, value);
}
//----------------------------------------------------------------------------
void cmInstalledFile::AppendProperty(cmMakefile const* mf,
const std::string& prop, const char* value, bool /*asString*/)
{
cmListFileBacktrace backtrace;
mf->GetBacktrace(backtrace);
cmGeneratorExpression ge(backtrace);
Property& property = this->Properties[prop];
property.ValueExpressions.push_back(ge.Parse(value).release());
}
//----------------------------------------------------------------------------
bool cmInstalledFile::GetProperty(
const std::string& prop, std::string& value) const
{
PropertyMapType::const_iterator i = this->Properties.find(prop);
if(i == this->Properties.end())
{
return false;
}
Property const& property = i->second;
std::string output;
std::string separator;
for(ExpressionVectorType::const_iterator
j = property.ValueExpressions.begin();
j != property.ValueExpressions.end(); ++j)
{
output += separator;
output += (*j)->GetInput();
separator = ";";
}
value = output;
return true;
}
//----------------------------------------------------------------------------
bool cmInstalledFile::GetPropertyAsBool(const std::string& prop) const
{
std::string value;
bool isSet = this->GetProperty(prop, value);
return isSet && cmSystemTools::IsOn(value.c_str());
}

83
Source/cmInstalledFile.h Normal file
View File

@ -0,0 +1,83 @@
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2014 Kitware, Inc., Insight Software Consortium
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#ifndef cmInstalledFile_h
#define cmInstalledFile_h
#include "cmGeneratorExpression.h"
/** \class cmInstalledFile
* \brief Represents a file intended for installation.
*
* cmInstalledFile represents a file intended for installation.
*/
class cmInstalledFile
{
public:
typedef cmsys::auto_ptr<cmCompiledGeneratorExpression>
CompiledGeneratorExpressionPtrType;
typedef std::vector<cmCompiledGeneratorExpression*>
ExpressionVectorType;
struct Property
{
Property()
{
}
~Property()
{
for(ExpressionVectorType::iterator i = ValueExpressions.begin();
i != ValueExpressions.end(); ++i)
{
delete *i;
}
}
ExpressionVectorType ValueExpressions;
};
typedef std::map<std::string, Property> PropertyMapType;
cmInstalledFile();
~cmInstalledFile();
void RemoveProperty(const std::string& prop);
void SetProperty(cmMakefile const* mf,
const std::string& prop, const char *value);
void AppendProperty(cmMakefile const* mf,
const std::string& prop, const char* value,bool asString=false);
bool GetProperty(const std::string& prop, std::string& value) const;
bool GetPropertyAsBool(const std::string& prop) const;
void SetName(cmMakefile* mf, const std::string& name);
std::string const& GetName() const;
cmCompiledGeneratorExpression const& GetNameExpression() const;
PropertyMapType const& GetProperties() const { return this->Properties; }
private:
std::string Name;
cmCompiledGeneratorExpression* NameExpression;
PropertyMapType Properties;
};
#endif

View File

@ -18,7 +18,7 @@ class cmProperty
{ {
public: public:
enum ScopeType { TARGET, SOURCE_FILE, DIRECTORY, GLOBAL, CACHE, enum ScopeType { TARGET, SOURCE_FILE, DIRECTORY, GLOBAL, CACHE,
TEST, VARIABLE, CACHED_VARIABLE }; TEST, VARIABLE, CACHED_VARIABLE, INSTALL };
// set this property // set this property
void Set(const std::string& name, const char *value); void Set(const std::string& name, const char *value);

View File

@ -39,7 +39,8 @@ cmRST::cmRST(std::ostream& os, std::string const& docroot):
ModuleRST("^#\\[(=*)\\[\\.rst:$"), ModuleRST("^#\\[(=*)\\[\\.rst:$"),
CMakeRole("(:cmake)?:(" CMakeRole("(:cmake)?:("
"command|generator|variable|module|policy|" "command|generator|variable|module|policy|"
"prop_cache|prop_dir|prop_gbl|prop_sf|prop_test|prop_tgt|" "prop_cache|prop_dir|prop_gbl|prop_inst|prop_sf|"
"prop_test|prop_tgt|"
"manual" "manual"
"):`(<*([^`<]|[^` \t]<)*)([ \t]+<[^`]*>)?`"), "):`(<*([^`<]|[^` \t]<)*)([ \t]+<[^`]*>)?`"),
Substitution("(^|[^A-Za-z0-9_])" Substitution("(^|[^A-Za-z0-9_])"

View File

@ -61,11 +61,16 @@ bool cmSetPropertyCommand
{ {
scope = cmProperty::CACHE; scope = cmProperty::CACHE;
} }
else if(*arg == "INSTALL")
{
scope = cmProperty::INSTALL;
}
else else
{ {
cmOStringStream e; cmOStringStream e;
e << "given invalid scope " << *arg << ". " e << "given invalid scope " << *arg << ". "
<< "Valid scopes are GLOBAL, DIRECTORY, TARGET, SOURCE, TEST, CACHE."; << "Valid scopes are GLOBAL, DIRECTORY, "
"TARGET, SOURCE, TEST, CACHE, INSTALL.";
this->SetError(e.str()); this->SetError(e.str());
return false; return false;
} }
@ -135,6 +140,7 @@ bool cmSetPropertyCommand
case cmProperty::SOURCE_FILE: return this->HandleSourceMode(); case cmProperty::SOURCE_FILE: return this->HandleSourceMode();
case cmProperty::TEST: return this->HandleTestMode(); case cmProperty::TEST: return this->HandleTestMode();
case cmProperty::CACHE: return this->HandleCacheMode(); case cmProperty::CACHE: return this->HandleCacheMode();
case cmProperty::INSTALL: return this->HandleInstallMode();
case cmProperty::VARIABLE: case cmProperty::VARIABLE:
case cmProperty::CACHED_VARIABLE: case cmProperty::CACHED_VARIABLE:
@ -488,3 +494,54 @@ bool cmSetPropertyCommand::HandleCacheEntry(cmCacheManager::CacheIterator& it)
return true; return true;
} }
//----------------------------------------------------------------------------
bool cmSetPropertyCommand::HandleInstallMode()
{
cmake* cm = this->Makefile->GetCMakeInstance();
for(std::set<std::string>::const_iterator i = this->Names.begin();
i != this->Names.end(); ++i)
{
if(cmInstalledFile* file = cm->GetOrCreateInstalledFile(
this->Makefile, *i))
{
if(!this->HandleInstall(file))
{
return false;
}
}
else
{
cmOStringStream e;
e << "given INSTALL name that could not be found or created: " << *i;
this->SetError(e.str());
return false;
}
}
return true;
}
//----------------------------------------------------------------------------
bool cmSetPropertyCommand::HandleInstall(cmInstalledFile* file)
{
// Set or append the property.
std::string const& name = this->PropertyName;
cmMakefile* mf = this->Makefile;
const char *value = this->PropertyValue.c_str();
if (this->Remove)
{
file->RemoveProperty(name);
}
else if(this->AppendMode)
{
file->AppendProperty(mf, name, value, this->AppendAsString);
}
else
{
file->SetProperty(mf, name, value);
}
return true;
}

View File

@ -62,6 +62,8 @@ private:
bool HandleTest(cmTest* test); bool HandleTest(cmTest* test);
bool HandleCacheMode(); bool HandleCacheMode();
bool HandleCacheEntry(cmCacheManager::CacheIterator&); bool HandleCacheEntry(cmCacheManager::CacheIterator&);
bool HandleInstallMode();
bool HandleInstall(cmInstalledFile* file);
}; };

View File

@ -2294,6 +2294,41 @@ bool cmake::GetPropertyAsBool(const std::string& prop)
return cmSystemTools::IsOn(this->GetProperty(prop)); return cmSystemTools::IsOn(this->GetProperty(prop));
} }
cmInstalledFile *cmake::GetOrCreateInstalledFile(
cmMakefile* mf, const std::string& name)
{
std::map<std::string, cmInstalledFile>::iterator i =
this->InstalledFiles.find(name);
if(i != this->InstalledFiles.end())
{
cmInstalledFile &file = i->second;
return &file;
}
else
{
cmInstalledFile &file = this->InstalledFiles[name];
file.SetName(mf, name);
return &file;
}
}
cmInstalledFile const* cmake::GetInstalledFile(const std::string& name) const
{
std::map<std::string, cmInstalledFile>::const_iterator i =
this->InstalledFiles.find(name);
if(i != this->InstalledFiles.end())
{
cmInstalledFile const& file = i->second;
return &file;
}
else
{
return 0;
}
}
int cmake::GetSystemInformation(std::vector<std::string>& args) int cmake::GetSystemInformation(std::vector<std::string>& args)
{ {
// so create the directory // so create the directory

View File

@ -16,6 +16,7 @@
#include "cmSystemTools.h" #include "cmSystemTools.h"
#include "cmPropertyDefinitionMap.h" #include "cmPropertyDefinitionMap.h"
#include "cmPropertyMap.h" #include "cmPropertyMap.h"
#include "cmInstalledFile.h"
class cmGlobalGeneratorFactory; class cmGlobalGeneratorFactory;
class cmGlobalGenerator; class cmGlobalGenerator;
@ -92,6 +93,7 @@ class cmake
FIND_PACKAGE_MODE FIND_PACKAGE_MODE
}; };
typedef std::map<std::string, cmCommand*> RegisteredCommandsMap; typedef std::map<std::string, cmCommand*> RegisteredCommandsMap;
typedef std::map<std::string, cmInstalledFile> InstalledFilesMap;
/// Default constructor /// Default constructor
cmake(); cmake();
@ -280,6 +282,15 @@ class cmake
// Get the properties // Get the properties
cmPropertyMap &GetProperties() { return this->Properties; } cmPropertyMap &GetProperties() { return this->Properties; }
///! Get or create an cmInstalledFile instance and return a pointer to it
cmInstalledFile *GetOrCreateInstalledFile(
cmMakefile* mf, const std::string& name);
cmInstalledFile const* GetInstalledFile(const std::string& name) const;
InstalledFilesMap const& GetInstalledFiles() const
{ return this->InstalledFiles; }
///! Do all the checks before running configure ///! Do all the checks before running configure
int DoPreConfigureChecks(); int DoPreConfigureChecks();
@ -445,6 +456,7 @@ private:
cmFileTimeComparison* FileComparison; cmFileTimeComparison* FileComparison;
std::string GraphVizFile; std::string GraphVizFile;
std::vector<std::string> DebugConfigs; std::vector<std::string> DebugConfigs;
InstalledFilesMap InstalledFiles;
void UpdateConversionPathTable(); void UpdateConversionPathTable();
}; };

View File

@ -10,3 +10,11 @@
# usually begin with CPACK_<GENNAME>_xxxx. # usually begin with CPACK_<GENNAME>_xxxx.
@_CPACK_OTHER_VARIABLES_@ @_CPACK_OTHER_VARIABLES_@
if(NOT CPACK_PROPERTIES_FILE)
set(CPACK_PROPERTIES_FILE "@CMAKE_BINARY_DIR@/CPackProperties.cmake")
endif()
if(EXISTS ${CPACK_PROPERTIES_FILE})
include(${CPACK_PROPERTIES_FILE})
endif()

View File

@ -138,3 +138,4 @@ add_RunCMake_test(CheckModules)
add_RunCMake_test(CommandLine) add_RunCMake_test(CommandLine)
add_RunCMake_test(install) add_RunCMake_test(install)
add_RunCMake_test(CPackInstallProperties)

View File

@ -0,0 +1,3 @@
include(${RunCMake_SOURCE_DIR}/check.cmake)
test_property("append.txt" CPACK_TEST_PROP "value1;value2;value3")

View File

@ -0,0 +1,2 @@
set_property(INSTALL append.txt PROPERTY CPACK_TEST_PROP value1)
set_property(INSTALL append.txt PROPERTY CPACK_TEST_PROP value2 value3 APPEND)

View File

@ -0,0 +1,6 @@
cmake_minimum_required(VERSION 3.0)
project(${RunCMake_TEST} CXX)
include(${RunCMake_TEST}.cmake)
include(CPack)

View File

@ -0,0 +1,3 @@
include(${RunCMake_SOURCE_DIR}/check.cmake)
test_property(${EXPECTED_MYTEST_NAME} CPACK_TEST_PROP2 PROP_VALUE2)

View File

@ -0,0 +1,7 @@
add_executable(mytest test.cpp)
file(GENERATE OUTPUT runtest_info.cmake CONTENT [[
set(EXPECTED_MYTEST_NAME "$<TARGET_FILE_NAME:mytest>")
]])
set_property(INSTALL $<TARGET_FILE_NAME:mytest> PROPERTY CPACK_TEST_PROP2 PROP_VALUE2)

View File

@ -0,0 +1,3 @@
include(${RunCMake_SOURCE_DIR}/check.cmake)
test_property("multiple_values.txt" CPACK_TEST_PROP "value1;value2;value3")

View File

@ -0,0 +1 @@
set_property(INSTALL multiple_values.txt PROPERTY CPACK_TEST_PROP value1 value2 value3)

View File

@ -0,0 +1,13 @@
include(${RunCMake_SOURCE_DIR}/check.cmake)
file(GLOB INFO_FILES ${RunCMake_TEST_BINARY_DIR}/runtest_info_*.cmake)
if(NOT INFO_FILES)
message(FATAL_ERROR "missing expected info files")
endif()
foreach(INFO_FILE IN LISTS INFO_FILES)
include(${INFO_FILE})
include(${RunCMake_TEST_BINARY_DIR}/CPackProperties.cmake)
test_property("config.cpp" FOO ${EXPECTED_MYTEST_NAME})
endforeach()

View File

@ -0,0 +1,14 @@
add_executable(mytest test.cpp)
foreach(CONFIG IN LISTS CMAKE_CONFIGURATION_TYPES)
string(TOUPPER ${CONFIG} UPPER_CONFIG)
set_property(TARGET mytest PROPERTY
OUTPUT_NAME_${UPPER_CONFIG} bar_${CONFIG})
endforeach()
file(GENERATE OUTPUT runtest_info_$<CONFIG>.cmake CONTENT [[
set(CPACK_BUILD_CONFIG "$<CONFIG>")
set(EXPECTED_MYTEST_NAME "$<TARGET_FILE_NAME:mytest>")
]])
set_property(INSTALL config.cpp PROPERTY FOO $<TARGET_FILE_NAME:mytest>)

View File

@ -0,0 +1,3 @@
include(${RunCMake_SOURCE_DIR}/check.cmake)
test_property("replace.txt" CPACK_TEST_PROP "value2")

View File

@ -0,0 +1,2 @@
set_property(INSTALL replace.txt PROPERTY CPACK_TEST_PROP value1)
set_property(INSTALL replace.txt PROPERTY CPACK_TEST_PROP value2)

View File

@ -0,0 +1,9 @@
include(RunCMake)
run_cmake(Simple)
run_cmake(FilenameGenex)
run_cmake(ValueGenex)
run_cmake(MultipleValues)
run_cmake(Append)
run_cmake(Replace)
run_cmake(PerConfigValue)

View File

@ -0,0 +1,3 @@
include(${RunCMake_SOURCE_DIR}/check.cmake)
test_property("foo/test.cpp" CPACK_TEST_PROP PROP_VALUE)

View File

@ -0,0 +1 @@
set_property(INSTALL foo/test.cpp PROPERTY CPACK_TEST_PROP PROP_VALUE)

View File

@ -0,0 +1,3 @@
include(${RunCMake_SOURCE_DIR}/check.cmake)
test_property("bar/test.cpp" CPACK_TEST_PROP ${EXPECTED_MYTEST_NAME})

View File

@ -0,0 +1,7 @@
add_executable(mytest test.cpp)
file(GENERATE OUTPUT runtest_info.cmake CONTENT [[
set(EXPECTED_MYTEST_NAME "$<TARGET_FILE_NAME:mytest>")
]])
set_property(INSTALL bar/test.cpp PROPERTY CPACK_TEST_PROP $<TARGET_FILE_NAME:mytest>)

View File

@ -0,0 +1,12 @@
function(test_property FILE NAME EXPECTED_VALUE)
get_property(ACTUAL_VALUE INSTALL "${FILE}" PROPERTY "${NAME}")
if(NOT "${ACTUAL_VALUE}" STREQUAL "${EXPECTED_VALUE}")
message(FATAL_ERROR "${NAME}@${FILE}: property mismatch expected [${EXPECTED_VALUE}] actual [${ACTUAL_VALUE}] (Config:${CPACK_BUILD_CONFIG})")
endif()
endfunction()
set(CPACK_BUILD_CONFIG Debug)
include(${RunCMake_TEST_BINARY_DIR}/CPackProperties.cmake)
include(${RunCMake_TEST_BINARY_DIR}/runtest_info.cmake OPTIONAL)

View File

@ -0,0 +1 @@
int main() {}

View File

@ -142,6 +142,7 @@ _cmake_index_objs = {
'prop_cache': _cmake_index_entry('cache property'), 'prop_cache': _cmake_index_entry('cache property'),
'prop_dir': _cmake_index_entry('directory property'), 'prop_dir': _cmake_index_entry('directory property'),
'prop_gbl': _cmake_index_entry('global property'), 'prop_gbl': _cmake_index_entry('global property'),
'prop_inst': _cmake_index_entry('installed file property'),
'prop_sf': _cmake_index_entry('source file property'), 'prop_sf': _cmake_index_entry('source file property'),
'prop_test': _cmake_index_entry('test property'), 'prop_test': _cmake_index_entry('test property'),
'prop_tgt': _cmake_index_entry('target property'), 'prop_tgt': _cmake_index_entry('target property'),
@ -269,6 +270,7 @@ class CMakeDomain(Domain):
'prop_cache': ObjType('prop_cache', 'prop_cache'), 'prop_cache': ObjType('prop_cache', 'prop_cache'),
'prop_dir': ObjType('prop_dir', 'prop_dir'), 'prop_dir': ObjType('prop_dir', 'prop_dir'),
'prop_gbl': ObjType('prop_gbl', 'prop_gbl'), 'prop_gbl': ObjType('prop_gbl', 'prop_gbl'),
'prop_inst': ObjType('prop_inst', 'prop_inst'),
'prop_sf': ObjType('prop_sf', 'prop_sf'), 'prop_sf': ObjType('prop_sf', 'prop_sf'),
'prop_test': ObjType('prop_test', 'prop_test'), 'prop_test': ObjType('prop_test', 'prop_test'),
'prop_tgt': ObjType('prop_tgt', 'prop_tgt'), 'prop_tgt': ObjType('prop_tgt', 'prop_tgt'),
@ -284,6 +286,7 @@ class CMakeDomain(Domain):
# 'prop_cache': CMakeObject, # 'prop_cache': CMakeObject,
# 'prop_dir': CMakeObject, # 'prop_dir': CMakeObject,
# 'prop_gbl': CMakeObject, # 'prop_gbl': CMakeObject,
# 'prop_inst': CMakeObject,
# 'prop_sf': CMakeObject, # 'prop_sf': CMakeObject,
# 'prop_test': CMakeObject, # 'prop_test': CMakeObject,
# 'prop_tgt': CMakeObject, # 'prop_tgt': CMakeObject,
@ -298,6 +301,7 @@ class CMakeDomain(Domain):
'prop_cache': CMakeXRefRole(), 'prop_cache': CMakeXRefRole(),
'prop_dir': CMakeXRefRole(), 'prop_dir': CMakeXRefRole(),
'prop_gbl': CMakeXRefRole(), 'prop_gbl': CMakeXRefRole(),
'prop_inst': CMakeXRefRole(),
'prop_sf': CMakeXRefRole(), 'prop_sf': CMakeXRefRole(),
'prop_test': CMakeXRefRole(), 'prop_test': CMakeXRefRole(),
'prop_tgt': CMakeXRefRole(), 'prop_tgt': CMakeXRefRole(),

View File

@ -232,6 +232,7 @@ CMAKE_CXX_SOURCES="\
cmCommandArgumentLexer \ cmCommandArgumentLexer \
cmCommandArgumentParser \ cmCommandArgumentParser \
cmCommandArgumentParserHelper \ cmCommandArgumentParserHelper \
cmCPackPropertiesGenerator \
cmDefinitions \ cmDefinitions \
cmDepends \ cmDepends \
cmDependsC \ cmDependsC \
@ -258,6 +259,7 @@ CMAKE_CXX_SOURCES="\
cmGeneratorExpression \ cmGeneratorExpression \
cmGlobalGenerator \ cmGlobalGenerator \
cmLocalGenerator \ cmLocalGenerator \
cmInstalledFile \
cmInstallGenerator \ cmInstallGenerator \
cmInstallExportGenerator \ cmInstallExportGenerator \
cmInstallFilesGenerator \ cmInstallFilesGenerator \