Imported Upstream version 3.21.4
[platform/upstream/cmake.git] / Modules / CPackIFW.cmake
1 # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
3
4 #[=======================================================================[.rst:
5 CPackIFW
6 --------
7
8 .. versionadded:: 3.1
9
10 This module looks for the location of the command-line utilities supplied with the
11 `Qt Installer Framework <http://doc.qt.io/qtinstallerframework/index.html>`_
12 (QtIFW).
13
14 The module also defines several commands to control the behavior of the
15 :cpack_gen:`CPack IFW Generator`.
16
17 Commands
18 ^^^^^^^^
19
20 The module defines the following commands:
21
22 .. command:: cpack_ifw_configure_component
23
24   Sets the arguments specific to the CPack IFW generator.
25
26   ::
27
28     cpack_ifw_configure_component(<compname> [COMMON] [ESSENTIAL] [VIRTUAL]
29                         [FORCED_INSTALLATION] [REQUIRES_ADMIN_RIGHTS]
30                         [NAME <name>]
31                         [DISPLAY_NAME <display_name>] # Note: Internationalization supported
32                         [DESCRIPTION <description>] # Note: Internationalization supported
33                         [UPDATE_TEXT <update_text>]
34                         [VERSION <version>]
35                         [RELEASE_DATE <release_date>]
36                         [SCRIPT <script>]
37                         [PRIORITY|SORTING_PRIORITY <sorting_priority>] # Note: PRIORITY is deprecated
38                         [DEPENDS|DEPENDENCIES <com_id> ...]
39                         [AUTO_DEPEND_ON <comp_id> ...]
40                         [LICENSES <display_name> <file_path> ...]
41                         [DEFAULT <value>]
42                         [USER_INTERFACES <file_path> <file_path> ...]
43                         [TRANSLATIONS <file_path> <file_path> ...]
44                         [REPLACES <comp_id> ...]
45                         [CHECKABLE <value>])
46
47   This command should be called after :command:`cpack_add_component` command.
48
49   ``COMMON``
50     if set, then the component will be packaged and installed as part
51     of a group to which it belongs.
52
53   ``ESSENTIAL``
54     .. versionadded:: 3.6
55
56     if set, then the package manager stays disabled until that
57     component is updated.
58
59   ``VIRTUAL``
60     .. versionadded:: 3.8
61
62     if set, then the component will be hidden from the installer.
63     It is a equivalent of the ``HIDDEN`` option from the
64     :command:`cpack_add_component` command.
65
66   ``FORCED_INSTALLATION``
67     .. versionadded:: 3.8
68
69     if set, then the component must always be installed.
70     It is a equivalent of the ``REQUIRED`` option from the
71     :command:`cpack_add_component` command.
72
73   ``REQUIRES_ADMIN_RIGHTS``
74     .. versionadded:: 3.8
75
76     set it if the component needs to be installed with elevated permissions.
77
78   ``NAME``
79     is used to create domain-like identification for this component.
80     By default used origin component name.
81
82   ``DISPLAY_NAME``
83     .. versionadded:: 3.8
84
85     set to rewrite original name configured by
86     :command:`cpack_add_component` command.
87
88   ``DESCRIPTION``
89     .. versionadded:: 3.8
90
91     set to rewrite original description configured by
92     :command:`cpack_add_component` command.
93
94   ``UPDATE_TEXT``
95     .. versionadded:: 3.8
96
97     will be added to the component description if this is an update to
98     the component.
99
100   ``VERSION``
101     is version of component.
102     By default used :variable:`CPACK_PACKAGE_VERSION`.
103
104   ``RELEASE_DATE``
105     .. versionadded:: 3.8
106
107     keep empty to auto generate.
108
109   ``SCRIPT``
110     is a relative or absolute path to operations script
111     for this component.
112
113   ``SORTING_PRIORITY``
114     .. versionadded:: 3.8
115
116     is priority of the component in the tree.
117
118   ``PRIORITY``
119     .. deprecated:: 3.8
120       Old name for ``SORTING_PRIORITY``.
121
122   ``DEPENDS``, ``DEPENDENCIES``
123     .. versionadded:: 3.8
124
125     list of dependency component or component group identifiers in
126     QtIFW style.
127
128     .. versionadded:: 3.21
129
130     Component or group names listed as dependencies may contain hyphens.
131     This requires QtIFW 3.1 or later.
132
133   ``AUTO_DEPEND_ON``
134     .. versionadded:: 3.8
135
136     list of identifiers of component or component group in QtIFW style
137     that this component has an automatic dependency on.
138
139   ``LICENSES``
140     pair of <display_name> and <file_path> of license text for this
141     component. You can specify more then one license.
142
143   ``DEFAULT``
144     .. versionadded:: 3.8
145
146     Possible values are: TRUE, FALSE, and SCRIPT.
147     Set to FALSE to disable the component in the installer or to SCRIPT
148     to resolved during runtime (don't forget add the file of the script
149     as a value of the ``SCRIPT`` option).
150
151   ``USER_INTERFACES``
152     .. versionadded:: 3.7
153
154     is a list of <file_path> ('.ui' files) representing pages to load.
155
156   ``TRANSLATIONS``
157     .. versionadded:: 3.8
158
159     is a list of <file_path> ('.qm' files) representing translations to load.
160
161   ``REPLACES``
162     .. versionadded:: 3.10
163
164     list of identifiers of component or component group to replace.
165
166   ``CHECKABLE``
167     .. versionadded:: 3.10
168
169     Possible values are: TRUE, FALSE.
170     Set to FALSE if you want to hide the checkbox for an item.
171     This is useful when only a few subcomponents should be selected
172     instead of all.
173
174
175 .. command:: cpack_ifw_configure_component_group
176
177   Sets the arguments specific to the CPack IFW generator.
178
179   ::
180
181     cpack_ifw_configure_component_group(<groupname> [VIRTUAL]
182                         [FORCED_INSTALLATION] [REQUIRES_ADMIN_RIGHTS]
183                         [NAME <name>]
184                         [DISPLAY_NAME <display_name>] # Note: Internationalization supported
185                         [DESCRIPTION <description>] # Note: Internationalization supported
186                         [UPDATE_TEXT <update_text>]
187                         [VERSION <version>]
188                         [RELEASE_DATE <release_date>]
189                         [SCRIPT <script>]
190                         [PRIORITY|SORTING_PRIORITY <sorting_priority>] # Note: PRIORITY is deprecated
191                         [DEPENDS|DEPENDENCIES <com_id> ...]
192                         [AUTO_DEPEND_ON <comp_id> ...]
193                         [LICENSES <display_name> <file_path> ...]
194                         [DEFAULT <value>]
195                         [USER_INTERFACES <file_path> <file_path> ...]
196                         [TRANSLATIONS <file_path> <file_path> ...]
197                         [REPLACES <comp_id> ...]
198                         [CHECKABLE <value>])
199
200   This command should be called after :command:`cpack_add_component_group`
201   command.
202
203   ``VIRTUAL``
204     .. versionadded:: 3.8
205
206     if set, then the group will be hidden from the installer.
207     Note that setting this on a root component does not work.
208
209   ``FORCED_INSTALLATION``
210     .. versionadded:: 3.8
211
212     if set, then the group must always be installed.
213
214   ``REQUIRES_ADMIN_RIGHTS``
215     .. versionadded:: 3.8
216
217     set it if the component group needs to be installed with elevated
218     permissions.
219
220   ``NAME``
221     is used to create domain-like identification for this component group.
222     By default used origin component group name.
223
224   ``DISPLAY_NAME``
225     .. versionadded:: 3.8
226
227     set to rewrite original name configured by
228     :command:`cpack_add_component_group` command.
229
230   ``DESCRIPTION``
231     .. versionadded:: 3.8
232
233     set to rewrite original description configured by
234     :command:`cpack_add_component_group` command.
235
236   ``UPDATE_TEXT``
237     .. versionadded:: 3.8
238
239     will be added to the component group description if this is an update to
240     the component group.
241
242   ``VERSION``
243     is version of component group.
244     By default used :variable:`CPACK_PACKAGE_VERSION`.
245
246   ``RELEASE_DATE``
247     .. versionadded:: 3.8
248
249     keep empty to auto generate.
250
251   ``SCRIPT``
252     is a relative or absolute path to operations script
253     for this component group.
254
255   ``SORTING_PRIORITY``
256     is priority of the component group in the tree.
257
258   ``PRIORITY``
259     .. deprecated:: 3.8
260       Old name for ``SORTING_PRIORITY``.
261
262   ``DEPENDS``, ``DEPENDENCIES``
263     .. versionadded:: 3.8
264
265     list of dependency component or component group identifiers in
266     QtIFW style.
267
268     .. versionadded:: 3.21
269
270     Component or group names listed as dependencies may contain hyphens.
271     This requires QtIFW 3.1 or later.
272
273   ``AUTO_DEPEND_ON``
274     .. versionadded:: 3.8
275
276     list of identifiers of component or component group in QtIFW style
277     that this component group has an automatic dependency on.
278
279   ``LICENSES``
280     pair of <display_name> and <file_path> of license text for this
281     component group. You can specify more then one license.
282
283   ``DEFAULT``
284     .. versionadded:: 3.8
285
286     Possible values are: TRUE, FALSE, and SCRIPT.
287     Set to TRUE to preselect the group in the installer
288     (this takes effect only on groups that have no visible child components)
289     or to SCRIPT to resolved during runtime (don't forget add the file of
290     the script as a value of the ``SCRIPT`` option).
291
292   ``USER_INTERFACES``
293     .. versionadded:: 3.7
294
295     is a list of <file_path> ('.ui' files) representing pages to load.
296
297   ``TRANSLATIONS``
298     .. versionadded:: 3.8
299
300     is a list of <file_path> ('.qm' files) representing translations to load.
301
302   ``REPLACES``
303     .. versionadded:: 3.10
304
305     list of identifiers of component or component group to replace.
306
307   ``CHECKABLE``
308     .. versionadded:: 3.10
309
310     Possible values are: TRUE, FALSE.
311     Set to FALSE if you want to hide the checkbox for an item.
312     This is useful when only a few subcomponents should be selected
313     instead of all.
314
315
316 .. command:: cpack_ifw_add_repository
317
318   Add QtIFW specific remote repository to binary installer.
319
320   ::
321
322     cpack_ifw_add_repository(<reponame> [DISABLED]
323                         URL <url>
324                         [USERNAME <username>]
325                         [PASSWORD <password>]
326                         [DISPLAY_NAME <display_name>])
327
328   This command will also add the <reponame> repository
329   to a variable :variable:`CPACK_IFW_REPOSITORIES_ALL`.
330
331   ``DISABLED``
332     if set, then the repository will be disabled by default.
333
334   ``URL``
335     is points to a list of available components.
336
337   ``USERNAME``
338     is used as user on a protected repository.
339
340   ``PASSWORD``
341     is password to use on a protected repository.
342
343   ``DISPLAY_NAME``
344     is string to display instead of the URL.
345
346
347 .. command:: cpack_ifw_update_repository
348
349   .. versionadded:: 3.6
350
351   Update QtIFW specific repository from remote repository.
352
353   ::
354
355     cpack_ifw_update_repository(<reponame>
356                         [[ADD|REMOVE] URL <url>]|
357                          [REPLACE OLD_URL <old_url> NEW_URL <new_url>]]
358                         [USERNAME <username>]
359                         [PASSWORD <password>]
360                         [DISPLAY_NAME <display_name>])
361
362   This command will also add the <reponame> repository
363   to a variable :variable:`CPACK_IFW_REPOSITORIES_ALL`.
364
365   ``URL``
366     is points to a list of available components.
367
368   ``OLD_URL``
369     is points to a list that will replaced.
370
371   ``NEW_URL``
372     is points to a list that will replace to.
373
374   ``USERNAME``
375     is used as user on a protected repository.
376
377   ``PASSWORD``
378     is password to use on a protected repository.
379
380   ``DISPLAY_NAME``
381     is string to display instead of the URL.
382
383
384 .. command:: cpack_ifw_add_package_resources
385
386   .. versionadded:: 3.7
387
388   Add additional resources in the installer binary.
389
390   ::
391
392     cpack_ifw_add_package_resources(<file_path> <file_path> ...)
393
394   This command will also add the specified files
395   to a variable :variable:`CPACK_IFW_PACKAGE_RESOURCES`.
396
397 #]=======================================================================]
398
399 # TODO:
400 # All of the internal implementation CMake modules for other CPack generators
401 # have been moved into the Internal/CPack directory. This one has not, because
402 # it contains user-facing macros which would be lost if it were moved. At some
403 # point, this module should be split into user-facing macros (which would live
404 # in this module) and internal implementation details (which would live in
405 # Internal/CPack/CPackIFW.cmake).
406
407 #=============================================================================
408 # Search Qt Installer Framework tools
409 #=============================================================================
410
411 # Default path
412
413 foreach(_CPACK_IFW_PATH_VAR "CPACK_IFW_ROOT" "QTIFWDIR" "QTDIR")
414   if(DEFINED ${_CPACK_IFW_PATH_VAR}
415     AND NOT "${${_CPACK_IFW_PATH_VAR}}" STREQUAL "")
416     list(APPEND _CPACK_IFW_PATHS "${${_CPACK_IFW_PATH_VAR}}")
417   endif()
418   if(NOT "$ENV{${_CPACK_IFW_PATH_VAR}}" STREQUAL "")
419     list(APPEND _CPACK_IFW_PATHS "$ENV{${_CPACK_IFW_PATH_VAR}}")
420   endif()
421 endforeach()
422 if(WIN32)
423   list(APPEND _CPACK_IFW_PATHS
424     "$ENV{HOMEDRIVE}/Qt"
425     "C:/Qt")
426 else()
427   list(APPEND _CPACK_IFW_PATHS
428     "$ENV{HOME}/Qt"
429     "/opt/Qt")
430 endif()
431 list(REMOVE_DUPLICATES _CPACK_IFW_PATHS)
432
433 set(_CPACK_IFW_PREFIXES
434   # QtSDK
435   "Tools/QtInstallerFramework/"
436   # Second branch
437   "QtIFW"
438   # First branch
439   "QtIFW-")
440
441 set(_CPACK_IFW_VERSIONS
442   "4.1"
443   "4.0"
444   "3.2"
445   "3.2.0"
446   "3.1"
447   "3.1.0"
448   "3.0"
449   "3.0.0"
450   "2.3"
451   "2.3.0"
452   "2.2"
453   "2.2.0"
454   "2.1"
455   "2.1.0"
456   "2.0"
457   "2.0.5"
458   "2.0.3"
459   "2.0.2"
460   "2.0.1"
461   "2.0.0"
462   "1.6"
463   "1.6.0"
464   "1.5"
465   "1.5.0"
466   "1.4"
467   "1.4.0"
468   "1.3"
469   "1.3.0")
470
471 set(_CPACK_IFW_SUFFIXES "bin")
472 foreach(_CPACK_IFW_PREFIX ${_CPACK_IFW_PREFIXES})
473   foreach(_CPACK_IFW_VERSION ${_CPACK_IFW_VERSIONS})
474     list(APPEND
475       _CPACK_IFW_SUFFIXES "${_CPACK_IFW_PREFIX}${_CPACK_IFW_VERSION}/bin")
476   endforeach()
477 endforeach()
478
479 # Look for 'binarycreator'
480
481 find_program(CPACK_IFW_BINARYCREATOR_EXECUTABLE
482   NAMES binarycreator
483   PATHS ${_CPACK_IFW_PATHS}
484   PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES}
485   DOC "QtIFW binarycreator command line client")
486
487 mark_as_advanced(CPACK_IFW_BINARYCREATOR_EXECUTABLE)
488
489 # Look for 'repogen'
490
491 find_program(CPACK_IFW_REPOGEN_EXECUTABLE
492   NAMES repogen
493   PATHS ${_CPACK_IFW_PATHS}
494   PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES}
495   DOC "QtIFW repogen command line client"
496   )
497 mark_as_advanced(CPACK_IFW_REPOGEN_EXECUTABLE)
498
499 # Look for 'installerbase'
500
501 find_program(CPACK_IFW_INSTALLERBASE_EXECUTABLE
502   NAMES installerbase
503   PATHS ${_CPACK_IFW_PATHS}
504   PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES}
505   DOC "QtIFW installer executable base"
506   )
507 mark_as_advanced(CPACK_IFW_INSTALLERBASE_EXECUTABLE)
508
509 # Look for 'devtool' (appeared in the second branch)
510
511 find_program(CPACK_IFW_DEVTOOL_EXECUTABLE
512   NAMES devtool
513   PATHS ${_CPACK_IFW_PATHS}
514   PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES}
515   DOC "QtIFW devtool command line client"
516   )
517 mark_as_advanced(CPACK_IFW_DEVTOOL_EXECUTABLE)
518
519 # Look for 'archivegen'
520
521 find_program(CPACK_IFW_ARCHIVEGEN_EXECUTABLE
522   NAMES archivegen
523   PATHS ${_CPACK_IFW_PATHS}
524   PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES}
525   DOC "QtIFW archivegen command line client"
526   )
527 mark_as_advanced(CPACK_IFW_ARCHIVEGEN_EXECUTABLE)
528
529 #
530 ## Next code is included only once
531 #
532
533 if(NOT CPackIFW_CMake_INCLUDED)
534 set(CPackIFW_CMake_INCLUDED 1)
535
536 #=============================================================================
537 # Framework version
538 #=============================================================================
539
540 set(CPACK_IFW_FRAMEWORK_VERSION_FORCED ""
541   CACHE STRING "The forced version of used QtIFW tools")
542 mark_as_advanced(CPACK_IFW_FRAMEWORK_VERSION_FORCED)
543 set(CPACK_IFW_FRAMEWORK_VERSION_TIMEOUT 1
544   CACHE STRING "The timeout to return QtIFW framework version string from \"installerbase\" executable")
545 mark_as_advanced(CPACK_IFW_FRAMEWORK_VERSION_TIMEOUT)
546 if(CPACK_IFW_INSTALLERBASE_EXECUTABLE AND NOT CPACK_IFW_FRAMEWORK_VERSION_FORCED)
547   set(CPACK_IFW_FRAMEWORK_VERSION)
548   # Invoke version from "installerbase" executable
549   foreach(_ifw_version_argument --version --framework-version)
550     if(NOT CPACK_IFW_FRAMEWORK_VERSION)
551       execute_process(COMMAND
552         "${CPACK_IFW_INSTALLERBASE_EXECUTABLE}" ${_ifw_version_argument}
553         TIMEOUT ${CPACK_IFW_FRAMEWORK_VERSION_TIMEOUT}
554         RESULT_VARIABLE CPACK_IFW_FRAMEWORK_VERSION_RESULT
555         OUTPUT_VARIABLE CPACK_IFW_FRAMEWORK_VERSION_OUTPUT
556         OUTPUT_STRIP_TRAILING_WHITESPACE
557         ENCODING UTF8)
558       if(NOT CPACK_IFW_FRAMEWORK_VERSION_RESULT AND CPACK_IFW_FRAMEWORK_VERSION_OUTPUT)
559         string(REGEX MATCH "[0-9]+(\\.[0-9]+)*"
560           CPACK_IFW_FRAMEWORK_VERSION "${CPACK_IFW_FRAMEWORK_VERSION_OUTPUT}")
561         if(CPACK_IFW_FRAMEWORK_VERSION)
562           if("${_ifw_version_argument}" STREQUAL "--framework-version")
563             set(CPACK_IFW_FRAMEWORK_VERSION_SOURCE "INSTALLERBASE_FRAMEWORK_VERSION")
564           elseif("${_ifw_version_argument}" STREQUAL "--version")
565             set(CPACK_IFW_FRAMEWORK_VERSION_SOURCE "INSTALLERBASE_FRAMEWORK_VERSION")
566           endif()
567         endif()
568       endif()
569     endif()
570   endforeach()
571   # Finally try to get version from executable path
572   if(NOT CPACK_IFW_FRAMEWORK_VERSION)
573     string(REGEX MATCH "[0-9]+(\\.[0-9]+)*"
574       CPACK_IFW_FRAMEWORK_VERSION "${CPACK_IFW_INSTALLERBASE_EXECUTABLE}")
575     if(CPACK_IFW_FRAMEWORK_VERSION)
576       set(CPACK_IFW_FRAMEWORK_VERSION_SOURCE "INSTALLERBASE_PATH")
577     endif()
578   endif()
579 elseif(CPACK_IFW_FRAMEWORK_VERSION_FORCED)
580   set(CPACK_IFW_FRAMEWORK_VERSION ${CPACK_IFW_FRAMEWORK_VERSION_FORCED})
581   set(CPACK_IFW_FRAMEWORK_VERSION_SOURCE "FORCED")
582 endif()
583 if(CPACK_IFW_VERBOSE)
584   if(CPACK_IFW_FRAMEWORK_VERSION AND CPACK_IFW_FRAMEWORK_VERSION_FORCED)
585     message(STATUS "Found QtIFW ${CPACK_IFW_FRAMEWORK_VERSION} (forced) version")
586   elseif(CPACK_IFW_FRAMEWORK_VERSION)
587     message(STATUS "Found QtIFW ${CPACK_IFW_FRAMEWORK_VERSION} version")
588   endif()
589 endif()
590 if(CPACK_IFW_INSTALLERBASE_EXECUTABLE AND NOT CPACK_IFW_FRAMEWORK_VERSION)
591   message(WARNING "Could not detect QtIFW tools version. Set used version to variable \"CPACK_IFW_FRAMEWORK_VERSION_FORCED\" manually.")
592 endif()
593
594 #=============================================================================
595 # Macro definition
596 #=============================================================================
597
598 # Macro definition based on CPackComponent
599
600 if(NOT CPackComponent_CMake_INCLUDED)
601     include(CPackComponent)
602 endif()
603
604 # Resolve full filename for script file
605 macro(_cpack_ifw_resolve_script _variable)
606   set(_ifw_script_macro ${_variable})
607   set(_ifw_script_file ${${_ifw_script_macro}})
608   if(DEFINED ${_ifw_script_macro})
609     get_filename_component(${_ifw_script_macro} ${_ifw_script_file} ABSOLUTE)
610     set(_ifw_script_file ${${_ifw_script_macro}})
611     if(NOT EXISTS ${_ifw_script_file})
612       message(WARNING "CPack IFW: script file \"${_ifw_script_file}\" does not exist")
613       set(${_ifw_script_macro})
614     endif()
615   endif()
616 endmacro()
617
618 # Resolve full path to license file
619 macro(_cpack_ifw_resolve_lisenses _variable)
620   if(${_variable})
621     set(_ifw_license_file FALSE)
622     set(_ifw_licenses_fix)
623     foreach(_ifw_licenses_arg ${${_variable}})
624       if(_ifw_license_file)
625         get_filename_component(_ifw_licenses_arg "${_ifw_licenses_arg}" ABSOLUTE)
626         set(_ifw_license_file FALSE)
627       else()
628         set(_ifw_license_file TRUE)
629       endif()
630       list(APPEND _ifw_licenses_fix "${_ifw_licenses_arg}")
631     endforeach(_ifw_licenses_arg)
632     set(${_variable} "${_ifw_licenses_fix}")
633   endif()
634 endmacro()
635
636 # Resolve full path to a list of provided files
637 macro(_cpack_ifw_resolve_file_list _variable)
638   if(${_variable})
639     set(_ifw_list_fix)
640     foreach(_ifw_file_arg ${${_variable}})
641       get_filename_component(_ifw_file_arg "${_ifw_file_arg}" ABSOLUTE)
642       if(EXISTS ${_ifw_file_arg})
643         list(APPEND _ifw_list_fix "${_ifw_file_arg}")
644       else()
645         message(WARNING "CPack IFW: page file \"${_ifw_file_arg}\" does not exist. Skipping")
646       endif()
647     endforeach(_ifw_file_arg)
648     set(${_variable} "${_ifw_list_fix}")
649   endif()
650 endmacro()
651
652 # Macro for configure component
653 macro(cpack_ifw_configure_component compname)
654
655   string(TOUPPER ${compname} _CPACK_IFWCOMP_UNAME)
656
657   set(_IFW_OPT COMMON ESSENTIAL VIRTUAL FORCED_INSTALLATION REQUIRES_ADMIN_RIGHTS)
658   set(_IFW_ARGS NAME VERSION RELEASE_DATE SCRIPT PRIORITY SORTING_PRIORITY UPDATE_TEXT DEFAULT CHECKABLE)
659   set(_IFW_MULTI_ARGS DISPLAY_NAME DESCRIPTION DEPENDS DEPENDENCIES AUTO_DEPEND_ON LICENSES USER_INTERFACES TRANSLATIONS REPLACES)
660   cmake_parse_arguments(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN})
661
662   _cpack_ifw_resolve_script(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_SCRIPT)
663   _cpack_ifw_resolve_lisenses(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_LICENSES)
664   _cpack_ifw_resolve_file_list(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_USER_INTERFACES)
665   _cpack_ifw_resolve_file_list(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_TRANSLATIONS)
666
667   set(_CPACK_IFWCOMP_STR "\n# Configuration for IFW component \"${compname}\"\n")
668
669   foreach(_IFW_ARG_NAME ${_IFW_OPT})
670   cpack_append_option_set_command(
671     CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_${_IFW_ARG_NAME}
672     _CPACK_IFWCOMP_STR)
673   endforeach()
674
675   foreach(_IFW_ARG_NAME ${_IFW_ARGS})
676   cpack_append_string_variable_set_command(
677     CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_${_IFW_ARG_NAME}
678     _CPACK_IFWCOMP_STR)
679   endforeach()
680
681   foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS})
682   cpack_append_list_variable_set_command(
683     CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_${_IFW_ARG_NAME}
684     _CPACK_IFWCOMP_STR)
685   endforeach()
686
687   if(CPack_CMake_INCLUDED)
688     file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWCOMP_STR}")
689   endif()
690
691 endmacro()
692
693 # Macro for configure group
694 macro(cpack_ifw_configure_component_group grpname)
695
696   string(TOUPPER ${grpname} _CPACK_IFWGRP_UNAME)
697
698   set(_IFW_OPT VIRTUAL FORCED_INSTALLATION REQUIRES_ADMIN_RIGHTS)
699   set(_IFW_ARGS NAME VERSION RELEASE_DATE SCRIPT PRIORITY SORTING_PRIORITY UPDATE_TEXT DEFAULT CHECKABLE)
700   set(_IFW_MULTI_ARGS DISPLAY_NAME DESCRIPTION DEPENDS DEPENDENCIES AUTO_DEPEND_ON LICENSES USER_INTERFACES TRANSLATIONS REPLACES)
701   cmake_parse_arguments(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN})
702
703   _cpack_ifw_resolve_script(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_SCRIPT)
704   _cpack_ifw_resolve_lisenses(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_LICENSES)
705   _cpack_ifw_resolve_file_list(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_USER_INTERFACES)
706   _cpack_ifw_resolve_file_list(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_TRANSLATIONS)
707
708   set(_CPACK_IFWGRP_STR "\n# Configuration for IFW component group \"${grpname}\"\n")
709
710   foreach(_IFW_ARG_NAME ${_IFW_OPT})
711   cpack_append_option_set_command(
712     CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_${_IFW_ARG_NAME}
713     _CPACK_IFWGRP_STR)
714   endforeach()
715
716   foreach(_IFW_ARG_NAME ${_IFW_ARGS})
717   cpack_append_string_variable_set_command(
718     CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_${_IFW_ARG_NAME}
719     _CPACK_IFWGRP_STR)
720   endforeach()
721
722   foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS})
723   cpack_append_list_variable_set_command(
724     CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_${_IFW_ARG_NAME}
725     _CPACK_IFWGRP_STR)
726   endforeach()
727
728   if(CPack_CMake_INCLUDED)
729     file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWGRP_STR}")
730   endif()
731 endmacro()
732
733 # Macro for adding repository
734 macro(cpack_ifw_add_repository reponame)
735
736   string(TOUPPER ${reponame} _CPACK_IFWREPO_UNAME)
737
738   set(_IFW_OPT DISABLED)
739   set(_IFW_ARGS URL USERNAME PASSWORD DISPLAY_NAME)
740   set(_IFW_MULTI_ARGS)
741   cmake_parse_arguments(CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN})
742
743   set(_CPACK_IFWREPO_STR "\n# Configuration for IFW repository \"${reponame}\"\n")
744
745   foreach(_IFW_ARG_NAME ${_IFW_OPT})
746   cpack_append_option_set_command(
747     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
748     _CPACK_IFWREPO_STR)
749   endforeach()
750
751   foreach(_IFW_ARG_NAME ${_IFW_ARGS})
752   cpack_append_string_variable_set_command(
753     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
754     _CPACK_IFWREPO_STR)
755   endforeach()
756
757   foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS})
758   cpack_append_variable_set_command(
759     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
760     _CPACK_IFWREPO_STR)
761   endforeach()
762
763   list(APPEND CPACK_IFW_REPOSITORIES_ALL ${reponame})
764   string(APPEND _CPACK_IFWREPO_STR "list(APPEND CPACK_IFW_REPOSITORIES_ALL ${reponame})\n")
765
766   if(CPack_CMake_INCLUDED)
767     file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWREPO_STR}")
768   endif()
769
770 endmacro()
771
772 # Macro for updating repository
773 macro(cpack_ifw_update_repository reponame)
774
775   string(TOUPPER ${reponame} _CPACK_IFWREPO_UNAME)
776
777   set(_IFW_OPT ADD REMOVE REPLACE DISABLED)
778   set(_IFW_ARGS URL OLD_URL NEW_URL USERNAME PASSWORD DISPLAY_NAME)
779   set(_IFW_MULTI_ARGS)
780   cmake_parse_arguments(CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN})
781
782   set(_CPACK_IFWREPO_STR "\n# Configuration for IFW repository \"${reponame}\" update\n")
783
784   foreach(_IFW_ARG_NAME ${_IFW_OPT})
785   cpack_append_option_set_command(
786     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
787     _CPACK_IFWREPO_STR)
788   endforeach()
789
790   foreach(_IFW_ARG_NAME ${_IFW_ARGS})
791   cpack_append_string_variable_set_command(
792     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
793     _CPACK_IFWREPO_STR)
794   endforeach()
795
796   foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS})
797   cpack_append_variable_set_command(
798     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
799     _CPACK_IFWREPO_STR)
800   endforeach()
801
802   if(CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_ADD
803     OR CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_REMOVE
804     OR CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_REPLACE)
805     list(APPEND CPACK_IFW_REPOSITORIES_ALL ${reponame})
806     string(APPEND _CPACK_IFWREPO_STR "list(APPEND CPACK_IFW_REPOSITORIES_ALL ${reponame})\n")
807   else()
808     set(_CPACK_IFWREPO_STR)
809   endif()
810
811   if(CPack_CMake_INCLUDED AND _CPACK_IFWREPO_STR)
812     file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWREPO_STR}")
813   endif()
814
815 endmacro()
816
817 # Macro for adding resources
818 macro(cpack_ifw_add_package_resources)
819   set(_CPACK_IFW_PACKAGE_RESOURCES ${ARGV})
820   _cpack_ifw_resolve_file_list(_CPACK_IFW_PACKAGE_RESOURCES)
821   list(APPEND CPACK_IFW_PACKAGE_RESOURCES ${_CPACK_IFW_PACKAGE_RESOURCES})
822   set(_CPACK_IFWQRC_STR "list(APPEND CPACK_IFW_PACKAGE_RESOURCES \"${_CPACK_IFW_PACKAGE_RESOURCES}\")\n")
823   if(CPack_CMake_INCLUDED)
824     file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWQRC_STR}")
825   endif()
826 endmacro()
827
828 # Resolve package control script
829 _cpack_ifw_resolve_script(CPACK_IFW_PACKAGE_CONTROL_SCRIPT)
830
831 endif() # NOT CPackIFW_CMake_INCLUDED