a4bfe1d2536389ace14a87224cf34b986841d386
[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.4"
443   "4.3"
444   "4.2"
445   "4.1"
446   "4.0"
447   "3.2"
448   "3.2.0"
449   "3.1"
450   "3.1.0"
451   "3.0"
452   "3.0.0"
453   "2.3"
454   "2.3.0"
455   "2.2"
456   "2.2.0"
457   "2.1"
458   "2.1.0"
459   "2.0"
460   "2.0.5"
461   "2.0.3"
462   "2.0.2"
463   "2.0.1"
464   "2.0.0"
465   "1.6"
466   "1.6.0"
467   "1.5"
468   "1.5.0"
469   "1.4"
470   "1.4.0"
471   "1.3"
472   "1.3.0")
473
474 set(_CPACK_IFW_SUFFIXES "bin")
475 foreach(_CPACK_IFW_PREFIX ${_CPACK_IFW_PREFIXES})
476   foreach(_CPACK_IFW_VERSION ${_CPACK_IFW_VERSIONS})
477     list(APPEND
478       _CPACK_IFW_SUFFIXES "${_CPACK_IFW_PREFIX}${_CPACK_IFW_VERSION}/bin")
479   endforeach()
480 endforeach()
481
482 # Look for 'binarycreator'
483
484 find_program(CPACK_IFW_BINARYCREATOR_EXECUTABLE
485   NAMES binarycreator
486   PATHS ${_CPACK_IFW_PATHS}
487   PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES}
488   DOC "QtIFW binarycreator command line client")
489
490 mark_as_advanced(CPACK_IFW_BINARYCREATOR_EXECUTABLE)
491
492 # Look for 'repogen'
493
494 find_program(CPACK_IFW_REPOGEN_EXECUTABLE
495   NAMES repogen
496   PATHS ${_CPACK_IFW_PATHS}
497   PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES}
498   DOC "QtIFW repogen command line client"
499   )
500 mark_as_advanced(CPACK_IFW_REPOGEN_EXECUTABLE)
501
502 # Look for 'installerbase'
503
504 find_program(CPACK_IFW_INSTALLERBASE_EXECUTABLE
505   NAMES installerbase
506   PATHS ${_CPACK_IFW_PATHS}
507   PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES}
508   DOC "QtIFW installer executable base"
509   )
510 mark_as_advanced(CPACK_IFW_INSTALLERBASE_EXECUTABLE)
511
512 # Look for 'devtool' (appeared in the second branch)
513
514 find_program(CPACK_IFW_DEVTOOL_EXECUTABLE
515   NAMES devtool
516   PATHS ${_CPACK_IFW_PATHS}
517   PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES}
518   DOC "QtIFW devtool command line client"
519   )
520 mark_as_advanced(CPACK_IFW_DEVTOOL_EXECUTABLE)
521
522 # Look for 'archivegen'
523
524 find_program(CPACK_IFW_ARCHIVEGEN_EXECUTABLE
525   NAMES archivegen
526   PATHS ${_CPACK_IFW_PATHS}
527   PATH_SUFFIXES ${_CPACK_IFW_SUFFIXES}
528   DOC "QtIFW archivegen command line client"
529   )
530 mark_as_advanced(CPACK_IFW_ARCHIVEGEN_EXECUTABLE)
531
532 #
533 ## Next code is included only once
534 #
535
536 if(NOT CPackIFW_CMake_INCLUDED)
537 set(CPackIFW_CMake_INCLUDED 1)
538
539 #=============================================================================
540 # Framework version
541 #=============================================================================
542
543 set(CPACK_IFW_FRAMEWORK_VERSION_FORCED ""
544   CACHE STRING "The forced version of used QtIFW tools")
545 mark_as_advanced(CPACK_IFW_FRAMEWORK_VERSION_FORCED)
546 set(CPACK_IFW_FRAMEWORK_VERSION_TIMEOUT 1
547   CACHE STRING "The timeout to return QtIFW framework version string from \"installerbase\" executable")
548 mark_as_advanced(CPACK_IFW_FRAMEWORK_VERSION_TIMEOUT)
549 if(CPACK_IFW_INSTALLERBASE_EXECUTABLE AND NOT CPACK_IFW_FRAMEWORK_VERSION_FORCED)
550   set(CPACK_IFW_FRAMEWORK_VERSION)
551   # Invoke version from "installerbase" executable
552   foreach(_ifw_version_argument --version --framework-version)
553     if(NOT CPACK_IFW_FRAMEWORK_VERSION)
554       execute_process(COMMAND
555         "${CPACK_IFW_INSTALLERBASE_EXECUTABLE}" ${_ifw_version_argument}
556         TIMEOUT ${CPACK_IFW_FRAMEWORK_VERSION_TIMEOUT}
557         RESULT_VARIABLE CPACK_IFW_FRAMEWORK_VERSION_RESULT
558         OUTPUT_VARIABLE CPACK_IFW_FRAMEWORK_VERSION_OUTPUT
559         OUTPUT_STRIP_TRAILING_WHITESPACE
560         ENCODING UTF8)
561       if(NOT CPACK_IFW_FRAMEWORK_VERSION_RESULT AND CPACK_IFW_FRAMEWORK_VERSION_OUTPUT)
562         string(REGEX MATCH "[0-9]+(\\.[0-9]+)*"
563           CPACK_IFW_FRAMEWORK_VERSION "${CPACK_IFW_FRAMEWORK_VERSION_OUTPUT}")
564         if(CPACK_IFW_FRAMEWORK_VERSION)
565           if("${_ifw_version_argument}" STREQUAL "--framework-version")
566             set(CPACK_IFW_FRAMEWORK_VERSION_SOURCE "INSTALLERBASE_FRAMEWORK_VERSION")
567           elseif("${_ifw_version_argument}" STREQUAL "--version")
568             set(CPACK_IFW_FRAMEWORK_VERSION_SOURCE "INSTALLERBASE_FRAMEWORK_VERSION")
569           endif()
570         endif()
571       endif()
572     endif()
573   endforeach()
574   # Finally try to get version from executable path
575   if(NOT CPACK_IFW_FRAMEWORK_VERSION)
576     string(REGEX MATCH "[0-9]+(\\.[0-9]+)*"
577       CPACK_IFW_FRAMEWORK_VERSION "${CPACK_IFW_INSTALLERBASE_EXECUTABLE}")
578     if(CPACK_IFW_FRAMEWORK_VERSION)
579       set(CPACK_IFW_FRAMEWORK_VERSION_SOURCE "INSTALLERBASE_PATH")
580     endif()
581   endif()
582 elseif(CPACK_IFW_FRAMEWORK_VERSION_FORCED)
583   set(CPACK_IFW_FRAMEWORK_VERSION ${CPACK_IFW_FRAMEWORK_VERSION_FORCED})
584   set(CPACK_IFW_FRAMEWORK_VERSION_SOURCE "FORCED")
585 endif()
586 if(CPACK_IFW_VERBOSE)
587   if(CPACK_IFW_FRAMEWORK_VERSION AND CPACK_IFW_FRAMEWORK_VERSION_FORCED)
588     message(STATUS "Found QtIFW ${CPACK_IFW_FRAMEWORK_VERSION} (forced) version")
589   elseif(CPACK_IFW_FRAMEWORK_VERSION)
590     message(STATUS "Found QtIFW ${CPACK_IFW_FRAMEWORK_VERSION} version")
591   endif()
592 endif()
593 if(CPACK_IFW_INSTALLERBASE_EXECUTABLE AND NOT CPACK_IFW_FRAMEWORK_VERSION)
594   message(WARNING "Could not detect QtIFW tools version. Set used version to variable \"CPACK_IFW_FRAMEWORK_VERSION_FORCED\" manually.")
595 endif()
596
597 #=============================================================================
598 # Macro definition
599 #=============================================================================
600
601 # Macro definition based on CPackComponent
602
603 if(NOT CPackComponent_CMake_INCLUDED)
604     include(CPackComponent)
605 endif()
606
607 # Resolve full filename for script file
608 macro(_cpack_ifw_resolve_script _variable)
609   set(_ifw_script_macro ${_variable})
610   set(_ifw_script_file ${${_ifw_script_macro}})
611   if(DEFINED ${_ifw_script_macro})
612     get_filename_component(${_ifw_script_macro} ${_ifw_script_file} ABSOLUTE)
613     set(_ifw_script_file ${${_ifw_script_macro}})
614     if(NOT EXISTS ${_ifw_script_file})
615       message(WARNING "CPack IFW: script file \"${_ifw_script_file}\" does not exist")
616       set(${_ifw_script_macro})
617     endif()
618   endif()
619 endmacro()
620
621 # Resolve full path to license file
622 macro(_cpack_ifw_resolve_lisenses _variable)
623   if(${_variable})
624     set(_ifw_license_file FALSE)
625     set(_ifw_licenses_fix)
626     foreach(_ifw_licenses_arg ${${_variable}})
627       if(_ifw_license_file)
628         get_filename_component(_ifw_licenses_arg "${_ifw_licenses_arg}" ABSOLUTE)
629         set(_ifw_license_file FALSE)
630       else()
631         set(_ifw_license_file TRUE)
632       endif()
633       list(APPEND _ifw_licenses_fix "${_ifw_licenses_arg}")
634     endforeach(_ifw_licenses_arg)
635     set(${_variable} "${_ifw_licenses_fix}")
636   endif()
637 endmacro()
638
639 # Resolve full path to a list of provided files
640 macro(_cpack_ifw_resolve_file_list _variable)
641   if(${_variable})
642     set(_ifw_list_fix)
643     foreach(_ifw_file_arg ${${_variable}})
644       get_filename_component(_ifw_file_arg "${_ifw_file_arg}" ABSOLUTE)
645       if(EXISTS ${_ifw_file_arg})
646         list(APPEND _ifw_list_fix "${_ifw_file_arg}")
647       else()
648         message(WARNING "CPack IFW: page file \"${_ifw_file_arg}\" does not exist. Skipping")
649       endif()
650     endforeach(_ifw_file_arg)
651     set(${_variable} "${_ifw_list_fix}")
652   endif()
653 endmacro()
654
655 # Macro for configure component
656 macro(cpack_ifw_configure_component compname)
657
658   string(TOUPPER ${compname} _CPACK_IFWCOMP_UNAME)
659
660   set(_IFW_OPT COMMON ESSENTIAL VIRTUAL FORCED_INSTALLATION REQUIRES_ADMIN_RIGHTS)
661   set(_IFW_ARGS NAME VERSION RELEASE_DATE SCRIPT PRIORITY SORTING_PRIORITY UPDATE_TEXT DEFAULT CHECKABLE)
662   set(_IFW_MULTI_ARGS DISPLAY_NAME DESCRIPTION DEPENDS DEPENDENCIES AUTO_DEPEND_ON LICENSES USER_INTERFACES TRANSLATIONS REPLACES)
663   cmake_parse_arguments(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN})
664
665   _cpack_ifw_resolve_script(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_SCRIPT)
666   _cpack_ifw_resolve_lisenses(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_LICENSES)
667   _cpack_ifw_resolve_file_list(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_USER_INTERFACES)
668   _cpack_ifw_resolve_file_list(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_TRANSLATIONS)
669
670   set(_CPACK_IFWCOMP_STR "\n# Configuration for IFW component \"${compname}\"\n")
671
672   foreach(_IFW_ARG_NAME ${_IFW_OPT})
673   cpack_append_option_set_command(
674     CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_${_IFW_ARG_NAME}
675     _CPACK_IFWCOMP_STR)
676   endforeach()
677
678   foreach(_IFW_ARG_NAME ${_IFW_ARGS})
679   cpack_append_string_variable_set_command(
680     CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_${_IFW_ARG_NAME}
681     _CPACK_IFWCOMP_STR)
682   endforeach()
683
684   foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS})
685   cpack_append_list_variable_set_command(
686     CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_${_IFW_ARG_NAME}
687     _CPACK_IFWCOMP_STR)
688   endforeach()
689
690   if(CPack_CMake_INCLUDED)
691     file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWCOMP_STR}")
692   endif()
693
694 endmacro()
695
696 # Macro for configure group
697 macro(cpack_ifw_configure_component_group grpname)
698
699   string(TOUPPER ${grpname} _CPACK_IFWGRP_UNAME)
700
701   set(_IFW_OPT VIRTUAL FORCED_INSTALLATION REQUIRES_ADMIN_RIGHTS)
702   set(_IFW_ARGS NAME VERSION RELEASE_DATE SCRIPT PRIORITY SORTING_PRIORITY UPDATE_TEXT DEFAULT CHECKABLE)
703   set(_IFW_MULTI_ARGS DISPLAY_NAME DESCRIPTION DEPENDS DEPENDENCIES AUTO_DEPEND_ON LICENSES USER_INTERFACES TRANSLATIONS REPLACES)
704   cmake_parse_arguments(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN})
705
706   _cpack_ifw_resolve_script(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_SCRIPT)
707   _cpack_ifw_resolve_lisenses(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_LICENSES)
708   _cpack_ifw_resolve_file_list(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_USER_INTERFACES)
709   _cpack_ifw_resolve_file_list(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_TRANSLATIONS)
710
711   set(_CPACK_IFWGRP_STR "\n# Configuration for IFW component group \"${grpname}\"\n")
712
713   foreach(_IFW_ARG_NAME ${_IFW_OPT})
714   cpack_append_option_set_command(
715     CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_${_IFW_ARG_NAME}
716     _CPACK_IFWGRP_STR)
717   endforeach()
718
719   foreach(_IFW_ARG_NAME ${_IFW_ARGS})
720   cpack_append_string_variable_set_command(
721     CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_${_IFW_ARG_NAME}
722     _CPACK_IFWGRP_STR)
723   endforeach()
724
725   foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS})
726   cpack_append_list_variable_set_command(
727     CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_${_IFW_ARG_NAME}
728     _CPACK_IFWGRP_STR)
729   endforeach()
730
731   if(CPack_CMake_INCLUDED)
732     file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWGRP_STR}")
733   endif()
734 endmacro()
735
736 # Macro for adding repository
737 macro(cpack_ifw_add_repository reponame)
738
739   string(TOUPPER ${reponame} _CPACK_IFWREPO_UNAME)
740
741   set(_IFW_OPT DISABLED)
742   set(_IFW_ARGS URL USERNAME PASSWORD DISPLAY_NAME)
743   set(_IFW_MULTI_ARGS)
744   cmake_parse_arguments(CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN})
745
746   set(_CPACK_IFWREPO_STR "\n# Configuration for IFW repository \"${reponame}\"\n")
747
748   foreach(_IFW_ARG_NAME ${_IFW_OPT})
749   cpack_append_option_set_command(
750     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
751     _CPACK_IFWREPO_STR)
752   endforeach()
753
754   foreach(_IFW_ARG_NAME ${_IFW_ARGS})
755   cpack_append_string_variable_set_command(
756     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
757     _CPACK_IFWREPO_STR)
758   endforeach()
759
760   foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS})
761   cpack_append_variable_set_command(
762     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
763     _CPACK_IFWREPO_STR)
764   endforeach()
765
766   list(APPEND CPACK_IFW_REPOSITORIES_ALL ${reponame})
767   string(APPEND _CPACK_IFWREPO_STR "list(APPEND CPACK_IFW_REPOSITORIES_ALL ${reponame})\n")
768
769   if(CPack_CMake_INCLUDED)
770     file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWREPO_STR}")
771   endif()
772
773 endmacro()
774
775 # Macro for updating repository
776 macro(cpack_ifw_update_repository reponame)
777
778   string(TOUPPER ${reponame} _CPACK_IFWREPO_UNAME)
779
780   set(_IFW_OPT ADD REMOVE REPLACE DISABLED)
781   set(_IFW_ARGS URL OLD_URL NEW_URL USERNAME PASSWORD DISPLAY_NAME)
782   set(_IFW_MULTI_ARGS)
783   cmake_parse_arguments(CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN})
784
785   set(_CPACK_IFWREPO_STR "\n# Configuration for IFW repository \"${reponame}\" update\n")
786
787   foreach(_IFW_ARG_NAME ${_IFW_OPT})
788   cpack_append_option_set_command(
789     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
790     _CPACK_IFWREPO_STR)
791   endforeach()
792
793   foreach(_IFW_ARG_NAME ${_IFW_ARGS})
794   cpack_append_string_variable_set_command(
795     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
796     _CPACK_IFWREPO_STR)
797   endforeach()
798
799   foreach(_IFW_ARG_NAME ${_IFW_MULTI_ARGS})
800   cpack_append_variable_set_command(
801     CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_${_IFW_ARG_NAME}
802     _CPACK_IFWREPO_STR)
803   endforeach()
804
805   if(CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_ADD
806     OR CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_REMOVE
807     OR CPACK_IFW_REPOSITORY_${_CPACK_IFWREPO_UNAME}_REPLACE)
808     list(APPEND CPACK_IFW_REPOSITORIES_ALL ${reponame})
809     string(APPEND _CPACK_IFWREPO_STR "list(APPEND CPACK_IFW_REPOSITORIES_ALL ${reponame})\n")
810   else()
811     set(_CPACK_IFWREPO_STR)
812   endif()
813
814   if(CPack_CMake_INCLUDED AND _CPACK_IFWREPO_STR)
815     file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWREPO_STR}")
816   endif()
817
818 endmacro()
819
820 # Macro for adding resources
821 macro(cpack_ifw_add_package_resources)
822   set(_CPACK_IFW_PACKAGE_RESOURCES ${ARGV})
823   _cpack_ifw_resolve_file_list(_CPACK_IFW_PACKAGE_RESOURCES)
824   list(APPEND CPACK_IFW_PACKAGE_RESOURCES ${_CPACK_IFW_PACKAGE_RESOURCES})
825   set(_CPACK_IFWQRC_STR "list(APPEND CPACK_IFW_PACKAGE_RESOURCES \"${_CPACK_IFW_PACKAGE_RESOURCES}\")\n")
826   if(CPack_CMake_INCLUDED)
827     file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_IFWQRC_STR}")
828   endif()
829 endmacro()
830
831 # Resolve package control script
832 _cpack_ifw_resolve_script(CPACK_IFW_PACKAGE_CONTROL_SCRIPT)
833
834 endif() # NOT CPackIFW_CMake_INCLUDED