summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorDomen Vrankar <domen.vrankar@gmail.com>2016-05-15 03:01:34 +0200
committerDomen Vrankar <domen.vrankar@gmail.com>2016-05-15 03:01:34 +0200
commit44ee2d717a0f0552d4d1d5978c473d60625a0b3c (patch)
tree058d32470b4afd1e3b37c411db51fd90347c6c50 /Source
parentb952336902e9206ba51e1d77b8e489bdd759f73f (diff)
downloadcmake-44ee2d717a0f0552d4d1d5978c473d60625a0b3c.tar.gz
CPack/RPM different package names
Packagers may now set their own rpm package file names or request that rpmbuild tool chooses one for them. It also supports handing of situations where one spec file may produce multiple rpm packages.
Diffstat (limited to 'Source')
-rw-r--r--Source/CPack/cmCPackRPMGenerator.cxx72
-rw-r--r--Source/CPack/cmCPackRPMGenerator.h3
2 files changed, 44 insertions, 31 deletions
diff --git a/Source/CPack/cmCPackRPMGenerator.cxx b/Source/CPack/cmCPackRPMGenerator.cxx
index 6349e05bd6..2640404646 100644
--- a/Source/CPack/cmCPackRPMGenerator.cxx
+++ b/Source/CPack/cmCPackRPMGenerator.cxx
@@ -47,6 +47,22 @@ int cmCPackRPMGenerator::InitializeInternal()
return this->Superclass::InitializeInternal();
}
+void cmCPackRPMGenerator::AddGeneratedPackageNames()
+{
+ // add the generated packages to package file names list
+ std::string fileNames(this->GetOption("GEN_CPACK_OUTPUT_FILES"));
+ const char sep = ';';
+ std::string::size_type pos1 = 0;
+ std::string::size_type pos2 = fileNames.find(sep, pos1+1);
+ while(pos2 != std::string::npos)
+ {
+ packageFileNames.push_back(fileNames.substr(pos1, pos2-pos1));
+ pos1 = pos2+1;
+ pos2 = fileNames.find(sep, pos1+1);
+ }
+ packageFileNames.push_back(fileNames.substr(pos1, pos2-pos1));
+}
+
int cmCPackRPMGenerator::PackageOnePack(std::string initialToplevel,
std::string packageName)
{
@@ -85,8 +101,7 @@ int cmCPackRPMGenerator::PackageOnePack(std::string initialToplevel,
"Error while execution CPackRPM.cmake" << std::endl);
retval = 0;
}
- // add the generated package to package file names list
- packageFileNames.push_back(packageFileName);
+
return retval;
}
@@ -139,20 +154,24 @@ int cmCPackRPMGenerator::PackageComponents(bool ignoreGroup)
retval &= PackageOnePack(initialTopLevel,compIt->first);
}
}
+
+ if(retval)
+ {
+ AddGeneratedPackageNames();
+ }
+
return retval;
}
-int cmCPackRPMGenerator::PackageComponentsAllInOne()
+int cmCPackRPMGenerator::PackageComponentsAllInOne(
+ const std::string& compInstDirName)
{
int retval = 1;
- std::string compInstDirName;
/* Reset package file name list it will be populated during the
* component packaging run*/
packageFileNames.clear();
std::string initialTopLevel(this->GetOption("CPACK_TEMPORARY_DIRECTORY"));
- compInstDirName = "ALL_COMPONENTS_IN_ONE";
-
cmCPackLogger(cmCPackLog::LOG_VERBOSE,
"Packaging all groups in one package..."
"(CPACK_COMPONENTS_ALL_[GROUPS_]IN_ONE_PACKAGE is set)"
@@ -178,27 +197,32 @@ int cmCPackRPMGenerator::PackageComponentsAllInOne()
/* replace the TEMPORARY package file name */
this->SetOption("CPACK_TEMPORARY_PACKAGE_FILE_NAME",
packageFileName.c_str());
- // Tell CPackRPM.cmake the path where the component is.
- std::string component_path = "/";
- component_path += compInstDirName;
- this->SetOption("CPACK_RPM_PACKAGE_COMPONENT_PART_PATH",
- component_path.c_str());
- if (!this->ReadListFile("CPackRPM.cmake"))
+
+ if(!compInstDirName.empty())
+ {
+ // Tell CPackRPM.cmake the path where the component is.
+ std::string component_path = "/";
+ component_path += compInstDirName;
+ this->SetOption("CPACK_RPM_PACKAGE_COMPONENT_PART_PATH",
+ component_path.c_str());
+ }
+
+ if (this->ReadListFile("CPackRPM.cmake"))
+ {
+ AddGeneratedPackageNames();
+ }
+ else
{
cmCPackLogger(cmCPackLog::LOG_ERROR,
"Error while execution CPackRPM.cmake" << std::endl);
retval = 0;
}
- // add the generated package to package file names list
- packageFileNames.push_back(packageFileName);
return retval;
}
int cmCPackRPMGenerator::PackageFiles()
{
- int retval = 1;
-
cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: "
<< toplevel << std::endl);
@@ -209,7 +233,7 @@ int cmCPackRPMGenerator::PackageFiles()
// then the package file is unique and should be open here.
if (componentPackageMethod == ONE_PACKAGE)
{
- return PackageComponentsAllInOne();
+ return PackageComponentsAllInOne("ALL_COMPONENTS_IN_ONE");
}
// CASE 2 : COMPONENT CLASSICAL package(s) (i.e. not all-in-one)
// There will be 1 package for each component group
@@ -224,20 +248,8 @@ int cmCPackRPMGenerator::PackageFiles()
// CASE 3 : NON COMPONENT package.
else
{
- if (!this->ReadListFile("CPackRPM.cmake"))
- {
- cmCPackLogger(cmCPackLog::LOG_ERROR,
- "Error while execution CPackRPM.cmake" << std::endl);
- retval = 0;
- }
- }
-
- if (!this->IsSet("RPMBUILD_EXECUTABLE"))
- {
- cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find rpmbuild" << std::endl);
- retval = 0;
+ return PackageComponentsAllInOne("");
}
- return retval;
}
bool cmCPackRPMGenerator::SupportsComponentInstallation() const
diff --git a/Source/CPack/cmCPackRPMGenerator.h b/Source/CPack/cmCPackRPMGenerator.h
index a4a1ba87a3..9987cf436a 100644
--- a/Source/CPack/cmCPackRPMGenerator.h
+++ b/Source/CPack/cmCPackRPMGenerator.h
@@ -65,12 +65,13 @@ protected:
* Special case of component install where all
* components will be put in a single installer.
*/
- int PackageComponentsAllInOne();
+ int PackageComponentsAllInOne(const std::string& compInstDirName);
virtual const char* GetOutputExtension() { return ".rpm"; }
virtual bool SupportsComponentInstallation() const;
virtual std::string GetComponentInstallDirNameSuffix(
const std::string& componentName);
+ void AddGeneratedPackageNames();
};
#endif