# 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 file template. If given as a relative path, it is interpreted as relative to the current source directory (:variable:`CMAKE_CURRENT_SOURCE_DIR`). ```` 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