| # Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| # file LICENSE.rst or https://cmake.org/licensing for details. | |
| #[=======================================================================[.rst: | |
| CPackIFWConfigureFile | |
| --------------------- | |
| .. versionadded:: 3.8 | |
| This module provides a command similar to :command:`configure_file` for | |
| configuring file templates prepared in QtIFW/SDK/Creator style. | |
| Load this module in a CMake project with: | |
| .. code-block:: cmake | |
| include(CPackIFWConfigureFile) | |
| Commands | |
| ^^^^^^^^ | |
| This module provides the following command: | |
| .. command:: cpack_ifw_configure_file | |
| Copies a file template to output file and substitutes variable values | |
| referenced as ``%{VAR}`` or ``%VAR%`` from the input file template | |
| content: | |
| .. code-block:: cmake | |
| cpack_ifw_configure_file(<input> <output>) | |
| ``<input>`` | |
| Input file template. If given as a relative path, it is interpreted as | |
| relative to the current source directory | |
| (:variable:`CMAKE_CURRENT_SOURCE_DIR`). | |
| ``<output>`` | |
| Output file. If given as a relative path, it is interpreted as relative | |
| to the current binary directory (:variable:`CMAKE_CURRENT_BINARY_DIR`). | |
| Qt Installer Framework (QtIFW) uses ``@`` characters for embedding | |
| predefined variables (``TargetDir``, ``StartMenuDir``, etc.) in Qt | |
| installer scripts: | |
| .. code-block:: javascript | |
| :caption: ``example.qs`` | |
| component.addOperation( | |
| "CreateShortcut", | |
| "@TargetDir@/example.com.html", | |
| "@StartMenuDir@/Example Web Site.lnk" | |
| ); | |
| The purpose of this command is to preserve the QtIFW predefined variables | |
| containing the ``@`` characters (``@VAR@``), and instead use the ``%`` | |
| characters for template placeholders (``%VAR%``, ``%{VAR}``) in | |
| Qt/IFW/SDK/Creator templates. The :command:`configure_file` command | |
| would otherwise replace all variable references containing the ``@`` | |
| characters. | |
| Each variable reference will be replaced with the current value of the | |
| variable, or the empty string if the variable is not defined. | |
| Examples | |
| ^^^^^^^^ | |
| In the following example this module is used to create an IFW component | |
| script from a given template file ``qt.tools.foo.qs.in``, where | |
| ``%FOO_DOC_DIR%`` variable reference will be replaced by the values of | |
| the ``FOO_DOC_DIR`` CMake variable. | |
| .. code-block:: cmake | |
| :caption: ``CMakeLists.txt`` | |
| cmake_minimum_required(VERSION 3.8) | |
| project(Foo) | |
| # ... | |
| include(CPackIFWConfigureFile) | |
| set(FOO_DOC_DIR "doc/foo") | |
| cpack_ifw_configure_file(qt.tools.foo.qs.in qt.tools.foo.qs) | |
| .. code-block:: javascript | |
| :caption: ``qt.tools.foo.qs.in`` | |
| function Component() | |
| { | |
| } | |
| Component.prototype.createOperations = function() | |
| { | |
| if (installer.value("os") === "win") { | |
| component.addOperation( | |
| "CreateShortcut", | |
| "@TargetDir@/%FOO_DOC_DIR%/example.com.html", | |
| "@StartMenuDir@/Example Web Site.lnk" | |
| ); | |
| } | |
| component.createOperations(); | |
| } | |
| // ... | |
| See Also | |
| ^^^^^^^^ | |
| * The :cpack_gen:`CPack IFW Generator`. | |
| * The :module:`CPackIFW` module. | |
| #]=======================================================================] | |
| if(NOT DEFINED CPackIFWConfigureFile_CMake_INCLUDED) | |
| set(CPackIFWConfigureFile_CMake_INCLUDED 1) | |
| macro(cpack_ifw_configure_file INPUT OUTPUT) | |
| file(READ "${INPUT}" _tmp) | |
| foreach(_tmp_regex "%{([^%}]+)}" "%([^%]+)%") | |
| string(REGEX MATCHALL "${_tmp_regex}" _tmp_vars "${_tmp}") | |
| while(_tmp_vars) | |
| foreach(_tmp_var ${_tmp_vars}) | |
| string(REGEX REPLACE "${_tmp_regex}" "\\1" | |
| _tmp_var_name "${_tmp_var}") | |
| if(DEFINED ${_tmp_var_name}) | |
| set(_tmp_var_value "${${_tmp_var_name}}") | |
| elseif(NOT "$ENV{${_tmp_var_name}}" STREQUAL "") | |
| set(_tmp_var_value "$ENV{${_tmp_var_name}}") | |
| else() | |
| set(_tmp_var_value "") | |
| endif() | |
| string(REPLACE "${_tmp_var}" "${_tmp_var_value}" _tmp "${_tmp}") | |
| endforeach() | |
| string(REGEX MATCHALL "${_tmp_regex}" _tmp_vars "${_tmp}") | |
| endwhile() | |
| endforeach() | |
| if(IS_ABSOLUTE "${OUTPUT}") | |
| file(WRITE "${OUTPUT}" "${_tmp}") | |
| else() | |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT}" "${_tmp}") | |
| endif() | |
| endmacro() | |
| endif() # NOT DEFINED CPackIFWConfigureFile_CMake_INCLUDED |