mirror of https://github.com/Kitware/CMake.git
Browse Source
CPack: Add an "IFW" generator for Qt Framework Installer
CPack: Add an "IFW" generator for Qt Framework Installer
Add support for packaging with the Qt Framework Installer tools: http://qt-project.org/doc/qtinstallerframework/index.html Reviewed-by: Nils Gladitz <nilsgladitz@gmail.com>pull/115/merge

committed by
Brad King

13 changed files with 1413 additions and 0 deletions
-
32CMakeCPack.cmake
-
14CMakeCPackOptions.cmake.in
-
1Help/manual/cmake-modules.7.rst
-
1Help/module/CPackIFW.rst
-
2Modules/CPack.cmake
-
3Modules/CPackComponent.cmake
-
384Modules/CPackIFW.cmake
-
1Source/CMakeLists.txt
-
6Source/CPack/cmCPackGeneratorFactory.cxx
-
856Source/CPack/cmCPackIFWGenerator.cxx
-
82Source/CPack/cmCPackIFWGenerator.h
-
7Source/QtIFW/cmake.org.html
-
24Source/QtIFW/installscript.qs.in
@ -0,0 +1 @@ |
|||
.. cmake-module:: ../../Modules/CPackIFW.cmake |
@ -0,0 +1,384 @@ |
|||
#.rst: |
|||
# CPackIFW |
|||
# -------- |
|||
# |
|||
# .. _QtIFW: http://qt-project.org/doc/qtinstallerframework/index.html |
|||
# |
|||
# This module looks for the location of the command line utilities supplied with |
|||
# the Qt Installer Framework (QtIFW_). |
|||
# |
|||
# The module also defines several commands to control the behavior of the |
|||
# CPack ``IFW`` generator. |
|||
# |
|||
# |
|||
# Overview |
|||
# ^^^^^^^^ |
|||
# |
|||
# CPack ``IFW`` generator helps you create online and offline |
|||
# binary cross-platform installers with a graphical user interface. |
|||
# |
|||
# CPack IFW generator prepare project installation and generate configuration |
|||
# and meta information for QtIFW_ tools. |
|||
# |
|||
# The QtIFW_ provides a set of tools and utilities to create |
|||
# installers for the supported desktop Qt platforms: Linux, Microsoft Windows, |
|||
# and Mac OS X. |
|||
# |
|||
# To use CPack ``IFW`` generator you must also install QtIFW_. |
|||
# |
|||
# Variables |
|||
# ^^^^^^^^^ |
|||
# |
|||
# Variables that Change Behavior |
|||
# """""""""""""""""""""""""""""" |
|||
# |
|||
# .. variable:: CPACK_IFW_TARGET_DIRECTORY |
|||
# |
|||
# Default target directory for installation. |
|||
# By default used "@ApplicationsDir@/:variable:`CPACK_PACKAGE_INSTALL_DIRECTORY`" |
|||
# |
|||
# You can use predefined variables. |
|||
# |
|||
# .. variable:: CPACK_IFW_ADMIN_TARGET_DIRECTORY |
|||
# |
|||
# Default target directory for installation with administrator rights. |
|||
# |
|||
# You can use predefined variables. |
|||
# |
|||
# .. variable:: CPACK_IFW_RESOLVE_DUPLICATE_NAMES |
|||
# |
|||
# Resolve duplicate names when installing components with groups. |
|||
# |
|||
# .. variable:: CPACK_IFW_PACKAGES_DIRECTORIES |
|||
# |
|||
# Additional prepared packages dirs that will be used to resolve |
|||
# dependent components. |
|||
# |
|||
# Advanced Variables |
|||
# """""""""""""""""" |
|||
# |
|||
# .. variable:: CPACK_IFW_BINARYCREATOR_EXECUTABLE |
|||
# |
|||
# The path to "binarycreator" command line client. |
|||
# |
|||
# This variable is cached and can be configured user if need. |
|||
# |
|||
# .. variable:: CPACK_IFW_BINARYCREATOR_EXECUTABLE_FOUND |
|||
# |
|||
# True if the "binarycreator" command line client was found. |
|||
# |
|||
# .. variable:: CPACK_IFW_REPOGEN_EXECUTABLE |
|||
# |
|||
# The path to "repogen" command line client. |
|||
# |
|||
# This variable is cached and can be configured user if need. |
|||
# |
|||
# .. variable:: CPACK_IFW_REPOGEN_EXECUTABLE_FOUND |
|||
# |
|||
# True if the "repogen" command line client was found. |
|||
# |
|||
# Commands |
|||
# ^^^^^^^^^ |
|||
# |
|||
# The module defines the following commands: |
|||
# |
|||
# -------------------------------------------------------------------------- |
|||
# |
|||
# .. command:: cpack_ifw_configure_component |
|||
# |
|||
# Sets the arguments specific to the CPack IFW generator. |
|||
# |
|||
# :: |
|||
# |
|||
# cpack_ifw_configure_component(<compname> |
|||
# [VERSION <version>] |
|||
# [SCRIPT <script>] |
|||
# [NAME <name>] |
|||
# [PRIORITY <priority>] |
|||
# [LICENSES <display_name> <file_path> ...]) |
|||
# |
|||
# This command should be called after cpack_add_component command. |
|||
# |
|||
# ``VERSION`` is version of component. By default used :variable:`CPACK_PACKAGE_VERSION`. |
|||
# |
|||
# ``SCRIPT`` is relative or absolute path to operations script |
|||
# for this component. |
|||
# |
|||
# ``NAME`` is used to create domain-like identification for this component. |
|||
# By default used origin component name. |
|||
# |
|||
# ``PRIORITY`` is priority of the component in the tree. |
|||
# |
|||
# ``LICENSES`` pair of <display_name> and <file_path> of license text for this |
|||
# component. You can specify more then one license. |
|||
# |
|||
# -------------------------------------------------------------------------- |
|||
# |
|||
# .. command:: cpack_ifw_configure_component_group |
|||
# |
|||
# Sets the arguments specific to the CPack IFW generator. |
|||
# |
|||
# :: |
|||
# |
|||
# cpack_ifw_configure_component_group(<grpname> |
|||
# [VERSION <version>] |
|||
# [NAME <name>] |
|||
# [PRIORITY <priority>] |
|||
# [LICENSES <display_name> <file_path> ...]) |
|||
# |
|||
# This command should be called after cpack_add_component_group command. |
|||
# |
|||
# ``VERSION`` is version of component group. By default used :variable:`CPACK_PACKAGE_VERSION`. |
|||
# |
|||
# ``NAME`` is used to create domain-like identification for this component group. |
|||
# By default used origin component group name. |
|||
# |
|||
# ``PRIORITY`` is priority of the component group in the tree. |
|||
# |
|||
# ``LICENSES`` pair of <display_name> and <file_path> of license text for this |
|||
# component group. You can specify more then one license. |
|||
# |
|||
# Example usage |
|||
# ^^^^^^^^^^^^^ |
|||
# |
|||
# .. code-block:: cmake |
|||
# |
|||
# set(CPACK_PACKAGE_NAME "MyPackage") |
|||
# set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MyPackage Installation Example") |
|||
# set(CPACK_PACKAGE_VERSION "1.0.0") |
|||
# |
|||
# include(CPack) |
|||
# include(CPackIFW) |
|||
# |
|||
# cpack_add_component(myapp |
|||
# DISPLAY_NAME "MyApp" |
|||
# DESCRIPTION "My Application") |
|||
# cpack_ifw_configure_component(myapp |
|||
# VERSION "1.2.3" |
|||
# SCRIPT "operations.qs") |
|||
# |
|||
# |
|||
# Online installer |
|||
# ^^^^^^^^^^^^^^^^ |
|||
# |
|||
# By defaul CPack IFW generator make offline installer. This means that all |
|||
# components will be packaged into a binary file. |
|||
# |
|||
# To make a component downloaded, you must set the ``DOWNLOADED`` option in |
|||
# :command:`cpack_add_component`. |
|||
# |
|||
# Then you would use the command :command:`cpack_configure_downloads`. |
|||
# If you set ``ALL`` option all components will be downloaded. |
|||
# |
|||
# CPack IFW generator create "repository" dir in current binary dir. You |
|||
# would copy content of this dir to specified ``site``. |
|||
# |
|||
# See Also |
|||
# ^^^^^^^^ |
|||
# |
|||
# Qt Installer Framework Manual: |
|||
# |
|||
# Index page |
|||
# http://qt-project.org/doc/qtinstallerframework/index.html |
|||
# |
|||
# Component Scripting |
|||
# http://qt-project.org/doc/qtinstallerframework/scripting.html |
|||
# |
|||
# Predefined Variables |
|||
# http://qt-project.org/doc/qtinstallerframework/scripting.html#predefined-variables |
|||
# |
|||
# Download Qt Installer Framework for you platform from Qt Project site: |
|||
# http://download.qt-project.org/official_releases/qt-installer-framework/ |
|||
# |
|||
|
|||
#============================================================================= |
|||
# Copyright 2014 Kitware, Inc. |
|||
# Copyright 2014 Konstantin Podsvirov <konstantin@podsvirov.pro> |
|||
# |
|||
# 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. |
|||
#============================================================================= |
|||
# (To distribute this file outside of CMake, substitute the full |
|||
# License text for the above reference.) |
|||
|
|||
#============================================================================= |
|||
# Search Qt Installer Framework tools |
|||
#============================================================================= |
|||
|
|||
# Default path |
|||
|
|||
if(WIN32) |
|||
set(_CPACK_IFW_PATHS |
|||
"$ENV{HOMEDRIVE}/Qt" |
|||
"C:/Qt" |
|||
) |
|||
else() |
|||
set(_CPACK_IFW_PATHS |
|||
"$ENV{HOME}/Qt" |
|||
"/opt/Qt" |
|||
) |
|||
endif() |
|||
|
|||
set(_CPACK_IFW_SUFFIXES |
|||
"QtIFW-1.7.0/bin" |
|||
"QtIFW-1.6.0/bin" |
|||
"QtIFW-1.5.0/bin" |
|||
"QtIFW-1.4.0/bin" |
|||
"QtIFW-1.3.0/bin" |
|||
) |
|||
|
|||
# Look for 'binarycreator' |
|||
|
|||
if(NOT CPACK_IFW_BINARYCREATOR_EXECUTABLE_FOUND) |
|||
|
|||
find_program(CPACK_IFW_BINARYCREATOR_EXECUTABLE |
|||
NAMES binarycreator |
|||
PATHS ${_CPACK_IFW_PATHS} |
|||
PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES} |
|||
DOC "QtIFW binarycreator command line client" |
|||
) |
|||
mark_as_advanced(CPACK_IFW_BINARYCREATOR_EXECUTABLE) |
|||
|
|||
if(EXISTS ${CPACK_IFW_BINARYCREATOR_EXECUTABLE}) |
|||
set(CPACK_IFW_BINARYCREATOR_EXECUTABLE_FOUND 1) |
|||
endif() |
|||
|
|||
endif() # NOT CPACK_IFW_BINARYCREATOR_EXECUTABLE_FOUND |
|||
|
|||
# Look for 'repogen' |
|||
|
|||
if(NOT CPACK_IFW_REPOGEN_EXECUTABLE_FOUND) |
|||
|
|||
find_program(CPACK_IFW_REPOGEN_EXECUTABLE |
|||
NAMES repogen |
|||
PATHS ${_CPACK_IFW_PATHS} |
|||
PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES} |
|||
DOC "QtIFW repogen command line client" |
|||
) |
|||
mark_as_advanced(CPACK_IFW_REPOGEN_EXECUTABLE) |
|||
|
|||
if(EXISTS ${CPACK_IFW_REPOGEN_EXECUTABLE}) |
|||
set(CPACK_IFW_REPOGEN_EXECUTABLE_FOUND 1) |
|||
endif() |
|||
|
|||
endif() # NOT CPACK_IFW_REPOGEN_EXECUTABLE_FOUND |
|||
|
|||
# |
|||
## Next code is included only once |
|||
# |
|||
|
|||
if(NOT CPackIFW_CMake_INCLUDED) |
|||
set(CPackIFW_CMake_INCLUDED 1) |
|||
|
|||
#============================================================================= |
|||
# Macro definition |
|||
#============================================================================= |
|||
|
|||
# Macro definition based on CPackComponent |
|||
|
|||
if(NOT CPackComponent_CMake_INCLUDED) |
|||
include(CPackComponent) |
|||
endif() |
|||
|
|||
if(NOT __CMAKE_PARSE_ARGUMENTS_INCLUDED) |
|||
include(CMakeParseArguments) |
|||
endif() |
|||
|
|||
# Resolve full path to lisense file |
|||
macro(_cpack_ifw_resolve_lisenses _variable) |
|||
if(${_variable}) |
|||
set(_ifw_license_file FALSE) |
|||
set(_ifw_licenses_fix) |
|||
foreach(_ifw_licenses_arg ${${_variable}}) |
|||
if(_ifw_license_file) |
|||
get_filename_component(_ifw_licenses_arg "${_ifw_licenses_arg}" ABSOLUTE) |
|||
set(_ifw_license_file FALSE) |
|||
else() |
|||
set(_ifw_license_file TRUE) |
|||
endif() |
|||
list(APPEND _ifw_licenses_fix "${_ifw_licenses_arg}") |
|||
endforeach(_ifw_licenses_arg) |
|||
set(${_variable} "${_ifw_licenses_fix}") |
|||
endif() |
|||
endmacro() |
|||
|
|||
# Macro for configure component |
|||
macro(cpack_ifw_configure_component compname) |
|||
|
|||
string(TOUPPER ${compname} _CPACK_IFWCOMP_UNAME) |
|||
|
|||
set(_IFW_OPT) |
|||
set(_IFW_ARGS VERSION SCRIPT NAME PRIORITY) |
|||
set(_IFW_MULTI_ARGS DEPENDS LICENSES) |
|||
cmake_parse_arguments(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN}) |
|||
|
|||
# Resolve full filename for script file |
|||
set(_IFW_SCRIPT_MACRO CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_SCRIPT) |
|||
set(_IFW_SCRIPT_FILE ${${_IFW_SCRIPT_MACRO}}) |
|||
if(DEFINED ${_IFW_SCRIPT_MACRO}) |
|||
get_filename_component(${_IFW_SCRIPT_MACRO} ${_IFW_SCRIPT_FILE} ABSOLUTE) |
|||
set(_IFW_SCRIPT_FILE ${${_IFW_SCRIPT_MACRO}}) |
|||
if(NOT EXISTS ${_IFW_SCRIPT_FILE}) |
|||
message(WARNING "CPack IFW: script file \"${_IFW_SCRIPT_FILE}\" for component \"${compname}\" is not exists" ) |
|||
set(${_IFW_SCRIPT_MACRO}) |
|||
endif() |
|||
endif() |
|||
|
|||
_cpack_ifw_resolve_lisenses(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_LICENSES) |
|||
|
|||
set(_CPACK_IFWCOMP_STR "\n# Configuration for IFW component \"${compname}\"\n") |
|||
|
|||
foreach(_IFW_ARG_NAME ${_IFW_ARGS}) |
|||
cpack_append_string_variable_set_command( |
|||
CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_${_IFW_ARG_NAME} |
|||
_CPACK_IFWCOMP_STR) |
|||
endforeach() |
|||
|
|||
foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS}) |
|||
cpack_append_variable_set_command( |
|||
CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_${_IFW_ARG_NAME} |
|||
_CPACK_IFWCOMP_STR) |
|||
endforeach() |
|||
|
|||
if(CPack_CMake_INCLUDED) |
|||
file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWCOMP_STR}") |
|||
endif() |
|||
|
|||
endmacro() |
|||
|
|||
# Macro for configure group |
|||
macro(cpack_ifw_configure_component_group grpname) |
|||
|
|||
string(TOUPPER ${grpname} _CPACK_IFWGRP_UNAME) |
|||
|
|||
set(_IFW_OPT) |
|||
set(_IFW_ARGS VERSION NAME PRIORITY) |
|||
set(_IFW_MULTI_ARGS LICENSES) |
|||
cmake_parse_arguments(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN}) |
|||
|
|||
_cpack_ifw_resolve_lisenses(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_LICENSES) |
|||
|
|||
set(_CPACK_IFWGRP_STR "\n# Configuration for IFW component group \"${grpname}\"\n") |
|||
|
|||
foreach(_IFW_ARG_NAME ${_IFW_ARGS}) |
|||
cpack_append_string_variable_set_command( |
|||
CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_${_IFW_ARG_NAME} |
|||
_CPACK_IFWGRP_STR) |
|||
endforeach() |
|||
|
|||
foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS}) |
|||
cpack_append_variable_set_command( |
|||
CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_${_IFW_ARG_NAME} |
|||
_CPACK_IFWGRP_STR) |
|||
endforeach() |
|||
|
|||
if(CPack_CMake_INCLUDED) |
|||
file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWGRP_STR}") |
|||
endif() |
|||
endmacro() |
|||
|
|||
endif() # NOT CPackIFW_CMake_INCLUDED |
@ -0,0 +1,856 @@ |
|||
/*============================================================================
|
|||
CMake - Cross Platform Makefile Generator |
|||
Copyright 2000-2009 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 "cmCPackIFWGenerator.h"
|
|||
|
|||
#include "cmGlobalGenerator.h"
|
|||
#include "cmLocalGenerator.h"
|
|||
#include "cmSystemTools.h"
|
|||
#include "cmMakefile.h"
|
|||
#include "cmGeneratedFileStream.h"
|
|||
#include "cmCPackLog.h"
|
|||
#include "cmCPackComponentGroup.h"
|
|||
|
|||
#include <cmsys/SystemTools.hxx>
|
|||
#include <cmsys/Glob.hxx>
|
|||
#include <cmsys/Directory.hxx>
|
|||
#include <cmsys/RegularExpression.hxx>
|
|||
#include <cmXMLSafe.h>
|
|||
|
|||
//----------------------------------------------------------------------
|
|||
cmCPackIFWGenerator::cmCPackIFWGenerator() |
|||
{ |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
cmCPackIFWGenerator::~cmCPackIFWGenerator() |
|||
{ |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
int cmCPackIFWGenerator::PackageFiles() |
|||
{ |
|||
cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- Configuration" << std::endl); |
|||
|
|||
if (!IfwCreateConfigFile()) |
|||
{ |
|||
cmCPackLogger(cmCPackLog::LOG_ERROR, |
|||
"CPack error: Could not create IFW \"config.xml\" file." |
|||
<< std::endl); |
|||
return false; |
|||
} |
|||
|
|||
if (Components.empty() && !IfwCreatePackageFile()) |
|||
{ |
|||
cmCPackLogger(cmCPackLog::LOG_ERROR, |
|||
"CPack error: Could not create IFW " |
|||
"\"root/meta/package.xml\" file." |
|||
<< std::endl); |
|||
return false; |
|||
} |
|||
|
|||
std::string ifwTLD = this->GetOption("CPACK_TOPLEVEL_DIRECTORY"); |
|||
std::string ifwTmpFile = ifwTLD; |
|||
ifwTmpFile += "/IFWOutput.log"; |
|||
|
|||
std::set<std::string> ifwDependsComponents; |
|||
std::string ifwBinaryComponents; |
|||
std::string ifwDownloadedComponents; |
|||
|
|||
// Create groups meta information
|
|||
std::map<std::string, cmCPackComponentGroup>::iterator groupIt; |
|||
for(groupIt = this->ComponentGroups.begin(); |
|||
groupIt != this->ComponentGroups.end(); |
|||
++groupIt |
|||
) |
|||
{ |
|||
std::string macroPrefix = "CPACK_IFW_COMPONENT_GROUP_" |
|||
+ cmsys::SystemTools::UpperCase(groupIt->second.Name); |
|||
|
|||
std::string groupId = IfwGetGroupId(&groupIt->second); |
|||
|
|||
if(!ifwBinaryComponents.empty()) ifwBinaryComponents += ","; |
|||
ifwBinaryComponents += groupId; |
|||
|
|||
std::string pkgMetaDir = this->toplevel + "/packages/" |
|||
+ groupId |
|||
+ "/meta"; |
|||
|
|||
std::string pkgXmlFileName = pkgMetaDir |
|||
+ "/package.xml"; |
|||
|
|||
cmGeneratedFileStream pkgXml(pkgXmlFileName.data()); |
|||
pkgXml << "<?xml version=\"1.0\"?>" << std::endl; |
|||
pkgXml << "<Package>" << std::endl; |
|||
pkgXml << " <DisplayName>" << groupIt->second.DisplayName |
|||
<< "</DisplayName>" << std::endl; |
|||
pkgXml << " <Description>" << groupIt->second.Description |
|||
<< "</Description>" << std::endl; |
|||
pkgXml << " <Name>" << groupId << "</Name>" << std::endl; |
|||
|
|||
// Version
|
|||
const char* ifwPackageVersion = this->GetOption("CPACK_PACKAGE_VERSION"); |
|||
const char* ifwGroupVersion = this->GetOption(macroPrefix + "_VERSION"); |
|||
pkgXml << " <Version>" |
|||
<< (ifwGroupVersion ? ifwGroupVersion : ifwPackageVersion) |
|||
<< "</Version>" << std::endl; |
|||
pkgXml << " <ReleaseDate>" << IfwCreateCurrentDate() |
|||
<< "</ReleaseDate>" << std::endl; |
|||
|
|||
// Licenses
|
|||
std::vector<std::string> licenses; |
|||
if(IfwParseLicenses(licenses, macroPrefix + "_LICENSES", pkgMetaDir)) |
|||
{ |
|||
pkgXml << " <Licenses>" << std::endl; |
|||
for(size_t i = 0; i < licenses.size(); i += 2) |
|||
{ |
|||
pkgXml << " <License " |
|||
<< "name=\"" << licenses[i] << "\" " |
|||
<< "file=\"" << licenses[i + 1] << "\" " |
|||
<< "/>" <<std::endl; |
|||
} |
|||
pkgXml << " </Licenses>" << std::endl; |
|||
} |
|||
|
|||
// Priority
|
|||
if(const char* ifwGroupPriority = |
|||
this->GetOption(macroPrefix + "_PRIORITY")) |
|||
{ |
|||
pkgXml << " <SortingPriority>" << ifwGroupPriority |
|||
<< "</SortingPriority>" << std::endl; |
|||
} |
|||
pkgXml << "</Package>" << std::endl; |
|||
} |
|||
|
|||
// Create components meta information
|
|||
std::map<std::string, cmCPackComponent>::iterator compIt; |
|||
for (compIt = this->Components.begin(); |
|||
compIt != this->Components.end(); |
|||
++compIt) |
|||
{ |
|||
// Component id
|
|||
std::string ifwCompId = IfwGetComponentId(&compIt->second); |
|||
|
|||
std::string pkgMetaDir = this->toplevel + "/" |
|||
+ GetComponentInstallDirNamePrefix(compIt->second.Name) |
|||
+ ifwCompId + "/meta"; |
|||
std::string pkgXmlFileName = pkgMetaDir + "/package.xml"; |
|||
cmGeneratedFileStream pkgXml(pkgXmlFileName.data()); |
|||
|
|||
// Check IFW version for component
|
|||
std::string macroPrefix = "CPACK_IFW_COMPONENT_" |
|||
+ cmsys::SystemTools::UpperCase(compIt->second.Name); |
|||
|
|||
pkgXml << "<?xml version=\"1.0\"?>" << std::endl; |
|||
pkgXml << "<Package>" << std::endl; |
|||
pkgXml << " <DisplayName>" << compIt->second.DisplayName |
|||
<< "</DisplayName>" << std::endl; |
|||
pkgXml << " <Description>" << compIt->second.Description |
|||
<< "</Description>" << std::endl; |
|||
pkgXml << " <Name>" << ifwCompId << "</Name>" << std::endl; |
|||
|
|||
// Version
|
|||
const char* ifwPackageVersion = this->GetOption("CPACK_PACKAGE_VERSION"); |
|||
const char* ifwCompVersion = |
|||
this->GetOption(macroPrefix + "_VERSION"); |
|||
pkgXml << " <Version>" |
|||
<< (ifwCompVersion ? ifwCompVersion : ifwPackageVersion) |
|||
<< "</Version>" << std::endl; |
|||
|
|||
pkgXml << " <ReleaseDate>" << IfwCreateCurrentDate() |
|||
<< "</ReleaseDate>" << std::endl; |
|||
|
|||
// Script
|
|||
const char* ifwCompScript = |
|||
this->GetOption(macroPrefix + "_SCRIPT"); |
|||
if (ifwCompScript) |
|||
{ |
|||
// Copy file
|
|||
std::string ifwCompScriptFile = pkgMetaDir + "/operations.qs"; |
|||
cmsys::SystemTools::CopyFileIfDifferent(ifwCompScript, |
|||
ifwCompScriptFile.data()); |
|||
pkgXml << " <Script>" << "operations.qs" << "</Script>" << std::endl; |
|||
} |
|||
|
|||
// Check dependencies
|
|||
std::set<std::string> compDepSet; |
|||
// CMake dependencies
|
|||
if (!compIt->second.Dependencies.empty()) |
|||
{ |
|||
std::vector<cmCPackComponent *>::iterator depCompIt; |
|||
for(depCompIt = compIt->second.Dependencies.begin(); |
|||
depCompIt != compIt->second.Dependencies.end(); |
|||
++depCompIt) |
|||
{ |
|||
compDepSet.insert(IfwGetComponentId(*depCompIt)); |
|||
} |
|||
} |
|||
// QtIFW dependencies
|
|||
if(const char *ifwCompDepsStr = this->GetOption(macroPrefix + "_DEPENDS")) |
|||
{ |
|||
std::vector<std::string> ifwCompDepsVector; |
|||
cmSystemTools::ExpandListArgument(ifwCompDepsStr, |
|||
ifwCompDepsVector); |
|||
for(std::vector<std::string>::iterator |
|||
depCompIt = ifwCompDepsVector.begin(); |
|||
depCompIt != ifwCompDepsVector.end(); ++depCompIt) |
|||
{ |
|||
compDepSet.insert(*depCompIt); |
|||
ifwDependsComponents.insert(*depCompIt); |
|||
} |
|||
} |
|||
|
|||
// Write dependencies
|
|||
if (!compDepSet.empty()) |
|||
{ |
|||
pkgXml << " <Dependencies>"; |
|||
std::set<std::string>::iterator it = compDepSet.begin(); |
|||
pkgXml << *it; |
|||
++it; |
|||
while(it != compDepSet.end()) |
|||
{ |
|||
pkgXml << "," << *it; |
|||
++it; |
|||
} |
|||
pkgXml << "</Dependencies>" << std::endl; |
|||
} |
|||
|
|||
// Licenses
|
|||
std::vector<std::string> licenses; |
|||
if(IfwParseLicenses(licenses, macroPrefix + "_LICENSES", pkgMetaDir)) |
|||
{ |
|||
pkgXml << " <Licenses>" << std::endl; |
|||
for(size_t i = 0; i < licenses.size(); i += 2) |
|||
{ |
|||
pkgXml << " <License " |
|||
<< "name=\"" << licenses[i] << "\" " |
|||
<< "file=\"" << licenses[i + 1] << "\" " |
|||
<< "/>" <<std::endl; |
|||
} |
|||
pkgXml << " </Licenses>" << std::endl; |
|||
} |
|||
|
|||
// TODO: Check how enable virtual component (now it's allways disabled)
|
|||
if (compIt->second.IsRequired) { |
|||
pkgXml << " <ForcedInstallation>true</ForcedInstallation>" |
|||
<< std::endl; |
|||
} else if (compIt->second.IsDisabledByDefault) { |
|||
pkgXml << " <Default>false</Default>" << std::endl; |
|||
} else if (compIt->second.IsHidden) { |
|||
pkgXml << " <Virtual>true</Virtual>" << std::endl; |
|||
} else { |
|||
pkgXml << " <Default>true</Default>" << std::endl; |
|||
} |
|||
|
|||
// Priority
|
|||
if(const char* ifwCompPriority = |
|||
this->GetOption(macroPrefix + "_PRIORITY")) |
|||
{ |
|||
pkgXml << " <SortingPriority>" << ifwCompPriority |
|||
<< "</SortingPriority>" << std::endl; |
|||
} |
|||
|
|||
pkgXml << "</Package>" << std::endl; |
|||
|
|||
// Downloaded
|
|||
if (compIt->second.IsDownloaded) |
|||
{ |
|||
if (!ifwDownloadedComponents.empty()) ifwDownloadedComponents += ","; |
|||
ifwDownloadedComponents += ifwCompId; |
|||
} |
|||
else |
|||
{ |
|||
if (!ifwBinaryComponents.empty()) ifwBinaryComponents += ","; |
|||
ifwBinaryComponents += ifwCompId; |
|||
} |
|||
} |
|||
|
|||
// Run repogen
|
|||
if (!ifwDownloadSite.empty()) |
|||
{ |
|||
std::string ifwCmd = ifwRepoGen; |
|||
ifwCmd += " -c " + this->toplevel + "/config/config.xml"; |
|||
ifwCmd += " -p " + this->toplevel + "/packages"; |
|||
|
|||
if(!ifwPkgsDirsVector.empty()) |
|||
{ |
|||
for(std::vector<std::string>::iterator it = ifwPkgsDirsVector.begin(); |
|||
it != ifwPkgsDirsVector.end(); ++it) |
|||
{ |
|||
ifwCmd += " -p " + *it; |
|||
} |
|||
} |
|||
|
|||
if (!ifwOnlineOnly && !ifwDownloadedComponents.empty()) { |
|||
ifwCmd += " -i " + ifwDownloadedComponents; |
|||
} |
|||
ifwCmd += " " + this->toplevel + "/repository"; |
|||
cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Execute: " << ifwCmd |
|||
<< std::endl); |
|||
std::string output; |
|||
int retVal = 1; |
|||
cmCPackLogger(cmCPackLog::LOG_OUTPUT, |
|||
"- Generate repository" << std::endl); |
|||
bool res = cmSystemTools::RunSingleCommand( |
|||
ifwCmd.c_str(), &output, &retVal, 0, this->GeneratorVerbose, 0); |
|||
if ( !res || retVal ) |
|||
{ |
|||
cmGeneratedFileStream ofs(ifwTmpFile.c_str()); |
|||
ofs << "# Run command: " << ifwCmd << std::endl |
|||
<< "# Output:" << std::endl |
|||
<< output << std::endl; |
|||
cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running IFW command: " |
|||
<< ifwCmd << std::endl |
|||
<< "Please check " << ifwTmpFile << " for errors" |
|||
<< std::endl); |
|||
return 0; |
|||
} |
|||
} |
|||
|
|||
// Run binary creator
|
|||
{ |
|||
std::string ifwCmd = ifwBinCreator; |
|||
ifwCmd += " -c " + this->toplevel + "/config/config.xml"; |
|||
ifwCmd += " -p " + this->toplevel + "/packages"; |
|||
|
|||
if(!ifwPkgsDirsVector.empty()) |
|||
{ |
|||
for(std::vector<std::string>::iterator it = ifwPkgsDirsVector.begin(); |
|||
it != ifwPkgsDirsVector.end(); ++it) |
|||
{ |
|||
ifwCmd += " -p " + *it; |
|||
} |
|||
} |
|||
|
|||
if (ifwOnlineOnly) |
|||
{ |
|||
ifwCmd += " --online-only"; |
|||
} |
|||
else if (!ifwDownloadedComponents.empty() && !ifwDownloadSite.empty()) |
|||
{ |
|||
ifwCmd += " -e " + ifwDownloadedComponents; |
|||
} |
|||
else if (!ifwDependsComponents.empty()) |
|||
{ |
|||
ifwCmd += " -i "; |
|||
std::set<std::string>::iterator it = ifwDependsComponents.begin(); |
|||
ifwCmd += *it; |
|||
++it; |
|||
while(it != ifwDependsComponents.end()) |
|||
{ |
|||
ifwCmd += "," + (*it); |
|||
++it; |
|||
} |
|||
|
|||
ifwCmd += "," + ifwBinaryComponents; |
|||
} |
|||
// TODO: set correct name for multipackages
|
|||
if (this->packageFileNames.size() > 0) |
|||
{ |
|||
ifwCmd += " " + packageFileNames[0]; |
|||
} |
|||
else |
|||
{ |
|||
ifwCmd += " installer"; |
|||
} |
|||
cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Execute: " << ifwCmd |
|||
<< std::endl); |
|||
std::string output; |
|||
int retVal = 1; |
|||
cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- Generate package" << std::endl); |
|||
bool res = cmSystemTools::RunSingleCommand( |
|||
ifwCmd.c_str(), &output, &retVal, 0, this->GeneratorVerbose, 0); |
|||
if ( !res || retVal ) |
|||
{ |
|||
cmGeneratedFileStream ofs(ifwTmpFile.c_str()); |
|||
ofs << "# Run command: " << ifwCmd << std::endl |
|||
<< "# Output:" << std::endl |
|||
<< output << std::endl; |
|||
cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running IFW command: " |
|||
<< ifwCmd << std::endl |
|||
<< "Please check " << ifwTmpFile << " for errors" |
|||
<< std::endl); |
|||
return 0; |
|||
} |
|||
} |
|||
|
|||
return 1; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
const char *cmCPackIFWGenerator::GetPackagingInstallPrefix() |
|||
{ |
|||
const char *defPrefix = cmCPackGenerator::GetPackagingInstallPrefix(); |
|||
|
|||
std::string tmpPref = defPrefix ? defPrefix : ""; |
|||
|
|||
if(this->Components.empty()) |
|||
{ |
|||
tmpPref += "packages/root/data"; |
|||
} |
|||
|
|||
this->SetOption("CPACK_IFW_PACKAGING_INSTALL_PREFIX", tmpPref.c_str()); |
|||
|
|||
return this->GetOption("CPACK_IFW_PACKAGING_INSTALL_PREFIX"); |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
const char *cmCPackIFWGenerator::GetOutputExtension() |
|||
{ |
|||
const char *suffix = this->GetOption("CMAKE_EXECUTABLE_SUFFIX"); |
|||
return suffix ? suffix : ""; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
std::string cmCPackIFWGenerator::IfwGetGroupId(cmCPackComponentGroup *group) |
|||
{ |
|||
std::string ifwGroupId; |
|||
std::string ifwGroupName; |
|||
std::list<cmCPackComponentGroup*> groups; |
|||
while(group) |
|||
{ |
|||
groups.push_front(group); |
|||
group = group->ParentGroup; |
|||
} |
|||
std::list<cmCPackComponentGroup*>::iterator it = groups.begin(); |
|||
if(it != groups.end()) |
|||
{ |
|||
ifwGroupId = IfwGetGroupName(*it); |
|||
++it; |
|||
} |
|||
while(it != groups.end()) |
|||
{ |
|||
ifwGroupName = IfwGetGroupName(*it); |
|||
|
|||
if(ifwResolveDuplicateNames) |
|||
{ |
|||
if(ifwGroupName.substr(0, ifwGroupId.size()) == ifwGroupId) |
|||
{ |
|||
ifwGroupId = ifwGroupName; |
|||
++it; |
|||
continue; |
|||
} |
|||
} |
|||
|
|||
ifwGroupId += "." + ifwGroupName; |
|||
|
|||
++it; |
|||
} |
|||
|
|||
return ifwGroupId; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
std::string cmCPackIFWGenerator::IfwGetComponentId(cmCPackComponent *component) |
|||
{ |
|||
std::string ifwCompId; |
|||
if(component) { |
|||
ifwCompId = IfwGetGroupId(component->Group); |
|||
if(!ifwCompId.empty()) ifwCompId += "."; |
|||
std::string ifwCompName = IfwGetComponentName(component); |
|||
if(ifwResolveDuplicateNames && |
|||
(ifwCompName.substr(0, ifwCompId.size()) == ifwCompId)) |
|||
{ |
|||
ifwCompId = ifwCompName; |
|||
} |
|||
else |
|||
{ |
|||
ifwCompId += ifwCompName; |
|||
} |
|||
} |
|||
return ifwCompId; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
std::string cmCPackIFWGenerator::IfwGetGroupName(cmCPackComponentGroup *group) |
|||
{ |
|||
std::string ifwGroupName = group->Name; |
|||
if(const char* name = |
|||
this->GetOption("CPACK_IFW_COMPONENT_GROUP_" |
|||
+ cmsys::SystemTools::UpperCase(group->Name) + "_NAME")) |
|||
{ |
|||
ifwGroupName = name; |
|||
} |
|||
return ifwGroupName; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
std::string |
|||
cmCPackIFWGenerator::IfwGetComponentName(cmCPackComponent *component) |
|||
{ |
|||
return IfwGetComponentName(component->Name); |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
std::string |
|||
cmCPackIFWGenerator::IfwGetComponentName(const std::string &componentName) |
|||
{ |
|||
std::string ifwCompName = componentName; |
|||
if(const char* name = |
|||
this->GetOption("CPACK_IFW_COMPONENT_" |
|||
+ cmsys::SystemTools::UpperCase(componentName) + "_NAME")) |
|||
{ |
|||
ifwCompName = name; |
|||
} |
|||
return ifwCompName; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
int cmCPackIFWGenerator::InitializeInternal() |
|||
{ |
|||
// Search Qt Installer Framework tools
|
|||
|
|||
if(!this->IsOn("CPACK_IFW_BINARYCREATOR_EXECUTABLE_FOUND") || |
|||
!this->IsOn("CPACK_IFW_REPOGEN_EXECUTABLE_FOUND")) |
|||
{ |
|||
this->ReadListFile("CPackIFW.cmake"); |
|||
} |
|||
|
|||
// Look 'binarycreator' executable (needs)
|
|||
|
|||
if(this->IsOn("CPACK_IFW_BINARYCREATOR_EXECUTABLE_FOUND")) |
|||
{ |
|||
const char *ifwBinCreatorStr = |
|||
this->GetOption("CPACK_IFW_BINARYCREATOR_EXECUTABLE"); |
|||
ifwBinCreator = ifwBinCreatorStr ? ifwBinCreatorStr : ""; |
|||
} |
|||
else |
|||
{ |
|||
ifwBinCreator = ""; |
|||
} |
|||
|
|||
if (ifwBinCreator.empty()) |
|||
{ |
|||
cmCPackLogger(cmCPackLog::LOG_ERROR, |
|||
"Cannot find QtIFW compiler \"binarycreator\": " |
|||
"likely it is not installed, or not in your PATH" |
|||
<< std::endl); |
|||
return 0; |
|||
} |
|||
|
|||
// Look 'repogen' executable (optional)
|
|||
|
|||
if(this->IsOn("CPACK_IFW_REPOGEN_EXECUTABLE_FOUND")) |
|||
{ |
|||
const char *ifwRepoGenStr = |
|||
this->GetOption("CPACK_IFW_REPOGEN_EXECUTABLE"); |
|||
ifwRepoGen = ifwRepoGenStr ? ifwRepoGenStr : ""; |
|||
} |
|||
else |
|||
{ |
|||
ifwRepoGen = ""; |
|||
} |
|||
|
|||
// // Variables that Change Behavior
|
|||
|
|||
// Resolve duplicate names
|
|||
ifwResolveDuplicateNames = this->IsOn("CPACK_IFW_RESOLVE_DUPLICATE_NAMES"); |
|||
|
|||
// Additional packages dirs
|
|||
ifwPkgsDirsVector.clear(); |
|||
if(const char* dirs = this->GetOption("CPACK_IFW_PACKAGES_DIRECTORIES")) |
|||
{ |
|||
cmSystemTools::ExpandListArgument(dirs, |
|||
ifwPkgsDirsVector); |
|||
} |
|||
|
|||
// Remote repository
|
|||
|
|||
if (const char *site = this->GetOption("CPACK_DOWNLOAD_SITE")) |
|||
{ |
|||
ifwDownloadSite = site; |
|||
} |
|||
|
|||
ifwOnlineOnly = this->IsOn("CPACK_DOWNLOAD_ALL") ? true : false; |
|||
|
|||
if (!ifwDownloadSite.empty() && ifwRepoGen.empty()) { |
|||
cmCPackLogger(cmCPackLog::LOG_ERROR, |
|||
"Cannot find QtIFW repository generator \"repogen\": " |
|||
"likely it is not installed, or not in your PATH" |
|||
<< std::endl); |
|||
return 0; |
|||
} |
|||
|
|||
return this->Superclass::InitializeInternal(); |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
std::string |
|||
cmCPackIFWGenerator::GetComponentInstallDirNamePrefix( |
|||
const std::string& /*componentName*/) |
|||
{ |
|||
return "packages/"; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
std::string |
|||
cmCPackIFWGenerator::GetComponentInstallDirNameSuffix( |
|||
const std::string& componentName) |
|||
{ |
|||
std::map<std::string, cmCPackComponent>::iterator |
|||
compIt = this->Components.find(componentName); |
|||
|
|||
cmCPackComponent *comp = |
|||
compIt != this->Components.end() ? &compIt->second : 0; |
|||
|
|||
const std::string prefix = GetComponentInstallDirNamePrefix(componentName); |
|||
const std::string suffix = "/data"; |
|||
|
|||
if (componentPackageMethod == ONE_PACKAGE_PER_COMPONENT) { |
|||
return prefix + IfwGetComponentId(comp) + suffix; |
|||
} |
|||
|
|||
if (componentPackageMethod == ONE_PACKAGE) { |
|||
return std::string(prefix + "ALL_COMPONENTS_IN_ONE" + suffix); |
|||
} |
|||
|
|||
return prefix + IfwGetComponentId(comp) + suffix; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
bool cmCPackIFWGenerator::GetListOfSubdirectories( |
|||
const char* topdir, std::vector<std::string>& dirs) |
|||
{ |
|||
cmsys::Directory dir; |
|||
dir.Load(topdir); |
|||
size_t fileNum; |
|||
for (fileNum = 0; fileNum < dir.GetNumberOfFiles(); ++fileNum) |
|||
{ |
|||
if (strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)),".") && |
|||
strcmp(dir.GetFile(static_cast<unsigned long>(fileNum)),"..")) |
|||
{ |
|||
cmsys_stl::string fullPath = topdir; |
|||
fullPath += "/"; |
|||
fullPath += dir.GetFile(static_cast<unsigned long>(fileNum)); |
|||
if(cmsys::SystemTools::FileIsDirectory(fullPath.c_str()) && |
|||
!cmsys::SystemTools::FileIsSymlink(fullPath.c_str())) |
|||
{ |
|||
if (!this->GetListOfSubdirectories(fullPath.c_str(), dirs)) |
|||
{ |
|||
return false; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
dirs.push_back(topdir); |
|||
return true; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
enum cmCPackGenerator::CPackSetDestdirSupport |
|||
cmCPackIFWGenerator::SupportsSetDestdir() const |
|||
{ |
|||
return cmCPackGenerator::SETDESTDIR_SHOULD_NOT_BE_USED; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
bool cmCPackIFWGenerator::SupportsAbsoluteDestination() const |
|||
{ |
|||
return false; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
bool cmCPackIFWGenerator::SupportsComponentInstallation() const |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
int cmCPackIFWGenerator::IfwCreateConfigFile() |
|||
{ |
|||
cmGeneratedFileStream cfg((this->toplevel + "/config/config.xml").data()); |
|||
|
|||
std::string ifwPkgName; |
|||
if (const char *name = this->GetOption("CPACK_PACKAGE_NAME")) |
|||
{ |
|||
ifwPkgName = name; |
|||
} |
|||
else |
|||
{ |
|||
ifwPkgName = "Your package"; |
|||
} |
|||
|
|||
std::string ifwPkgDescription; |
|||
if (const char *name = this->GetOption("CPACK_PACKAGE_DESCRIPTION_SUMMARY")) |
|||
{ |
|||
ifwPkgDescription = name; |
|||
} |
|||
else |
|||
{ |
|||
ifwPkgDescription = "Your package description"; |
|||
} |
|||
|
|||
std::string ifwPkgVersion; |
|||
if (const char *version = this->GetOption("CPACK_PACKAGE_VERSION")) |
|||
{ |
|||
ifwPkgVersion = version; |
|||
} |
|||
else |
|||
{ |
|||
ifwPkgVersion = "1.0.0"; |
|||
} |
|||
|
|||
const char *ifwPkgInstDir = |
|||
this->GetOption("CPACK_PACKAGE_INSTALL_DIRECTORY"); |
|||
const char *ifwTargetDir = |
|||
this->GetOption("CPACK_IFW_TARGET_DIRECTORY"); |
|||
const char *ifwAdminTargetDir = |
|||
this->GetOption("CPACK_IFW_ADMIN_TARGET_DIRECTORY"); |
|||
|
|||
cfg << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl; |
|||
cfg << "<Installer>" << std::endl; |
|||
cfg << " <Name>" << cmXMLSafe(ifwPkgName).str() << "</Name>" << std::endl; |
|||
cfg << " <Version>" << ifwPkgVersion << "</Version>" << std::endl; |
|||
cfg << " <Title>" << cmXMLSafe(ifwPkgDescription).str() << "</Title>" |
|||
<< std::endl; |
|||
|
|||
// Default target directory for installation
|
|||
if (ifwTargetDir) |
|||
{ |
|||
cfg << " <TargetDir>" << ifwTargetDir << "</TargetDir>" << std::endl; |
|||
} |
|||
else if (ifwPkgInstDir) |
|||
{ |
|||
cfg << " <TargetDir>@ApplicationsDir@/" << ifwPkgInstDir |
|||
<< "</TargetDir>" << std::endl; |
|||
} |
|||
else |
|||
{ |
|||
cfg << " <TargetDir>@RootDir@/usr/local</TargetDir>" << std::endl; |
|||
} |
|||
|
|||
// Default target directory for installation with administrator rights
|
|||
if (ifwAdminTargetDir) |
|||
{ |
|||
cfg << " <AdminTargetDir>" << ifwAdminTargetDir |
|||
<< "</AdminTargetDir>" << std::endl; |
|||
} |
|||
|
|||
if (!ifwDownloadSite.empty()) |
|||
{ |
|||
cfg << " <RemoteRepositories>" << std::endl; |
|||
cfg << " <Repository>" << std::endl; |
|||
cfg << " <Url>" << ifwDownloadSite << "</Url>" << std::endl; |
|||
// These properties can now be set from "cpack_configure_downloads"
|
|||
// <Enabled>1</Enabled>
|
|||
// <Username>user</Username>
|
|||
// <Password>password</Password>
|
|||
// <DisplayName>Example repository</DisplayName>
|
|||
cfg << " </Repository>" << std::endl; |
|||
cfg << " </RemoteRepositories>" << std::endl; |
|||
} |
|||
|
|||
// CPack IFW default policy
|
|||
cfg << " <!-- CPack IFW default policy -->" << std::endl; |
|||
cfg << " <AllowNonAsciiCharacters>true</AllowNonAsciiCharacters>" |
|||
<< std::endl; |
|||
cfg << " <AllowSpaceInPath>true</AllowSpaceInPath>" << std::endl; |
|||
|
|||
cfg << "</Installer>" << std::endl; |
|||
|
|||
return 1; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
// Create default package file
|
|||
int cmCPackIFWGenerator::IfwCreatePackageFile() |
|||
{ |
|||
std::string ifwPkgName; |
|||
if (const char *name = this->GetOption("CPACK_PACKAGE_NAME")) |
|||
{ |
|||
ifwPkgName = name; |
|||
} |
|||
else |
|||
{ |
|||
ifwPkgName = "Your package"; |
|||
} |
|||
|
|||
std::string ifwPkgDescription; |
|||
if (const char *name = this->GetOption("CPACK_PACKAGE_DESCRIPTION_SUMMARY")) |
|||
{ |
|||
ifwPkgDescription = name; |
|||
} |
|||
else |
|||
{ |
|||
ifwPkgDescription = "Your package description"; |
|||
} |
|||
|
|||
cmGeneratedFileStream |
|||
pkgXml((this->toplevel + "/packages/root/meta/package.xml").data()); |
|||
pkgXml << "<?xml version=\"1.0\"?>" << std::endl; |
|||
pkgXml << "<Package>" << std::endl; |
|||
|
|||
pkgXml << " <DisplayName>" << ifwPkgName << "</DisplayName>" << std::endl; |
|||
pkgXml << " <Description>" << ifwPkgDescription |
|||
<< "</Description>" << std::endl; |
|||
pkgXml << " <Name>" << "root" << "</Name>" << std::endl; |
|||
pkgXml << " <Version>" << this->GetOption("CPACK_PACKAGE_VERSION") |
|||
<< "</Version>" << std::endl; |
|||
pkgXml << " <ReleaseDate>" << IfwCreateCurrentDate() << "</ReleaseDate>" |
|||
<< std::endl; |
|||
|
|||
pkgXml << " <ForcedInstallation>true</ForcedInstallation>" << std::endl; |
|||
pkgXml << " <Default>true</Default>" << std::endl; |
|||
|
|||
pkgXml << "</Package>" << std::endl; |
|||
|
|||
return 1; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
std::string cmCPackIFWGenerator::IfwCreateCurrentDate() |
|||
{ |
|||
time_t rawtime; |
|||
struct tm * timeinfo; |
|||
char buffer[80]; |
|||
|
|||
time (&rawtime); |
|||
timeinfo = localtime(&rawtime); |
|||
|
|||
strftime(buffer, 80, "%Y-%m-%d", timeinfo); |
|||
|
|||
return buffer; |
|||
} |
|||
|
|||
//----------------------------------------------------------------------
|
|||
bool cmCPackIFWGenerator::IfwParseLicenses(std::vector<std::string> &licenses, |
|||
const std::string &variable, |
|||
const std::string &metaDir) |
|||
{ |
|||
if (const char *option = this->GetOption(variable)) |
|||
{ |
|||
if(!licenses.empty()) licenses.clear(); |
|||
cmSystemTools::ExpandListArgument( option, licenses ); |
|||
} |
|||
else |
|||
{ |
|||
return false; |
|||
} |
|||
|
|||
if ( licenses.size() % 2 != 0 ) |
|||
{ |
|||
cmCPackLogger(cmCPackLog::LOG_ERROR, variable |
|||
<< " should contain pairs of <display_name> and <file_path>." |
|||
<< std::endl); |
|||
return false; |
|||
} |
|||
|
|||
for(size_t i = 1; i < licenses.size(); i += 2) |
|||
{ |
|||
std::string name = cmSystemTools::GetFilenameName(licenses[i]); |
|||
std::string path = metaDir + "/" + name; |
|||
cmsys::SystemTools::CopyFileIfDifferent(licenses[i].data(), path.data()); |
|||
licenses[i] = name; |
|||
} |
|||
|
|||
return licenses.size() > 1; |
|||
} |
@ -0,0 +1,82 @@ |
|||
/*============================================================================ |
|||
CMake - Cross Platform Makefile Generator |
|||
Copyright 2000-2009 Kitware, Inc. |
|||
|
|||
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 cmCPackIFWGenerator_h |
|||
#define cmCPackIFWGenerator_h |
|||
|
|||
|
|||
#include "cmCPackGenerator.h" |
|||
#include <set> |
|||
|
|||
/** \class cmCPackIFWGenerator |
|||
* \brief A generator for Qt Installer Framework tools |
|||
* |
|||
* http://qt-project.org/doc/qtinstallerframework/index.html |
|||
*/ |
|||
class cmCPackIFWGenerator : public cmCPackGenerator |
|||
{ |
|||
public: |
|||
cmCPackTypeMacro(cmCPackIFWGenerator, cmCPackGenerator); |
|||
|
|||
/** |
|||
* Construct generator |
|||
*/ |
|||
cmCPackIFWGenerator(); |
|||
virtual ~cmCPackIFWGenerator(); |
|||
|
|||
protected: |
|||
virtual int InitializeInternal(); |
|||
virtual int PackageFiles(); |
|||
virtual const char* GetPackagingInstallPrefix(); |
|||
|
|||
virtual const char* GetOutputExtension(); |
|||
|
|||
std::string IfwGetGroupId(cmCPackComponentGroup *group); |
|||
std::string IfwGetComponentId(cmCPackComponent *component); |
|||
|
|||
std::string IfwGetGroupName(cmCPackComponentGroup *group); |
|||
|
|||
std::string IfwGetComponentName(cmCPackComponent *component); |
|||
std::string IfwGetComponentName(const std::string &componentName); |
|||
|
|||
virtual std::string GetComponentInstallDirNamePrefix( |
|||
const std::string& componentName); |
|||
|
|||
virtual std::string GetComponentInstallDirNameSuffix( |
|||
const std::string& componentName); |
|||
|
|||
bool GetListOfSubdirectories(const char* dir, |
|||
std::vector<std::string>& dirs); |
|||
|
|||
enum cmCPackGenerator::CPackSetDestdirSupport SupportsSetDestdir() const; |
|||
virtual bool SupportsAbsoluteDestination() const; |
|||
virtual bool SupportsComponentInstallation() const; |
|||
|
|||
private: |
|||
int IfwCreateConfigFile(); |
|||
int IfwCreatePackageFile(); |
|||
std::string IfwCreateCurrentDate(); |
|||
bool IfwParseLicenses(std::vector<std::string> &licenses, |
|||
const std::string &variable, |
|||
const std::string &metaDir); |
|||
|
|||
std::string ifwRepoGen; |
|||
std::string ifwBinCreator; |
|||
|
|||
std::string ifwDownloadSite; |
|||
|
|||
bool ifwOnlineOnly; |
|||
bool ifwResolveDuplicateNames; |
|||
std::vector<std::string> ifwPkgsDirsVector; |
|||
}; |
|||
|
|||
#endif |
@ -0,0 +1,7 @@ |
|||
<html> |
|||
<head> |
|||
<meta http-equiv="Refresh" content="0; url=http://cmake.org/" /> |
|||
</head> |
|||
<body> |
|||
</body> |
|||
</html> |
@ -0,0 +1,24 @@ |
|||
function Component() |
|||
{ |
|||
// default constructor |
|||
} |
|||
|
|||
Component.prototype.createOperations = function() |
|||
{ |
|||
// call default implementation to actually install applications! |
|||
component.createOperations(); |
|||
|
|||
// Create shortcut |
|||
if (installer.value("os") === "win") { |
|||
|
|||
@_CPACK_IFW_SHORTCUT_OPTIONAL@ |
|||
|
|||
component.addOperation("CreateShortcut", |
|||
installer.value("TargetDir") + "/cmake.org.html", |
|||
installer.value("StartMenuDir") + "/CMake Web Site.lnk"); |
|||
|
|||
component.addOperation("CreateShortcut", |
|||
installer.value("TargetDir") + "/uninstall.exe", |
|||
installer.value("StartMenuDir") + "/Uninstall.lnk"); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue