| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- # 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
|