From ed9684a22cf4babeaa1f9083f4061d789e513ba9 Mon Sep 17 00:00:00 2001 From: Konstantin Podsvirov Date: Sun, 5 Oct 2014 12:52:57 +0400 Subject: CPackIFW: Added support for multiple repositories Now user can add IFW specific repo with cpack_ifw_add_repository macro --- Modules/CPackIFW.cmake | 95 ++++++++++++++++++++++- Source/CPack/IFW/cmCPackIFWGenerator.cxx | 30 +++++--- Source/CPack/IFW/cmCPackIFWGenerator.h | 2 - Source/CPack/IFW/cmCPackIFWInstaller.cxx | 124 ++++++++++++++++++++++++++++--- Source/CPack/IFW/cmCPackIFWInstaller.h | 11 +++ 5 files changed, 234 insertions(+), 28 deletions(-) diff --git a/Modules/CPackIFW.cmake b/Modules/CPackIFW.cmake index 27546ac..4b8dc1e 100644 --- a/Modules/CPackIFW.cmake +++ b/Modules/CPackIFW.cmake @@ -85,6 +85,19 @@ # The root package name, which will be used if configuration group is not # specified # +# .. variable:: CPACK_IFW_REPOSITORIES_ALL +# +# The list of remote repositories. +# +# The default value of this variable is computed by CPack and contains +# all repositories added with command :command:`cpack_ifw_add_repository` +# +# .. variable:: CPACK_IFW_DOWNLOAD_ALL +# +# If this is ``ON`` all components will be downloaded. +# By default is ``OFF`` or used value +# from :variable:`CPACK_DOWNLOAD_ALL` if set +# # Components # """""""""" # @@ -185,6 +198,33 @@ # ``LICENSES`` pair of and of license text for this # component group. You can specify more then one license. # +# -------------------------------------------------------------------------- +# +# .. command:: cpack_ifw_add_repository +# +# Add QtIFW_ specific remote repository. +# +# :: +# +# cpack_ifw_add_repository( [DISABLED] +# URL +# [USERNAME ] +# [PASSWORD ] +# [DISPLAY_NAME ]) +# +# This macro will also add the repository +# to a variable :variable:`CPACK_IFW_REPOSITORIES_ALL` +# +# ``DISABLED`` if set, then the repository will be disabled by default. +# +# ``URL`` is points to a list of available components. +# +# ``USERNAME`` is used as user on a protected repository. +# +# ``PASSWORD`` is password to use on a protected repository. +# +# ``DISPLAY_NAME`` is string to display instead of the URL. +# # Example usage # ^^^^^^^^^^^^^ # @@ -192,7 +232,7 @@ # # set(CPACK_PACKAGE_NAME "MyPackage") # set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MyPackage Installation Example") -# set(CPACK_PACKAGE_VERSION "1.0.0") +# set(CPACK_PACKAGE_VERSION "1.0.0") # Version of installer # # include(CPack) # include(CPackIFW) @@ -201,8 +241,15 @@ # DISPLAY_NAME "MyApp" # DESCRIPTION "My Application") # cpack_ifw_configure_component(myapp -# VERSION "1.2.3" +# VERSION "1.2.3" # Version of component # SCRIPT "operations.qs") +# cpack_add_component(mybigplugin +# DISPLAY_NAME "MyBigPlugin" +# DESCRIPTION "My Big Downloadable Plugin" +# DOWNLOADED) +# cpack_ifw_add_repository(myrepo +# URL "http://example.com/ifw/repo/myapp" +# DISPLAY_NAME "My Application Repository") # # # Online installer @@ -217,8 +264,11 @@ # Then you would use the command :command:`cpack_configure_downloads`. # If you set ``ALL`` option all components will be downloaded. # +# You also can use command :command:`cpack_ifw_add_repository` and +# variable :variable:`CPACK_IFW_DOWNLOAD_ALL` for more specific configuration. +# # CPack IFW generator create "repository" dir in current binary dir. You -# would copy content of this dir to specified ``site``. +# would copy content of this dir to specified ``site`` (``url``). # # See Also # ^^^^^^^^ @@ -425,4 +475,43 @@ macro(cpack_ifw_configure_component_group grpname) endif() endmacro() +# Macro for adding repository +macro(cpack_ifw_add_repository reponame) + + string(TOUPPER ${reponame} _CPACK_IFWREPO_UNAME) + + set(_IFW_OPT DISABLED) + set(_IFW_ARGS URL USERNAME PASSWORD DISPLAY_NAME) + set(_IFW_MULTI_ARGS) + cmake_parse_arguments(CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN}) + + set(_CPACK_IFWREPO_STR "\n# Configuration for IFW repository \"${reponame}\"\n") + + foreach(_IFW_ARG_NAME ${_IFW_OPT}) + cpack_append_option_set_command( + CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME} + _CPACK_IFWREPO_STR) + endforeach() + + foreach(_IFW_ARG_NAME ${_IFW_ARGS}) + cpack_append_string_variable_set_command( + CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME} + _CPACK_IFWREPO_STR) + endforeach() + + foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS}) + cpack_append_variable_set_command( + CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME} + _CPACK_IFWREPO_STR) + endforeach() + + list(APPEND CPACK_IFW_REPOSITORIES_ALL ${reponame}) + set(_CPACK_IFWREPO_STR "${_CPACK_IFWREPO_STR}list(APPEND CPACK_IFW_REPOSITORIES_ALL ${reponame})\n") + + if(CPack_CMake_INCLUDED) + file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWREPO_STR}") + endif() + +endmacro() + endif() # NOT CPackIFW_CMake_INCLUDED diff --git a/Source/CPack/IFW/cmCPackIFWGenerator.cxx b/Source/CPack/IFW/cmCPackIFWGenerator.cxx index dabb3b3..7f06e2d 100644 --- a/Source/CPack/IFW/cmCPackIFWGenerator.cxx +++ b/Source/CPack/IFW/cmCPackIFWGenerator.cxx @@ -56,7 +56,7 @@ int cmCPackIFWGenerator::PackageFiles() ifwTmpFile += "/IFWOutput.log"; // Run repogen - if (!DownloadSite.empty()) + if (!Installer.Repositories.empty()) { std::string ifwCmd = RepoGen; ifwCmd += " -c " + this->toplevel + "/config/config.xml"; @@ -128,7 +128,7 @@ int cmCPackIFWGenerator::PackageFiles() { ifwCmd += " --online-only"; } - else if (!DownloadedPackages.empty() && !DownloadSite.empty()) + else if (!DownloadedPackages.empty() && !Installer.Repositories.empty()) { ifwCmd += " -e "; std::set::iterator it @@ -278,16 +278,26 @@ int cmCPackIFWGenerator::InitializeInternal() PkgsDirsVector); } - // Remote repository + // Installer + Installer.Generator = this; + Installer.ConfigureFromOptions(); - if (const char *site = this->GetOption("CPACK_DOWNLOAD_SITE")) + if (const char* ifwDownloadAll = + this->GetOption("CPACK_IFW_DOWNLOAD_ALL")) { - DownloadSite = site; + OnlineOnly = cmSystemTools::IsOn(ifwDownloadAll); + } + else if (const char* cpackDownloadAll = + this->GetOption("CPACK_DOWNLOAD_ALL")) + { + OnlineOnly = cmSystemTools::IsOn(cpackDownloadAll); + } + else + { + OnlineOnly = false; } - OnlineOnly = this->IsOn("CPACK_DOWNLOAD_ALL") ? true : false; - - if (!DownloadSite.empty() && RepoGen.empty()) { + if (!Installer.Repositories.empty() && RepoGen.empty()) { cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find QtIFW repository generator \"repogen\": " "likely it is not installed, or not in your PATH" @@ -295,10 +305,6 @@ int cmCPackIFWGenerator::InitializeInternal() return 0; } - // Installer - Installer.Generator = this; - Installer.ConfigureFromOptions(); - return this->Superclass::InitializeInternal(); } diff --git a/Source/CPack/IFW/cmCPackIFWGenerator.h b/Source/CPack/IFW/cmCPackIFWGenerator.h index 7211e04..1d4d67b 100644 --- a/Source/CPack/IFW/cmCPackIFWGenerator.h +++ b/Source/CPack/IFW/cmCPackIFWGenerator.h @@ -127,8 +127,6 @@ private: std::string RepoGen; std::string BinCreator; - std::string DownloadSite; - bool OnlineOnly; bool ResolveDuplicateNames; std::vector PkgsDirsVector; diff --git a/Source/CPack/IFW/cmCPackIFWInstaller.cxx b/Source/CPack/IFW/cmCPackIFWInstaller.cxx index fcb07e6..0644ecb 100644 --- a/Source/CPack/IFW/cmCPackIFWInstaller.cxx +++ b/Source/CPack/IFW/cmCPackIFWInstaller.cxx @@ -45,6 +45,12 @@ const char *cmCPackIFWInstaller::GetOption(const std::string &op) const } //---------------------------------------------------------------------------- +bool cmCPackIFWInstaller::IsOn(const std::string &op) const +{ + return Generator ? Generator->IsOn(op) : false; +} + +//---------------------------------------------------------------------------- void cmCPackIFWInstaller::ConfigureFromOptions() { // Name; @@ -167,6 +173,78 @@ void cmCPackIFWInstaller::ConfigureFromOptions() { AdminTargetDir = option; } + + // Repositories + Repositories.clear(); + RepositoryStruct Repo; + if (const char *site = this->GetOption("CPACK_DOWNLOAD_SITE")) + { + Repo.Url = site; + Repositories.push_back(Repo); + } + if(const char *RepoAllStr = this->GetOption("CPACK_IFW_REPOSITORIES_ALL")) + { + std::vector RepoAllVector; + cmSystemTools::ExpandListArgument(RepoAllStr, + RepoAllVector); + for(std::vector::iterator + rit = RepoAllVector.begin(); rit != RepoAllVector.end(); ++rit) + { + std::string prefix = "CPACK_IFW_REPOSITORY_" + + cmsys::SystemTools::UpperCase(*rit) + + "_"; + // Url + if (const char* url = GetOption(prefix + "URL")) + { + Repo.Url = url; + } + else + { + Repo.Url = ""; + } + // Enabled + if (IsOn(prefix + "DISABLED")) + { + Repo.Enabled = "0"; + } + else + { + Repo.Enabled = ""; + } + // Username + if (const char* username = GetOption(prefix + "USERNAME")) + { + Repo.Username = username; + } + else + { + Repo.Username = ""; + } + // Password + if (const char* password = GetOption(prefix + "PASSWORD")) + { + Repo.Password = password; + } + else + { + Repo.Password = ""; + } + // DisplayName + if (const char* displayName = GetOption(prefix + "DISPLAY_NAME")) + { + Repo.DisplayName = displayName; + } + else + { + Repo.DisplayName = ""; + } + + if(!Repo.Url.empty()) + { + Repositories.push_back(Repo); + } + } + } } //---------------------------------------------------------------------------- @@ -246,19 +324,43 @@ void cmCPackIFWInstaller::GenerateInstallerFile() << "" << std::endl; } - // Site - if (!Generator->DownloadSite.empty()) + // Remote repositories + if (!Repositories.empty()) { xout << " " << std::endl; - xout << " " << std::endl; - xout << " " << Generator->DownloadSite - << "" << std::endl; - // These properties can not be set from "cpack_configure_downloads" - // 1 - // user - // password - // Example repository - xout << " " << std::endl; + for(std::vector::iterator + rit = Repositories.begin(); rit != Repositories.end(); ++rit) + { + xout << " " << std::endl; + // Url + xout << " " << rit->Url + << "" << std::endl; + // Enabled + if(!rit->Enabled.empty()) + { + xout << " " << rit->Enabled + << "" << std::endl; + } + // Username + if(!rit->Username.empty()) + { + xout << " " << rit->Username + << "" << std::endl; + } + // Password + if(!rit->Password.empty()) + { + xout << " " << rit->Password + << "" << std::endl; + } + // DisplayName + if(!rit->DisplayName.empty()) + { + xout << " " << rit->DisplayName + << "" << std::endl; + } + xout << " " << std::endl; + } xout << " " << std::endl; } diff --git a/Source/CPack/IFW/cmCPackIFWInstaller.h b/Source/CPack/IFW/cmCPackIFWInstaller.h index 1630a94..5824d33 100644 --- a/Source/CPack/IFW/cmCPackIFWInstaller.h +++ b/Source/CPack/IFW/cmCPackIFWInstaller.h @@ -27,6 +27,15 @@ public: // Types typedef std::map PackagesMap; + struct RepositoryStruct + { + std::string Url; + std::string Enabled; + std::string Username; + std::string Password; + std::string DisplayName; + }; + public: // Constructor /** @@ -69,6 +78,7 @@ public: // Configuration public: // Internal implementation const char* GetOption(const std::string& op) const; + bool IsOn(const std::string& op) const; void ConfigureFromOptions(); @@ -78,6 +88,7 @@ public: // Internal implementation cmCPackIFWGenerator* Generator; PackagesMap Packages; + std::vector Repositories; std::string Directory; }; -- cgit v0.12