diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CMakeVersion.cmake | 2 | ||||
-rw-r--r-- | Source/CPack/WiX/cmCPackWIXGenerator.cxx | 103 | ||||
-rw-r--r-- | Source/CPack/WiX/cmCPackWIXGenerator.h | 12 | ||||
-rw-r--r-- | Source/cmAddLibraryCommand.cxx | 7 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 95 |
5 files changed, 170 insertions, 49 deletions
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake index 1e65e94..b1e903a 100644 --- a/Source/CMakeVersion.cmake +++ b/Source/CMakeVersion.cmake @@ -2,5 +2,5 @@ set(CMake_VERSION_MAJOR 2) set(CMake_VERSION_MINOR 8) set(CMake_VERSION_PATCH 12) -set(CMake_VERSION_TWEAK 20140209) +set(CMake_VERSION_TWEAK 20140210) #set(CMake_VERSION_RC 1) diff --git a/Source/CPack/WiX/cmCPackWIXGenerator.cxx b/Source/CPack/WiX/cmCPackWIXGenerator.cxx index 998b5f1..43119d6 100644 --- a/Source/CPack/WiX/cmCPackWIXGenerator.cxx +++ b/Source/CPack/WiX/cmCPackWIXGenerator.cxx @@ -31,6 +31,12 @@ #include <sys/types.h> #include <sys/stat.h> +cmCPackWIXGenerator::cmCPackWIXGenerator(): + HasDesktopShortcuts(false) +{ + +} + int cmCPackWIXGenerator::InitializeInternal() { componentPackageMethod = ONE_PACKAGE; @@ -519,6 +525,11 @@ bool cmCPackWIXGenerator::CreateWiXSourceFiles() CreateStartMenuFolder(directoryDefinitions); } + if(this->HasDesktopShortcuts) + { + CreateDesktopFolder(directoryDefinitions); + } + directoryDefinitions.EndElement("Directory"); directoryDefinitions.EndElement("Fragment"); @@ -733,10 +744,20 @@ bool cmCPackWIXGenerator::AddComponentsToFeature( } } + std::vector<std::string> cpackPackageDesktopLinksList; + const char *cpackPackageDesktopLinks = + GetOption("CPACK_CREATE_DESKTOP_LINKS"); + if(cpackPackageDesktopLinks) + { + cmSystemTools::ExpandListArgument(cpackPackageDesktopLinks, + cpackPackageDesktopLinksList); + } + AddDirectoryAndFileDefinitons( rootPath, "INSTALL_ROOT", directoryDefinitions, fileDefinitions, featureDefinitions, - cpackPackageExecutablesList, shortcutMap); + cpackPackageExecutablesList, cpackPackageDesktopLinksList, + shortcutMap); featureDefinitions.EndElement("FeatureRef"); @@ -750,6 +771,8 @@ bool cmCPackWIXGenerator::CreateStartMenuShortcuts( cmWIXSourceWriter& fileDefinitions, cmWIXSourceWriter& featureDefinitions) { + bool thisHasDesktopShortcuts = false; + featureDefinitions.BeginElement("FeatureRef"); featureDefinitions.AddAttribute("Id", featureId); @@ -797,6 +820,11 @@ bool cmCPackWIXGenerator::CreateStartMenuShortcuts( fileDefinitions.AddAttribute("WorkingDirectory", shortcut.workingDirectoryId); fileDefinitions.EndElement("Shortcut"); + + if (shortcut.desktop) + { + thisHasDesktopShortcuts = true; + } } if(cpackComponentName.empty()) @@ -805,7 +833,8 @@ bool cmCPackWIXGenerator::CreateStartMenuShortcuts( } fileDefinitions.BeginElement("RemoveFolder"); - fileDefinitions.AddAttribute("Id", "PROGRAM_MENU_FOLDER" + idSuffix); + fileDefinitions.AddAttribute("Id", + "CM_REMOVE_PROGRAM_MENU_FOLDER" + idSuffix); fileDefinitions.AddAttribute("On", "uninstall"); fileDefinitions.EndElement("RemoveFolder"); @@ -836,6 +865,56 @@ bool cmCPackWIXGenerator::CreateStartMenuShortcuts( featureDefinitions.AddAttribute("Id", componentId); featureDefinitions.EndElement("ComponentRef"); + if (thisHasDesktopShortcuts) + { + this->HasDesktopShortcuts = true; + componentId = "CM_DESKTOP_SHORTCUT" + idSuffix; + + fileDefinitions.BeginElement("DirectoryRef"); + fileDefinitions.AddAttribute("Id", "DesktopFolder"); + fileDefinitions.BeginElement("Component"); + fileDefinitions.AddAttribute("Id", componentId); + fileDefinitions.AddAttribute("Guid", "*"); + + for (shortcut_map_t::const_iterator + i = shortcutMap.begin(); i != shortcutMap.end(); ++i) + { + std::string const& id = i->first; + cmWIXShortcut const& shortcut = i->second; + + if (!shortcut.desktop) + continue; + + std::string shortcutId = std::string("CM_DS") + id; + std::string fileId = std::string("CM_F") + id; + + fileDefinitions.BeginElement("Shortcut"); + fileDefinitions.AddAttribute("Id", shortcutId); + fileDefinitions.AddAttribute("Name", shortcut.textLabel); + std::string target = "[#" + fileId + "]"; + fileDefinitions.AddAttribute("Target", target); + fileDefinitions.AddAttribute("WorkingDirectory", + shortcut.workingDirectoryId); + fileDefinitions.EndElement("Shortcut"); + } + + fileDefinitions.BeginElement("RegistryValue"); + fileDefinitions.AddAttribute("Root", "HKCU"); + fileDefinitions.AddAttribute("Key", registryKey); + fileDefinitions.AddAttribute("Name", valueName + "_desktop"); + fileDefinitions.AddAttribute("Type", "integer"); + fileDefinitions.AddAttribute("Value", "1"); + fileDefinitions.AddAttribute("KeyPath", "yes"); + fileDefinitions.EndElement("RegistryValue"); + + fileDefinitions.EndElement("Component"); + fileDefinitions.EndElement("DirectoryRef"); + + featureDefinitions.BeginElement("ComponentRef"); + featureDefinitions.AddAttribute("Id", componentId); + featureDefinitions.EndElement("ComponentRef"); + } + featureDefinitions.EndElement("FeatureRef"); return true; @@ -908,6 +987,7 @@ void cmCPackWIXGenerator::AddDirectoryAndFileDefinitons( cmWIXSourceWriter& fileDefinitions, cmWIXSourceWriter& featureDefinitions, const std::vector<std::string>& packageExecutables, + const std::vector<std::string>& desktopExecutables, shortcut_map_t& shortcutMap) { cmsys::Directory dir; @@ -943,6 +1023,7 @@ void cmCPackWIXGenerator::AddDirectoryAndFileDefinitons( fileDefinitions, featureDefinitions, packageExecutables, + desktopExecutables, shortcutMap); ApplyPatchFragment(subDirectoryId, directoryDefinitions); @@ -995,6 +1076,15 @@ void cmCPackWIXGenerator::AddDirectoryAndFileDefinitons( cmWIXShortcut &shortcut = shortcutMap[id]; shortcut.textLabel= textLabel; shortcut.workingDirectoryId = directoryId; + + if(desktopExecutables.size() && + std::find(desktopExecutables.begin(), + desktopExecutables.end(), + executableName) + != desktopExecutables.end()) + { + shortcut.desktop = true; + } } } } @@ -1232,6 +1322,15 @@ void cmCPackWIXGenerator::CreateStartMenuFolder( directoryDefinitions.EndElement("Directory"); } +void cmCPackWIXGenerator::CreateDesktopFolder( + cmWIXSourceWriter& directoryDefinitions) +{ + directoryDefinitions.BeginElement("Directory"); + directoryDefinitions.AddAttribute("Id", "DesktopFolder"); + directoryDefinitions.AddAttribute("Name", "Desktop"); + directoryDefinitions.EndElement("Directory"); +} + void cmCPackWIXGenerator::LoadPatchFragments(const std::string& patchFilePath) { cmWIXPatchParser parser(Fragments, Logger); diff --git a/Source/CPack/WiX/cmCPackWIXGenerator.h b/Source/CPack/WiX/cmCPackWIXGenerator.h index 1f4facf..1de4810 100644 --- a/Source/CPack/WiX/cmCPackWIXGenerator.h +++ b/Source/CPack/WiX/cmCPackWIXGenerator.h @@ -22,8 +22,13 @@ struct cmWIXShortcut { + cmWIXShortcut() + :desktop(false) + {} + std::string textLabel; std::string workingDirectoryId; + bool desktop; }; class cmWIXSourceWriter; @@ -36,6 +41,8 @@ class cmCPackWIXGenerator : public cmCPackGenerator public: cmCPackTypeMacro(cmCPackWIXGenerator, cmCPackGenerator); + cmCPackWIXGenerator(); + protected: virtual int InitializeInternal(); @@ -133,6 +140,7 @@ private: cmWIXSourceWriter& fileDefinitions, cmWIXSourceWriter& featureDefinitions, const std::vector<std::string>& pkgExecutables, + const std::vector<std::string>& desktopExecutables, shortcut_map_t& shortcutMap); bool RequireOption(const std::string& name, std::string& value) const; @@ -165,6 +173,8 @@ private: void CreateStartMenuFolder(cmWIXSourceWriter& directoryDefinitions); + void CreateDesktopFolder(cmWIXSourceWriter& directoryDefinitions); + void LoadPatchFragments(const std::string& patchFilePath); void ApplyPatchFragment(const std::string& id, cmWIXSourceWriter& writer); @@ -180,6 +190,8 @@ private: extension_set_t LightExtensions; cmWIXPatchParser::fragment_map_t Fragments; + + bool HasDesktopShortcuts; }; #endif diff --git a/Source/cmAddLibraryCommand.cxx b/Source/cmAddLibraryCommand.cxx index a29f784..009b1ca 100644 --- a/Source/cmAddLibraryCommand.cxx +++ b/Source/cmAddLibraryCommand.cxx @@ -173,6 +173,13 @@ bool cmAddLibraryCommand ++s; importGlobal = true; } + else if(type == cmTarget::INTERFACE_LIBRARY && *s == "GLOBAL") + { + cmOStringStream e; + e << "GLOBAL option may only be used with IMPORTED libraries."; + this->SetError(e.str().c_str()); + return false; + } else { break; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index e51095e..18ba7c8 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2832,12 +2832,54 @@ public: cmTargetCollectLinkLanguages(cmTarget const* target, const char* config, std::set<cmStdString>& languages, cmTarget const* head): - Config(config), Languages(languages), HeadTarget(head) + Config(config), Languages(languages), HeadTarget(head), + Makefile(target->GetMakefile()), Target(target) { this->Visited.insert(target); } - void Visit(cmTarget const* target) + void Visit(const std::string& name) { - if(!target || !this->Visited.insert(target).second) + cmTarget *target = this->Makefile->FindTargetToUse(name); + + if(!target) + { + if(name.find("::") != std::string::npos) + { + bool noMessage = false; + cmake::MessageType messageType = cmake::FATAL_ERROR; + cmOStringStream e; + switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0028)) + { + case cmPolicies::WARN: + { + e << (this->Makefile->GetPolicies() + ->GetPolicyWarning(cmPolicies::CMP0028)) << "\n"; + messageType = cmake::AUTHOR_WARNING; + } + break; + case cmPolicies::OLD: + noMessage = true; + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::REQUIRED_ALWAYS: + case cmPolicies::NEW: + // Issue the fatal message. + break; + } + + if(!noMessage) + { + e << "Target \"" << this->Target->GetName() + << "\" links to target \"" << name + << "\" but the target was not found. Perhaps a find_package() " + "call is missing for an IMPORTED target, or an ALIAS target is " + "missing?"; + this->Makefile->GetCMakeInstance()->IssueMessage(messageType, + e.str(), + this->Target->GetBacktrace()); + } + } + return; + } + if(!this->Visited.insert(target).second) { return; } @@ -2852,17 +2894,18 @@ public: this->Languages.insert(*li); } - cmMakefile* mf = target->GetMakefile(); for(std::vector<std::string>::const_iterator li = iface->Libraries.begin(); li != iface->Libraries.end(); ++li) { - this->Visit(mf->FindTargetToUse(*li)); + this->Visit(*li); } } private: const char* Config; std::set<cmStdString>& Languages; cmTarget const* HeadTarget; + cmMakefile* Makefile; + const cmTarget* Target; std::set<cmTarget const*> Visited; }; @@ -2964,7 +3007,7 @@ void cmTarget::ComputeLinkClosure(const char* config, LinkClosure& lc, for(std::vector<std::string>::const_iterator li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li) { - cll.Visit(this->Makefile->FindTargetToUse(*li)); + cll.Visit(*li); } // Store the transitive closure of languages. @@ -5619,46 +5662,6 @@ void cmTarget::ComputeLinkImplementation(const char* config, } continue; } - cmTarget *tgt = this->Makefile->FindTargetToUse(*li); - - if(!tgt && std::string(item).find("::") != std::string::npos) - { - bool noMessage = false; - cmake::MessageType messageType = cmake::FATAL_ERROR; - cmOStringStream e; - switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0028)) - { - case cmPolicies::WARN: - { - e << (this->Makefile->GetPolicies() - ->GetPolicyWarning(cmPolicies::CMP0028)) << "\n"; - messageType = cmake::AUTHOR_WARNING; - } - break; - case cmPolicies::OLD: - noMessage = true; - case cmPolicies::REQUIRED_IF_USED: - case cmPolicies::REQUIRED_ALWAYS: - case cmPolicies::NEW: - // Issue the fatal message. - break; - } - - if(!noMessage) - { - e << "Target \"" << this->GetName() << "\" links to target \"" << item - << "\" but the target was not found. Perhaps a find_package() " - "call is missing for an IMPORTED target, or an ALIAS target is " - "missing?"; - this->Makefile->GetCMakeInstance()->IssueMessage(messageType, - e.str(), - this->GetBacktrace()); - if (messageType == cmake::FATAL_ERROR) - { - return; - } - } - } // The entry is meant for this configuration. impl.Libraries.push_back(item); |