| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
- #include "cmCPackIFWPackage.h"
- #include "cmCPackComponentGroup.h"
- #include "cmCPackGenerator.h"
- #include "cmCPackIFWGenerator.h"
- #include "cmCPackIFWInstaller.h"
- #include "cmCPackLog.h"
- #include "cmGeneratedFileStream.h"
- #include "cmSystemTools.h"
- #include "cmTimestamp.h"
- #include "cmXMLWriter.h"
- #include "cmConfigure.h"
- #include <map>
- #include <sstream>
- #include <stddef.h>
- //----------------------------------------------------------------- Logger ---
- #ifdef cmCPackLogger
- #undef cmCPackLogger
- #endif
- #define cmCPackLogger(logType, msg) \
- do { \
- std::ostringstream cmCPackLog_msg; \
- cmCPackLog_msg << msg; \
- if (Generator) { \
- Generator->Logger->Log(logType, __FILE__, __LINE__, \
- cmCPackLog_msg.str().c_str()); \
- } \
- } while (false)
- //---------------------------------------------------------- CompareStruct ---
- cmCPackIFWPackage::CompareStruct::CompareStruct()
- : Type(CompareNone)
- {
- }
- //------------------------------------------------------- DependenceStruct ---
- cmCPackIFWPackage::DependenceStruct::DependenceStruct()
- {
- }
- cmCPackIFWPackage::DependenceStruct::DependenceStruct(
- const std::string& dependence)
- {
- // Search compare section
- size_t pos = std::string::npos;
- if ((pos = dependence.find("<=")) != std::string::npos) {
- Compare.Type = CompareLessOrEqual;
- Compare.Value = dependence.substr(pos + 2);
- } else if ((pos = dependence.find(">=")) != std::string::npos) {
- Compare.Type = CompareGreaterOrEqual;
- Compare.Value = dependence.substr(pos + 2);
- } else if ((pos = dependence.find('<')) != std::string::npos) {
- Compare.Type = CompareLess;
- Compare.Value = dependence.substr(pos + 1);
- } else if ((pos = dependence.find('=')) != std::string::npos) {
- Compare.Type = CompareEqual;
- Compare.Value = dependence.substr(pos + 1);
- } else if ((pos = dependence.find('>')) != std::string::npos) {
- Compare.Type = CompareGreater;
- Compare.Value = dependence.substr(pos + 1);
- } else if ((pos = dependence.find('-')) != std::string::npos) {
- Compare.Type = CompareNone;
- Compare.Value = dependence.substr(pos + 1);
- }
- size_t dashPos = dependence.find('-');
- if (dashPos != std::string::npos) {
- pos = dashPos;
- }
- Name = pos == std::string::npos ? dependence : dependence.substr(0, pos);
- }
- std::string cmCPackIFWPackage::DependenceStruct::NameWithCompare() const
- {
- if (Compare.Type == CompareNone) {
- return Name;
- }
- std::string result = Name;
- if (Compare.Type != CompareNone || !Compare.Value.empty()) {
- result += "-";
- }
- if (Compare.Type == CompareLessOrEqual) {
- result += "<=";
- } else if (Compare.Type == CompareGreaterOrEqual) {
- result += ">=";
- } else if (Compare.Type == CompareLess) {
- result += "<";
- } else if (Compare.Type == CompareEqual) {
- result += "=";
- } else if (Compare.Type == CompareGreater) {
- result += ">";
- }
- result += Compare.Value;
- return result;
- }
- //------------------------------------------------------ cmCPackIFWPackage ---
- cmCPackIFWPackage::cmCPackIFWPackage()
- : Generator(CM_NULLPTR)
- , Installer(CM_NULLPTR)
- {
- }
- const char* cmCPackIFWPackage::GetOption(const std::string& op) const
- {
- const char* option = Generator ? Generator->GetOption(op) : CM_NULLPTR;
- return option && *option ? option : CM_NULLPTR;
- }
- bool cmCPackIFWPackage::IsOn(const std::string& op) const
- {
- return Generator ? Generator->IsOn(op) : false;
- }
- bool cmCPackIFWPackage::IsSetToOff(const std::string& op) const
- {
- return Generator ? Generator->IsSetToOff(op) : false;
- }
- bool cmCPackIFWPackage::IsSetToEmpty(const std::string& op) const
- {
- return Generator ? Generator->IsSetToEmpty(op) : false;
- }
- bool cmCPackIFWPackage::IsVersionLess(const char* version)
- {
- return Generator ? Generator->IsVersionLess(version) : false;
- }
- bool cmCPackIFWPackage::IsVersionGreater(const char* version)
- {
- return Generator ? Generator->IsVersionGreater(version) : false;
- }
- bool cmCPackIFWPackage::IsVersionEqual(const char* version)
- {
- return Generator ? Generator->IsVersionEqual(version) : false;
- }
- std::string cmCPackIFWPackage::GetComponentName(cmCPackComponent* component)
- {
- if (!component) {
- return "";
- }
- const char* option =
- GetOption("CPACK_IFW_COMPONENT_" +
- cmsys::SystemTools::UpperCase(component->Name) + "_NAME");
- return option ? option : component->Name;
- }
- void cmCPackIFWPackage::DefaultConfiguration()
- {
- DisplayName = "";
- Description = "";
- Version = "";
- ReleaseDate = "";
- Script = "";
- Licenses.clear();
- UserInterfaces.clear();
- Translations.clear();
- SortingPriority = "";
- UpdateText = "";
- Default = "";
- Essential = "";
- Virtual = "";
- ForcedInstallation = "";
- RequiresAdminRights = "";
- }
- // Defaul configuration (all in one package)
- int cmCPackIFWPackage::ConfigureFromOptions()
- {
- // Restore defaul configuration
- DefaultConfiguration();
- // Name
- Name = Generator->GetRootPackageName();
- // Display name
- if (const char* option = this->GetOption("CPACK_PACKAGE_NAME")) {
- DisplayName = option;
- } else {
- DisplayName = "Your package";
- }
- // Description
- if (const char* option =
- this->GetOption("CPACK_PACKAGE_DESCRIPTION_SUMMARY")) {
- Description = option;
- } else {
- Description = "Your package description";
- }
- // Version
- if (const char* option = GetOption("CPACK_PACKAGE_VERSION")) {
- Version = option;
- } else {
- Version = "1.0.0";
- }
- ForcedInstallation = "true";
- return 1;
- }
- int cmCPackIFWPackage::ConfigureFromComponent(cmCPackComponent* component)
- {
- if (!component) {
- return 0;
- }
- // Restore defaul configuration
- DefaultConfiguration();
- std::string prefix = "CPACK_IFW_COMPONENT_" +
- cmsys::SystemTools::UpperCase(component->Name) + "_";
- // Display name
- DisplayName = component->DisplayName;
- // Description
- Description = component->Description;
- // Version
- if (const char* optVERSION = GetOption(prefix + "VERSION")) {
- Version = optVERSION;
- } else if (const char* optPACKAGE_VERSION =
- GetOption("CPACK_PACKAGE_VERSION")) {
- Version = optPACKAGE_VERSION;
- } else {
- Version = "1.0.0";
- }
- // Script
- if (const char* option = GetOption(prefix + "SCRIPT")) {
- Script = option;
- }
- // User interfaces
- if (const char* option = this->GetOption(prefix + "USER_INTERFACES")) {
- UserInterfaces.clear();
- cmSystemTools::ExpandListArgument(option, UserInterfaces);
- }
- // CMake dependencies
- if (!component->Dependencies.empty()) {
- std::vector<cmCPackComponent*>::iterator dit;
- for (dit = component->Dependencies.begin();
- dit != component->Dependencies.end(); ++dit) {
- Dependencies.insert(Generator->ComponentPackages[*dit]);
- }
- }
- // Licenses
- if (const char* option = this->GetOption(prefix + "LICENSES")) {
- Licenses.clear();
- cmSystemTools::ExpandListArgument(option, Licenses);
- if (Licenses.size() % 2 != 0) {
- cmCPackLogger(
- cmCPackLog::LOG_WARNING, prefix
- << "LICENSES"
- << " should contain pairs of <display_name> and <file_path>."
- << std::endl);
- Licenses.clear();
- }
- }
- // Priority
- if (const char* option = this->GetOption(prefix + "PRIORITY")) {
- SortingPriority = option;
- cmCPackLogger(
- cmCPackLog::LOG_WARNING, "The \"PRIORITY\" option is set "
- << "for component \"" << component->Name << "\", but there option is "
- << "deprecated. Please use \"SORTING_PRIORITY\" option instead."
- << std::endl);
- }
- // Default
- Default = component->IsDisabledByDefault ? "false" : "true";
- // Essential
- if (this->IsOn(prefix + "ESSENTIAL")) {
- Essential = "true";
- }
- // Virtual
- Virtual = component->IsHidden ? "true" : "";
- // ForcedInstallation
- ForcedInstallation = component->IsRequired ? "true" : "false";
- return ConfigureFromPrefix(prefix);
- }
- int cmCPackIFWPackage::ConfigureFromGroup(cmCPackComponentGroup* group)
- {
- if (!group) {
- return 0;
- }
- // Restore defaul configuration
- DefaultConfiguration();
- std::string prefix = "CPACK_IFW_COMPONENT_GROUP_" +
- cmsys::SystemTools::UpperCase(group->Name) + "_";
- DisplayName = group->DisplayName;
- Description = group->Description;
- // Version
- if (const char* optVERSION = GetOption(prefix + "VERSION")) {
- Version = optVERSION;
- } else if (const char* optPACKAGE_VERSION =
- GetOption("CPACK_PACKAGE_VERSION")) {
- Version = optPACKAGE_VERSION;
- } else {
- Version = "1.0.0";
- }
- // Script
- if (const char* option = GetOption(prefix + "SCRIPT")) {
- Script = option;
- }
- // User interfaces
- if (const char* option = this->GetOption(prefix + "USER_INTERFACES")) {
- UserInterfaces.clear();
- cmSystemTools::ExpandListArgument(option, UserInterfaces);
- }
- // Licenses
- if (const char* option = this->GetOption(prefix + "LICENSES")) {
- Licenses.clear();
- cmSystemTools::ExpandListArgument(option, Licenses);
- if (Licenses.size() % 2 != 0) {
- cmCPackLogger(
- cmCPackLog::LOG_WARNING, prefix
- << "LICENSES"
- << " should contain pairs of <display_name> and <file_path>."
- << std::endl);
- Licenses.clear();
- }
- }
- // Priority
- if (const char* option = this->GetOption(prefix + "PRIORITY")) {
- SortingPriority = option;
- cmCPackLogger(
- cmCPackLog::LOG_WARNING, "The \"PRIORITY\" option is set "
- << "for component group \"" << group->Name
- << "\", but there option is "
- << "deprecated. Please use \"SORTING_PRIORITY\" option instead."
- << std::endl);
- }
- return ConfigureFromPrefix(prefix);
- }
- int cmCPackIFWPackage::ConfigureFromGroup(const std::string& groupName)
- {
- // Group configuration
- cmCPackComponentGroup group;
- std::string prefix =
- "CPACK_COMPONENT_GROUP_" + cmsys::SystemTools::UpperCase(groupName) + "_";
- if (const char* option = GetOption(prefix + "DISPLAY_NAME")) {
- group.DisplayName = option;
- } else {
- group.DisplayName = group.Name;
- }
- if (const char* option = GetOption(prefix + "DESCRIPTION")) {
- group.Description = option;
- }
- group.IsBold = IsOn(prefix + "BOLD_TITLE");
- group.IsExpandedByDefault = IsOn(prefix + "EXPANDED");
- // Package configuration
- group.Name = groupName;
- if (Generator) {
- Name = Generator->GetGroupPackageName(&group);
- } else {
- Name = group.Name;
- }
- return ConfigureFromGroup(&group);
- }
- // Common options for components and groups
- int cmCPackIFWPackage::ConfigureFromPrefix(const std::string& prefix)
- {
- // Temporary variable for full option name
- std::string option;
- // Display name
- option = prefix + "DISPLAY_NAME";
- if (IsSetToEmpty(option)) {
- DisplayName.clear();
- } else if (const char* value = GetOption(option)) {
- DisplayName = value;
- }
- // Description
- option = prefix + "DESCRIPTION";
- if (IsSetToEmpty(option)) {
- Description.clear();
- } else if (const char* value = GetOption(option)) {
- Description = value;
- }
- // Release date
- option = prefix + "RELEASE_DATE";
- if (IsSetToEmpty(option)) {
- ReleaseDate.clear();
- } else if (const char* value = GetOption(option)) {
- ReleaseDate = value;
- }
- // Sorting priority
- option = prefix + "SORTING_PRIORITY";
- if (IsSetToEmpty(option)) {
- SortingPriority.clear();
- } else if (const char* value = GetOption(option)) {
- SortingPriority = value;
- }
- // Update text
- option = prefix + "UPDATE_TEXT";
- if (IsSetToEmpty(option)) {
- UpdateText.clear();
- } else if (const char* value = GetOption(option)) {
- UpdateText = value;
- }
- // Translations
- option = prefix + "TRANSLATIONS";
- if (IsSetToEmpty(option)) {
- Translations.clear();
- } else if (const char* value = this->GetOption(option)) {
- Translations.clear();
- cmSystemTools::ExpandListArgument(value, Translations);
- }
- // QtIFW dependencies
- std::vector<std::string> deps;
- option = prefix + "DEPENDS";
- if (const char* value = this->GetOption(option)) {
- cmSystemTools::ExpandListArgument(value, deps);
- }
- option = prefix + "DEPENDENCIES";
- if (const char* value = this->GetOption(option)) {
- cmSystemTools::ExpandListArgument(value, deps);
- }
- for (std::vector<std::string>::iterator dit = deps.begin();
- dit != deps.end(); ++dit) {
- DependenceStruct dep(*dit);
- if (Generator->Packages.count(dep.Name)) {
- cmCPackIFWPackage& depPkg = Generator->Packages[dep.Name];
- dep.Name = depPkg.Name;
- }
- bool hasDep = Generator->DependentPackages.count(dep.Name) > 0;
- DependenceStruct& depRef = Generator->DependentPackages[dep.Name];
- if (!hasDep) {
- depRef = dep;
- }
- AlienDependencies.insert(&depRef);
- }
- // Automatic dependency on
- option = prefix + "AUTO_DEPEND_ON";
- if (IsSetToEmpty(option)) {
- AlienAutoDependOn.clear();
- } else if (const char* value = this->GetOption(option)) {
- std::vector<std::string> depsOn;
- cmSystemTools::ExpandListArgument(value, depsOn);
- for (std::vector<std::string>::iterator dit = depsOn.begin();
- dit != depsOn.end(); ++dit) {
- DependenceStruct dep(*dit);
- if (Generator->Packages.count(dep.Name)) {
- cmCPackIFWPackage& depPkg = Generator->Packages[dep.Name];
- dep.Name = depPkg.Name;
- }
- bool hasDep = Generator->DependentPackages.count(dep.Name) > 0;
- DependenceStruct& depRef = Generator->DependentPackages[dep.Name];
- if (!hasDep) {
- depRef = dep;
- }
- AlienAutoDependOn.insert(&depRef);
- }
- }
- // Visibility
- option = prefix + "VIRTUAL";
- if (IsSetToEmpty(option)) {
- Virtual.clear();
- } else if (IsOn(option)) {
- Virtual = "true";
- }
- // Default selection
- option = prefix + "DEFAULT";
- if (IsSetToEmpty(option)) {
- Default.clear();
- } else if (const char* value = GetOption(option)) {
- std::string lowerValue = cmsys::SystemTools::LowerCase(value);
- if (lowerValue.compare("true") == 0) {
- Default = "true";
- } else if (lowerValue.compare("false") == 0) {
- Default = "false";
- } else if (lowerValue.compare("script") == 0) {
- Default = "script";
- } else {
- Default = value;
- }
- }
- // Forsed installation
- option = prefix + "FORCED_INSTALLATION";
- if (IsSetToEmpty(option)) {
- ForcedInstallation.clear();
- } else if (IsOn(option)) {
- ForcedInstallation = "true";
- } else if (IsSetToOff(option)) {
- ForcedInstallation = "false";
- }
- // Requires admin rights
- option = prefix + "REQUIRES_ADMIN_RIGHTS";
- if (IsSetToEmpty(option)) {
- RequiresAdminRights.clear();
- } else if (IsOn(option)) {
- RequiresAdminRights = "true";
- } else if (IsSetToOff(option)) {
- RequiresAdminRights = "false";
- }
- return 1;
- }
- void cmCPackIFWPackage::GeneratePackageFile()
- {
- // Lazy directory initialization
- if (Directory.empty()) {
- if (Installer) {
- Directory = Installer->Directory + "/packages/" + Name;
- } else if (Generator) {
- Directory = Generator->toplevel + "/packages/" + Name;
- }
- }
- // Output stream
- cmGeneratedFileStream fout((Directory + "/meta/package.xml").data());
- cmXMLWriter xout(fout);
- xout.StartDocument();
- WriteGeneratedByToStrim(xout);
- xout.StartElement("Package");
- xout.Element("DisplayName", DisplayName);
- xout.Element("Description", Description);
- // Update text
- if (!UpdateText.empty()) {
- xout.Element("UpdateText", UpdateText);
- }
- xout.Element("Name", Name);
- xout.Element("Version", Version);
- if (!ReleaseDate.empty()) {
- xout.Element("ReleaseDate", ReleaseDate);
- } else {
- xout.Element("ReleaseDate", cmTimestamp().CurrentTime("%Y-%m-%d", true));
- }
- // Script (copy to meta dir)
- if (!Script.empty()) {
- std::string name = cmSystemTools::GetFilenameName(Script);
- std::string path = Directory + "/meta/" + name;
- cmsys::SystemTools::CopyFileIfDifferent(Script, path);
- xout.Element("Script", name);
- }
- // User Interfaces (copy to meta dir)
- std::vector<std::string> userInterfaces = UserInterfaces;
- for (size_t i = 0; i < userInterfaces.size(); i++) {
- std::string name = cmSystemTools::GetFilenameName(userInterfaces[i]);
- std::string path = Directory + "/meta/" + name;
- cmsys::SystemTools::CopyFileIfDifferent(userInterfaces[i], path);
- userInterfaces[i] = name;
- }
- if (!userInterfaces.empty()) {
- xout.StartElement("UserInterfaces");
- for (size_t i = 0; i < userInterfaces.size(); i++) {
- xout.Element("UserInterface", userInterfaces[i]);
- }
- xout.EndElement();
- }
- // Translations (copy to meta dir)
- std::vector<std::string> translations = Translations;
- for (size_t i = 0; i < translations.size(); i++) {
- std::string name = cmSystemTools::GetFilenameName(translations[i]);
- std::string path = Directory + "/meta/" + name;
- cmsys::SystemTools::CopyFileIfDifferent(translations[i], path);
- translations[i] = name;
- }
- if (!translations.empty()) {
- xout.StartElement("Translations");
- for (size_t i = 0; i < translations.size(); i++) {
- xout.Element("Translation", translations[i]);
- }
- xout.EndElement();
- }
- // Dependencies
- std::set<DependenceStruct> compDepSet;
- for (std::set<DependenceStruct*>::iterator ait = AlienDependencies.begin();
- ait != AlienDependencies.end(); ++ait) {
- compDepSet.insert(*(*ait));
- }
- for (std::set<cmCPackIFWPackage*>::iterator it = Dependencies.begin();
- it != Dependencies.end(); ++it) {
- compDepSet.insert(DependenceStruct((*it)->Name));
- }
- // Write dependencies
- if (!compDepSet.empty()) {
- std::ostringstream dependencies;
- std::set<DependenceStruct>::iterator it = compDepSet.begin();
- dependencies << it->NameWithCompare();
- ++it;
- while (it != compDepSet.end()) {
- dependencies << "," << it->NameWithCompare();
- ++it;
- }
- xout.Element("Dependencies", dependencies.str());
- }
- // Automatic dependency on
- std::set<DependenceStruct> compAutoDepSet;
- for (std::set<DependenceStruct*>::iterator ait = AlienAutoDependOn.begin();
- ait != AlienAutoDependOn.end(); ++ait) {
- compAutoDepSet.insert(*(*ait));
- }
- // Write automatic dependency on
- if (!compAutoDepSet.empty()) {
- std::ostringstream dependencies;
- std::set<DependenceStruct>::iterator it = compAutoDepSet.begin();
- dependencies << it->NameWithCompare();
- ++it;
- while (it != compAutoDepSet.end()) {
- dependencies << "," << it->NameWithCompare();
- ++it;
- }
- xout.Element("AutoDependOn", dependencies.str());
- }
- // Licenses (copy to meta dir)
- std::vector<std::string> licenses = Licenses;
- for (size_t i = 1; i < licenses.size(); i += 2) {
- std::string name = cmSystemTools::GetFilenameName(licenses[i]);
- std::string path = Directory + "/meta/" + name;
- cmsys::SystemTools::CopyFileIfDifferent(licenses[i], path);
- licenses[i] = name;
- }
- if (!licenses.empty()) {
- xout.StartElement("Licenses");
- for (size_t i = 0; i < licenses.size(); i += 2) {
- xout.StartElement("License");
- xout.Attribute("name", licenses[i]);
- xout.Attribute("file", licenses[i + 1]);
- xout.EndElement();
- }
- xout.EndElement();
- }
- if (!ForcedInstallation.empty()) {
- xout.Element("ForcedInstallation", ForcedInstallation);
- }
- if (!RequiresAdminRights.empty()) {
- xout.Element("RequiresAdminRights", RequiresAdminRights);
- }
- if (!Virtual.empty()) {
- xout.Element("Virtual", Virtual);
- } else if (!Default.empty()) {
- xout.Element("Default", Default);
- }
- // Essential
- if (!Essential.empty()) {
- xout.Element("Essential", Essential);
- }
- // Priority
- if (!SortingPriority.empty()) {
- xout.Element("SortingPriority", SortingPriority);
- }
- xout.EndElement();
- xout.EndDocument();
- }
- void cmCPackIFWPackage::WriteGeneratedByToStrim(cmXMLWriter& xout)
- {
- if (Generator) {
- Generator->WriteGeneratedByToStrim(xout);
- }
- }
|