CPack: Add Inno Setup generator
This commit is contained in:
parent
9b0dc652ff
commit
1d6db66179
@ -1,4 +1,5 @@
|
||||
if (NOT "$ENV{CMAKE_CI_NIGHTLY}" STREQUAL "")
|
||||
set(CMake_TEST_CPACK_INNOSETUP "ON" CACHE STRING "")
|
||||
set(CMake_TEST_ISPC "ON" CACHE STRING "")
|
||||
endif()
|
||||
set(CMake_TEST_TLS_VERIFY_URL "https://gitlab.kitware.com" CACHE STRING "")
|
||||
|
420
Help/cpack_gen/innosetup.rst
Normal file
420
Help/cpack_gen/innosetup.rst
Normal file
@ -0,0 +1,420 @@
|
||||
CPack Inno Setup Generator
|
||||
--------------------------
|
||||
|
||||
.. versionadded:: 3.27
|
||||
|
||||
Inno Setup is a free installer for Windows programs by Jordan Russell and
|
||||
Martijn Laan (https://jrsoftware.org/isinfo.php).
|
||||
|
||||
This documentation explains Inno Setup generator specific options.
|
||||
|
||||
The generator provides a lot of options like components. Unfortunately, not
|
||||
all features (e.g. component dependencies) are currently supported by
|
||||
Inno Setup and they're ignored by the generator for now.
|
||||
|
||||
CPack requires Inno Setup 6 or greater and only works on Windows.
|
||||
|
||||
Variables specific to CPack Inno Setup generator
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
You can use the following variables to change the behavior of the CPack
|
||||
``INNOSETUP`` generator:
|
||||
|
||||
|
||||
General
|
||||
"""""""
|
||||
|
||||
None of the following variables is required to be set for the Inno Setup
|
||||
generator to work. If a variable is marked as mandatory below but not set,
|
||||
its default value is taken.
|
||||
|
||||
The variables can also contain Inno Setup constants like ``{app}``. Please
|
||||
refer to the documentation of Inno Setup for more information.
|
||||
|
||||
If you're asked to provide the path to any file, you can always give an
|
||||
absolute path or in most cases the relative path from the top-level directory
|
||||
where all files being installed by an :command:`install` instruction reside.
|
||||
|
||||
CPack tries to escape quotes and other special characters for you. However,
|
||||
using special characters could cause problems.
|
||||
|
||||
The following variable simplifies the usage of Inno Setup in CMake:
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT
|
||||
|
||||
Inno Setup only uses ``yes`` or ``no`` as boolean formats meanwhile CMake
|
||||
uses a lot of alternative formats like ``ON`` or ``OFF``. Having this option
|
||||
turned on enables an automatic conversion.
|
||||
|
||||
Consider the following example:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
set(CMAKE_INNOSETUP_SETUP_AllowNoIcons OFF)
|
||||
|
||||
If this option is turned on, the following line will be created in the output
|
||||
script: ``AllowNoIcons=no``.
|
||||
Else, the following erroneous line will be created: ``AllowNoIcons=OFF``
|
||||
|
||||
The conversion is enabled in every Inno Setup specific variable.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: ``ON``
|
||||
|
||||
|
||||
Setup Specific Variables
|
||||
""""""""""""""""""""""""
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_ARCHITECTURE
|
||||
|
||||
One of ``x86``, ``x64``, ``arm64`` or ``ia64``. This variable specifies the
|
||||
target architecture of the installer. This also affects the Program Files
|
||||
folder or registry keys being used.
|
||||
|
||||
CPack tries to determine the correct value with a try compile (see
|
||||
:variable:`CMAKE_SIZEOF_VOID_P`), but this option can be manually specified
|
||||
too (especially when using ``ia64`` or cross-platform compilation).
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: Either ``x86`` or ``x64`` depending on the results of the try-compile
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_INSTALL_ROOT
|
||||
|
||||
If you don't want the installer to create the installation directory under
|
||||
Program Files, you've to specify the installation root here.
|
||||
|
||||
The full directory of the installation will be:
|
||||
``${CPACK_INNOSETUP_INSTALL_ROOT}/${CPACK_PACKAGE_INSTALL_DIRECTORY}``.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: ``{autopf}``
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_ALLOW_CUSTOM_DIRECTORY
|
||||
|
||||
If turned on, the installer allows the user to change the installation
|
||||
directory providing an extra wizard page.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: ``ON``
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_PROGRAM_MENU_FOLDER
|
||||
|
||||
The initial name of the start menu folder being created.
|
||||
|
||||
If this variable is set to ``.``, then no separate folder is created,
|
||||
application shortcuts will appear in the top-level start menu folder.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: The value of :variable:`CPACK_PACKAGE_NAME`
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_LANGUAGES
|
||||
|
||||
A :ref:`semicolon-separated list <CMake Language Lists>` of languages you want
|
||||
Inno Setup to include.
|
||||
|
||||
Currently available: ``armenian``, ``brazilianPortuguese``, ``bulgarian``,
|
||||
``catalan``, ``corsican``, ``czech``, ``danish``, ``dutch``, ``english``,
|
||||
``finnish``, ``french``, ``german``, ``hebrew``, ``icelandic``, ``italian``,
|
||||
``japanese``, ``norwegian``, ``polish``, ``portuguese``, ``russian``,
|
||||
``slovak``, ``slovenian``, ``spanish``, ``turkish`` and ``ukrainian``.
|
||||
This list might differ depending on the version of Inno Setup.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: ``english``
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_IGNORE_LICENSE_PAGE
|
||||
|
||||
If you don't specify a license file using
|
||||
:variable:`CPACK_RESOURCE_FILE_LICENSE`, CPack uses a file for demonstration
|
||||
purposes. If you want the installer to ignore license files at all, you can
|
||||
enable this option.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: ``OFF``
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_IGNORE_README_PAGE
|
||||
|
||||
If you don't specify a readme file using
|
||||
:variable:`CPACK_RESOURCE_FILE_README`, CPack uses a file for demonstration
|
||||
purposes. If you want the installer to ignore readme files at all, you can
|
||||
enable this option. Make sure the option is disabled when using
|
||||
a custom readme file.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: ``ON``
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_PASSWORD
|
||||
|
||||
Enables password protection and file encryption with the given password.
|
||||
|
||||
:Mandatory: No
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_USE_MODERN_WIZARD
|
||||
|
||||
Enables the modern look and feel provided by Inno Setup. If this option is
|
||||
turned off, the classic style is used instead. Images and icon files are
|
||||
also affected.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: ``OFF`` because of compatibility reasons
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_ICON_FILE
|
||||
|
||||
The path to a custom installer ``.ico`` file.
|
||||
|
||||
Use :variable:`CPACK_PACKAGE_ICON` to customize the bitmap file being shown
|
||||
in the wizard.
|
||||
|
||||
:Mandatory: No
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_SETUP_<directive>
|
||||
|
||||
This group allows adapting any of the ``[Setup]`` section directives provided
|
||||
by Inno Setup where ``directive`` is its name.
|
||||
|
||||
Here are some examples:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
set(CPACK_INNOSETUP_SETUP_WizardSmallImageFile "my_bitmap.bmp")
|
||||
set(CPACK_INNOSETUP_SETUP_AllowNoIcons OFF) # This requires CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT to be on
|
||||
|
||||
All of these variables have higher priority than the others.
|
||||
Consider the following example:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
set(CPACK_INNOSETUP_SETUP_Password "admin")
|
||||
set(CPACK_INNOSETUP_PASSWORD "secret")
|
||||
|
||||
The password will be ``admin`` at the end because ``CPACK_INNOSETUP_PASSWORD``
|
||||
has less priority than ``CPACK_INNOSETUP_SETUP_Password``.
|
||||
|
||||
:Mandatory: No
|
||||
|
||||
|
||||
File Specific Variables
|
||||
"""""""""""""""""""""""
|
||||
|
||||
Although all files being installed by an :command:`install` instruction are
|
||||
automatically processed and added to the installer, there are some variables
|
||||
to customize the installation process.
|
||||
|
||||
Before using executables (only ``.exe`` or ``.com``) in shortcuts
|
||||
(e.g. :variable:`CPACK_CREATE_DESKTOP_LINKS`) or ``[Run]`` entries, you've to
|
||||
add the raw file name (without path and extension) to
|
||||
:variable:`CPACK_PACKAGE_EXECUTABLES` and create a start menu shortcut
|
||||
for them.
|
||||
|
||||
If you have two files with the same raw name (e.g. ``a/executable.exe`` and
|
||||
``b/executable.com``), an entry in the section is created twice. This will
|
||||
result in undefined behavior and is not recommended.
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_CUSTOM_INSTALL_INSTRUCTIONS
|
||||
|
||||
This variable should contain a
|
||||
:ref:`semicolon-separated list <CMake Language Lists>` of pairs ``path``,
|
||||
``instruction`` and can be used to customize the install command being
|
||||
automatically created for each file or directory.
|
||||
|
||||
CPack creates the following Inno Setup instruction for every file...
|
||||
|
||||
.. code-block::
|
||||
|
||||
Source: "absolute\path\to\my_file.txt"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
...and the following line for every directory:
|
||||
|
||||
.. code-block::
|
||||
|
||||
Name: "{app}\my_folder"
|
||||
|
||||
You might want to change the destination directory or the flags of
|
||||
``my_file.txt``. Since we can also provide a relative path, the line you'd
|
||||
like to have, is the following:
|
||||
|
||||
.. code-block::
|
||||
|
||||
Source: "my_file.txt"; DestDir: "{userdocs}"; Flags: ignoreversion uninsneveruninstall
|
||||
|
||||
You would do this by using ``my_file.txt`` as ``path`` and
|
||||
``Source: "my_file.txt"; DestDir: "{userdocs}"; Flags: ignoreversion uninsneveruninstall``
|
||||
as ``instruction``.
|
||||
|
||||
You've to take care of the `escaping problem <https://cmake.org/cmake/help/book/mastering-cmake/chapter/Packaging%20With%20CPack.html#adding-custom-cpack-options>`_.
|
||||
So the CMake command would be:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
set(CPACK_INNOSETUP_CUSTOM_INSTALL_INSTRUCTIONS "my_file.txt;Source: \\\"my_file.txt\\\"\\; DestDir: \\\"{userdocs}\\\"\\; Flags: ignoreversion uninsneveruninstall")
|
||||
|
||||
To improve readability, you should go around the escaping problem by using
|
||||
:variable:`CPACK_VERBATIM_VARIABLES` or by placing the instruction into a
|
||||
separate CPack project config file.
|
||||
|
||||
If you customize the install instruction of a specific file, you lose the
|
||||
connection to its component. To go around, manually add
|
||||
``Components: <component>``. You also need to add its shortcuts and ``[Run]``
|
||||
entries by yourself in a custom section, since the executable won't be found
|
||||
anymore by :variable:`CPACK_PACKAGE_EXECUTABLES`.
|
||||
|
||||
Here's another example (Note: You've to go around the escaping problem for
|
||||
the example to work):
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
set(CPACK_INNOSETUP_CUSTOM_INSTALL_INSTRUCTIONS
|
||||
"component1/my_folder" "Name: \"{userdocs}\\my_folder\"\; Components: component1"
|
||||
"component2/my_folder2/my_file.txt" "Source: \"component2\\my_folder2\\my_file.txt\"\; DestDir: \"{app}\\my_folder2\\my_file.txt\"\; Flags: ignoreversion uninsneveruninstall\; Components: component2")
|
||||
|
||||
:Mandatory: No
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_MENU_LINKS
|
||||
|
||||
This variable should contain a
|
||||
:ref:`semicolon-separated list <CMake Language Lists>` of pairs ``link``,
|
||||
``link name`` and can be used to add shortcuts into the start menu folder
|
||||
beside those of the executables (see :variable:`CPACK_PACKAGE_EXECUTABLES`).
|
||||
While ``link name`` is the label, ``link`` can be a URL or a path relative to
|
||||
the installation directory.
|
||||
|
||||
Here's an example:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
set(CPACK_INNOSETUP_MENU_LINKS
|
||||
"doc/cmake-@CMake_VERSION_MAJOR@.@CMake_VERSION_MINOR@/cmake.html"
|
||||
"CMake Help" "https://cmake.org" "CMake Web Site")
|
||||
|
||||
:Mandatory: No
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_CREATE_UNINSTALL_LINK
|
||||
|
||||
If this option is turned on, a shortcut to the application's uninstaller is
|
||||
automatically added to the start menu folder.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: ``OFF``
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_RUN_EXECUTABLES
|
||||
|
||||
A :ref:`semicolon-separated list <CMake Language Lists>` of executables being
|
||||
specified in :variable:`CPACK_PACKAGE_EXECUTABLES` which the user can run
|
||||
when the installer finishes.
|
||||
|
||||
They're internally added to the ``[Run]`` section.
|
||||
|
||||
:Mandatory: No
|
||||
|
||||
|
||||
Components Specific Variables
|
||||
"""""""""""""""""""""""""""""
|
||||
|
||||
The generator supports components and also downloaded components. However,
|
||||
there are some features of components that aren't supported yet (especially
|
||||
component dependencies). These variables are ignored for now.
|
||||
|
||||
CPack will change a component's name in Inno Setup if it has a parent group
|
||||
for technical reasons. Consider using ``group\component`` as component name in
|
||||
Inno Setup scripts if you have the component ``component`` and its parent
|
||||
group ``group``.
|
||||
|
||||
Here are some additional variables for components:
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_<compName>_INSTALL_DIRECTORY
|
||||
|
||||
If you don't want the component ``compName`` to be installed under ``{app}``,
|
||||
you've to specify its installation directory here.
|
||||
|
||||
:Mandatory: No
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_VERIFY_DOWNLOADS
|
||||
|
||||
This option only affects downloaded components.
|
||||
|
||||
If this option is turned on, the hashes of the downloaded archives are
|
||||
calculated during compile and
|
||||
download time. The installer will only proceed if they match.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: ``ON``
|
||||
|
||||
|
||||
Compilation and Scripting Specific Variables
|
||||
""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_EXECUTABLE
|
||||
|
||||
The filename of the Inno Setup Script Compiler command.
|
||||
|
||||
:Mandatory: Yes
|
||||
:Default: ``ISCC``
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_EXECUTABLE_ARGUMENTS
|
||||
|
||||
A :ref:`semicolon-separated list <CMake Language Lists>` of extra
|
||||
command-line options for the Inno Setup Script Compiler command.
|
||||
|
||||
For example: ``/Qp;/Smysigntool=$p``
|
||||
|
||||
Take care of the `escaping problem <https://cmake.org/cmake/help/book/mastering-cmake/chapter/Packaging%20With%20CPack.html#adding-custom-cpack-options>`_.
|
||||
|
||||
:Mandatory: No
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_DEFINE_<macro>
|
||||
|
||||
This group allows to add custom define directives as command-line options to
|
||||
the Inno Setup Preprocessor command. Each entry emulates a
|
||||
``#define public <macro>`` directive. Its macro is accessible from anywhere
|
||||
(``public``), so it can also be used in extra script files.
|
||||
|
||||
Macro names must not contain any special characters. Refer to the Inno Setup
|
||||
Preprocessor documentation for the detailed rules.
|
||||
|
||||
Consider the following example:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
# The following line emulates: #define public MyMacro "Hello, World!"
|
||||
set(CPACK_INNOSETUP_DEFINE_MyMacro "Hello, World!")
|
||||
|
||||
At this point, you can use ``MyMacro`` anywhere. For example in the following
|
||||
extra script:
|
||||
|
||||
.. code-block::
|
||||
|
||||
AppComments={#emit "'My Macro' has the value: " + MyMacro}
|
||||
|
||||
Take care of the `escaping problem <https://cmake.org/cmake/help/book/mastering-cmake/chapter/Packaging%20With%20CPack.html#adding-custom-cpack-options>`_.
|
||||
|
||||
:Mandatory: No
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_EXTRA_SCRIPTS
|
||||
|
||||
A :ref:`semicolon-separated list <CMake Language Lists>` of paths to
|
||||
additional ``.iss`` script files to be processed.
|
||||
|
||||
They're internally included at the top of the output script file using a
|
||||
``#include`` directive.
|
||||
|
||||
You can add any section in your file to extend the installer (e.g. adding
|
||||
additional tasks or registry keys). Prefer using
|
||||
:variable:`CPACK_INNOSETUP_SETUP_<directive>` when extending the
|
||||
``[Setup]`` section.
|
||||
|
||||
:Mandatory: No
|
||||
|
||||
.. variable:: CPACK_INNOSETUP_CODE_FILES
|
||||
|
||||
A :ref:`semicolon-separated list <CMake Language Lists>` of paths to
|
||||
additional Pascal files to be processed.
|
||||
|
||||
This variable is actually the same as
|
||||
:variable:`CPACK_INNOSETUP_EXTRA_SCRIPTS`, except you don't have to
|
||||
add ``[Code]`` at the top of your file. Never change the current section in
|
||||
a code file. This will result in undefined behavior! Treat them as normal
|
||||
Pascal scripts instead.
|
||||
|
||||
Code files are included at the very bottom of the output script.
|
||||
|
||||
:Mandatory: No
|
@ -20,6 +20,7 @@ Generators
|
||||
/cpack_gen/dmg
|
||||
/cpack_gen/external
|
||||
/cpack_gen/freebsd
|
||||
/cpack_gen/innosetup
|
||||
/cpack_gen/ifw
|
||||
/cpack_gen/nsis
|
||||
/cpack_gen/nuget
|
||||
|
12
Help/release/dev/cpack-innosetup.rst
Normal file
12
Help/release/dev/cpack-innosetup.rst
Normal file
@ -0,0 +1,12 @@
|
||||
cpack-innosetup
|
||||
---------------
|
||||
|
||||
* The :cpack_gen:`CPack Inno Setup Generator` was added to package using
|
||||
Inno Setup.
|
||||
|
||||
The new generator adds:
|
||||
|
||||
* A lot of options to customize the Inno Setup installer (e.g. custom
|
||||
installation rules)
|
||||
* Start menu and desktop shortcuts
|
||||
* Components (and also downloaded components)
|
@ -263,7 +263,7 @@ installers. The most commonly-used variables are:
|
||||
create Start Menu shortcuts. For example, setting this to the list
|
||||
``ccmake;CMake`` will create a shortcut named "CMake" that will execute the
|
||||
installed executable :program:`ccmake`. Not all CPack generators use it (at least
|
||||
NSIS, and WIX do).
|
||||
NSIS, Inno Setup and WIX do).
|
||||
|
||||
.. variable:: CPACK_STRIP_FILES
|
||||
|
||||
@ -740,12 +740,14 @@ if(NOT CPACK_GENERATOR)
|
||||
else()
|
||||
option(CPACK_BINARY_7Z "Enable to build 7-Zip packages" OFF)
|
||||
option(CPACK_BINARY_NSIS "Enable to build NSIS packages" ON)
|
||||
option(CPACK_BINARY_INNOSETUP "Enable to build Inno Setup packages" OFF)
|
||||
option(CPACK_BINARY_NUGET "Enable to build NuGet packages" OFF)
|
||||
option(CPACK_BINARY_WIX "Enable to build WiX packages" OFF)
|
||||
option(CPACK_BINARY_ZIP "Enable to build ZIP packages" OFF)
|
||||
mark_as_advanced(
|
||||
CPACK_BINARY_7Z
|
||||
CPACK_BINARY_NSIS
|
||||
CPACK_BINARY_INNOSETUP
|
||||
CPACK_BINARY_NUGET
|
||||
CPACK_BINARY_WIX
|
||||
CPACK_BINARY_ZIP
|
||||
@ -762,6 +764,7 @@ if(NOT CPACK_GENERATOR)
|
||||
cpack_optional_append(CPACK_GENERATOR CPACK_BINARY_FREEBSD FREEBSD)
|
||||
cpack_optional_append(CPACK_GENERATOR CPACK_BINARY_IFW IFW)
|
||||
cpack_optional_append(CPACK_GENERATOR CPACK_BINARY_NSIS NSIS)
|
||||
cpack_optional_append(CPACK_GENERATOR CPACK_BINARY_INNOSETUP INNOSETUP)
|
||||
cpack_optional_append(CPACK_GENERATOR CPACK_BINARY_NUGET NuGet)
|
||||
cpack_optional_append(CPACK_GENERATOR CPACK_BINARY_PRODUCTBUILD productbuild)
|
||||
cpack_optional_append(CPACK_GENERATOR CPACK_BINARY_RPM RPM)
|
||||
@ -869,6 +872,13 @@ if(NOT DEFINED CPACK_DMG_SLA_USE_RESOURCE_FILE_LICENSE
|
||||
unset(_CPack_CMP0133)
|
||||
endif()
|
||||
|
||||
# Inno Setup specific variables
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||
_cpack_set_default(CPACK_INNOSETUP_ARCHITECTURE "x86")
|
||||
elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
_cpack_set_default(CPACK_INNOSETUP_ARCHITECTURE "x64")
|
||||
endif()
|
||||
|
||||
# WiX specific variables
|
||||
_cpack_set_default(CPACK_WIX_SIZEOF_VOID_P "${CMAKE_SIZEOF_VOID_P}")
|
||||
|
||||
|
88
Modules/Internal/CPack/ISComponents.pas
Normal file
88
Modules/Internal/CPack/ISComponents.pas
Normal file
@ -0,0 +1,88 @@
|
||||
{ Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. }
|
||||
|
||||
function CPackGetCustomInstallationMessage(Param: String): String;
|
||||
begin
|
||||
Result := SetupMessage(msgCustomInstallation);
|
||||
end;
|
||||
|
||||
{ Downloaded components }
|
||||
#ifdef CPackDownloadCount
|
||||
const
|
||||
NO_PROGRESS_BOX = 4;
|
||||
RESPOND_YES_TO_ALL = 16;
|
||||
var
|
||||
CPackDownloadPage: TDownloadWizardPage;
|
||||
CPackShell: Variant;
|
||||
|
||||
<event('InitializeWizard')>
|
||||
procedure CPackInitializeWizard();
|
||||
begin
|
||||
CPackDownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), nil);
|
||||
CPackShell := CreateOleObject('Shell.Application');
|
||||
end;
|
||||
|
||||
<event('NextButtonClick')>
|
||||
function CPackNextButtonClick(CurPageID: Integer): Boolean;
|
||||
begin
|
||||
if CurPageID = wpReady then
|
||||
begin
|
||||
CPackDownloadPage.Clear;
|
||||
CPackDownloadPage.Show;
|
||||
|
||||
#sub AddDownload
|
||||
if WizardIsComponentSelected('{#CPackDownloadComponents[i]}') then
|
||||
#emit "CPackDownloadPage.Add('" + CPackDownloadUrls[i] + "', '" + CPackDownloadArchives[i] + ".zip', '" + CPackDownloadHashes[i] + "');"
|
||||
#endsub
|
||||
#define i
|
||||
#for {i = 0; i < CPackDownloadCount; i++} AddDownload
|
||||
#undef i
|
||||
|
||||
try
|
||||
try
|
||||
CPackDownloadPage.Download;
|
||||
Result := True;
|
||||
except
|
||||
if not CPackDownloadPage.AbortedByUser then
|
||||
SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
|
||||
|
||||
Result := False;
|
||||
end;
|
||||
finally
|
||||
CPackDownloadPage.Hide;
|
||||
end;
|
||||
end else
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
procedure CPackExtractFile(ArchiveName, FileName: String);
|
||||
var
|
||||
ZipFileName: String;
|
||||
ZipFile: Variant;
|
||||
Item: Variant;
|
||||
TargetFolderName: String;
|
||||
TargetFolder: Variant;
|
||||
begin
|
||||
TargetFolderName := RemoveBackslashUnlessRoot(ExpandConstant('{tmp}\' + ArchiveName + '\' + ExtractFileDir(FileName)));
|
||||
ZipFileName := ExpandConstant('{tmp}\' + ArchiveName + '.zip');
|
||||
|
||||
if not DirExists(TargetFolderName) then
|
||||
if not ForceDirectories(TargetFolderName) then
|
||||
RaiseException(Format('Target path "%s" cannot be created', [TargetFolderName]));
|
||||
|
||||
ZipFile := CPackShell.NameSpace(ZipFileName);
|
||||
if VarIsClear(ZipFile) then
|
||||
RaiseException(Format('Cannot open ZIP file "%s" or does not exist', [ZipFileName]));
|
||||
|
||||
Item := ZipFile.ParseName(FileName);
|
||||
if VarIsClear(Item) then
|
||||
RaiseException(Format('Cannot find "%s" in "%s" ZIP file', [FileName, ZipFileName]));
|
||||
|
||||
TargetFolder := CPackShell.NameSpace(TargetFolderName);
|
||||
if VarIsClear(TargetFolder) then
|
||||
RaiseException(Format('Target path "%s" does not exist', [TargetFolderName]));
|
||||
|
||||
TargetFolder.CopyHere(Item, NO_PROGRESS_BOX or RESPOND_YES_TO_ALL);
|
||||
end;
|
||||
|
||||
#endif
|
34
Modules/Internal/CPack/ISScript.template.in
Normal file
34
Modules/Internal/CPack/ISScript.template.in
Normal file
@ -0,0 +1,34 @@
|
||||
; Script generated by the CPack Inno Setup generator.
|
||||
; All changes made in this file will be lost when CPack is run again.
|
||||
|
||||
@CPACK_INNOSETUP_INCLUDES_INTERNAL@
|
||||
|
||||
[Setup]
|
||||
@CPACK_INNOSETUP_SETUP_INTERNAL@
|
||||
|
||||
[Languages]
|
||||
@CPACK_INNOSETUP_LANGUAGES_INTERNAL@
|
||||
|
||||
[Dirs]
|
||||
@CPACK_INNOSETUP_DIRS_INTERNAL@
|
||||
|
||||
[Files]
|
||||
@CPACK_INNOSETUP_FILES_INTERNAL@
|
||||
|
||||
[Types]
|
||||
@CPACK_INNOSETUP_TYPES_INTERNAL@
|
||||
|
||||
[Components]
|
||||
@CPACK_INNOSETUP_COMPONENTS_INTERNAL@
|
||||
|
||||
[Tasks]
|
||||
@CPACK_INNOSETUP_TASKS_INTERNAL@
|
||||
|
||||
[Icons]
|
||||
@CPACK_INNOSETUP_ICONS_INTERNAL@
|
||||
|
||||
[Run]
|
||||
@CPACK_INNOSETUP_RUN_INTERNAL@
|
||||
|
||||
[Code]
|
||||
@CPACK_INNOSETUP_CODE_INTERNAL@
|
@ -1018,6 +1018,7 @@ add_library(
|
||||
CPack/cmCPackGeneratorFactory.cxx
|
||||
CPack/cmCPackGenerator.cxx
|
||||
CPack/cmCPackLog.cxx
|
||||
CPack/cmCPackInnoSetupGenerator.cxx
|
||||
CPack/cmCPackNSISGenerator.cxx
|
||||
CPack/cmCPackNuGetGenerator.cxx
|
||||
CPack/cmCPackSTGZGenerator.cxx
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "cmCPackDebGenerator.h"
|
||||
#include "cmCPackExternalGenerator.h"
|
||||
#include "cmCPackGenerator.h"
|
||||
#include "cmCPackInnoSetupGenerator.h"
|
||||
#include "cmCPackLog.h"
|
||||
#include "cmCPackNSISGenerator.h"
|
||||
#include "cmCPackNuGetGenerator.h"
|
||||
@ -60,6 +61,10 @@ cmCPackGeneratorFactory::cmCPackGeneratorFactory()
|
||||
this->RegisterGenerator("STGZ", "Self extracting Tar GZip compression",
|
||||
cmCPackSTGZGenerator::CreateGenerator);
|
||||
}
|
||||
if (cmCPackInnoSetupGenerator::CanGenerate()) {
|
||||
this->RegisterGenerator("INNOSETUP", "Inno Setup packages",
|
||||
cmCPackInnoSetupGenerator::CreateGenerator);
|
||||
}
|
||||
if (cmCPackNSISGenerator::CanGenerate()) {
|
||||
this->RegisterGenerator("NSIS", "Null Soft Installer",
|
||||
cmCPackNSISGenerator::CreateGenerator);
|
||||
|
1159
Source/CPack/cmCPackInnoSetupGenerator.cxx
Normal file
1159
Source/CPack/cmCPackInnoSetupGenerator.cxx
Normal file
File diff suppressed because it is too large
Load Diff
116
Source/CPack/cmCPackInnoSetupGenerator.h
Normal file
116
Source/CPack/cmCPackInnoSetupGenerator.h
Normal file
@ -0,0 +1,116 @@
|
||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "cmCPackGenerator.h"
|
||||
#include "cmValue.h"
|
||||
|
||||
using cmCPackInnoSetupKeyValuePairs = std::map<std::string, std::string>;
|
||||
|
||||
class cmCPackComponentGroup;
|
||||
class cmCPackComponent;
|
||||
|
||||
/** \class cmCPackInnoSetupGenerator
|
||||
* \brief A generator for Inno Setup
|
||||
*
|
||||
* https://jrsoftware.org/isinfo.php
|
||||
*/
|
||||
class cmCPackInnoSetupGenerator : public cmCPackGenerator
|
||||
{
|
||||
public:
|
||||
cmCPackTypeMacro(cmCPackInnoSetupGenerator, cmCPackGenerator);
|
||||
|
||||
/**
|
||||
* Construct generator
|
||||
*/
|
||||
cmCPackInnoSetupGenerator();
|
||||
~cmCPackInnoSetupGenerator() override;
|
||||
|
||||
static bool CanGenerate();
|
||||
|
||||
protected:
|
||||
int InitializeInternal() override;
|
||||
int PackageFiles() override;
|
||||
|
||||
inline const char* GetOutputExtension() override { return ".exe"; }
|
||||
|
||||
inline cmCPackGenerator::CPackSetDestdirSupport SupportsSetDestdir()
|
||||
const override
|
||||
{
|
||||
return cmCPackGenerator::SETDESTDIR_UNSUPPORTED;
|
||||
}
|
||||
|
||||
inline bool SupportsAbsoluteDestination() const override { return false; }
|
||||
inline bool SupportsComponentInstallation() const override { return true; }
|
||||
|
||||
private:
|
||||
bool ProcessSetupSection();
|
||||
bool ProcessFiles();
|
||||
bool ProcessComponents();
|
||||
|
||||
bool ConfigureISScript();
|
||||
bool Compile();
|
||||
|
||||
bool BuildDownloadedComponentArchive(cmCPackComponent* component,
|
||||
const std::string& uploadDirectory,
|
||||
std::string* hash);
|
||||
|
||||
/**
|
||||
* Returns the option's value or an empty string if the option isn't set.
|
||||
*/
|
||||
cmValue RequireOption(const std::string& key);
|
||||
|
||||
std::string CustomComponentInstallDirectory(
|
||||
const cmCPackComponent* component);
|
||||
|
||||
/**
|
||||
* Translates boolean expressions into "yes" or "no", as required in
|
||||
* Inno Setup (only if "CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT" is on).
|
||||
*/
|
||||
std::string TranslateBool(const std::string& value);
|
||||
|
||||
/**
|
||||
* Creates a typical line of key and value pairs using the given map.
|
||||
*
|
||||
* (e.g.: Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}";
|
||||
* GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked)
|
||||
*/
|
||||
std::string ISKeyValueLine(const cmCPackInnoSetupKeyValuePairs& params);
|
||||
|
||||
std::string CreateRecursiveComponentPath(cmCPackComponentGroup* group,
|
||||
const std::string& path = "");
|
||||
|
||||
void CreateRecursiveComponentGroups(cmCPackComponentGroup* group);
|
||||
|
||||
/**
|
||||
* These functions add quotes if the given value hasn't already quotes.
|
||||
* Paths are converted into the format used by Windows before.
|
||||
*/
|
||||
std::string Quote(const std::string& string);
|
||||
std::string QuotePath(const std::string& path);
|
||||
|
||||
/**
|
||||
* This function replaces the following 5 characters with their %-encoding:
|
||||
* '|' '}' ',' '%' '"'
|
||||
* Required for Inno Setup constants like {cm:...}
|
||||
*/
|
||||
std::string PrepareForConstant(const std::string& string);
|
||||
|
||||
std::vector<std::string> includeDirectives;
|
||||
cmCPackInnoSetupKeyValuePairs setupDirectives;
|
||||
bool toplevelProgramFolder;
|
||||
std::vector<std::string> languageInstructions;
|
||||
std::vector<std::string> fileInstructions;
|
||||
std::vector<std::string> dirInstructions;
|
||||
std::vector<std::string> typeInstructions;
|
||||
std::vector<std::string> componentInstructions;
|
||||
std::vector<std::string> iconInstructions;
|
||||
std::vector<std::string> desktopIconComponents;
|
||||
std::vector<std::string> runInstructions;
|
||||
std::vector<std::string> codeIncludes;
|
||||
};
|
@ -986,6 +986,30 @@ if(BUILD_TESTING)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# On Windows run the CPackInnoSetupGenerator test
|
||||
if(WIN32 AND CMake_TEST_CPACK_INNOSETUP)
|
||||
add_test(CPackInnoSetupGenerator ${CMAKE_CTEST_COMMAND}
|
||||
-C \${CTEST_CONFIGURATION_TYPE}
|
||||
--build-and-test
|
||||
"${CMake_SOURCE_DIR}/Tests/CPackInnoSetupGenerator"
|
||||
"${CMake_BINARY_DIR}/Tests/CPackInnoSetupGenerator"
|
||||
${build_generator_args}
|
||||
--build-project CPackInnoSetupGenerator
|
||||
--build-options
|
||||
--test-command ${CMAKE_CMAKE_COMMAND}
|
||||
"-DCPackInnoSetupGenerator_BINARY_DIR:PATH=${CMake_BINARY_DIR}/Tests/CPackInnoSetupGenerator"
|
||||
"-Dconfig=\${CTEST_CONFIGURATION_TYPE}"
|
||||
-P "${CMake_SOURCE_DIR}/Tests/CPackInnoSetupGenerator/RunCPackVerifyResult.cmake")
|
||||
|
||||
set_property(TEST CPackInnoSetupGenerator PROPERTY
|
||||
ATTACHED_FILES_ON_FAIL
|
||||
"${CMake_BINARY_DIR}/Tests/CPackInnoSetupGenerator/_CPack_Packages/win32/INNOSETUP/ISCCOutput.log")
|
||||
|
||||
set_property(TEST CPackInnoSetupGenerator PROPERTY
|
||||
ATTACHED_FILES
|
||||
"${CMake_BINARY_DIR}/Tests/CPackInnoSetupGenerator/_CPack_Packages/win32/INNOSETUP/ISScript.iss")
|
||||
endif()
|
||||
|
||||
# On Windows run the CPackNSISGenerator test
|
||||
# if the nsis is available
|
||||
if(WIN32 AND NSIS_MAKENSIS_EXECUTABLE)
|
||||
|
55
Tests/CPackInnoSetupGenerator/CMakeLists.txt
Normal file
55
Tests/CPackInnoSetupGenerator/CMakeLists.txt
Normal file
@ -0,0 +1,55 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
project(CPackInnoSetupGenerator VERSION 42.0 HOMEPAGE_URL "https://www.example.com")
|
||||
|
||||
add_executable(hello main.c)
|
||||
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/empty)
|
||||
|
||||
install(TARGETS hello DESTINATION / COMPONENT application)
|
||||
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/empty DESTINATION / COMPONENT extras)
|
||||
install(FILES my_bitmap.bmp DESTINATION awesome COMPONENT extras)
|
||||
install(FILES my_file.txt DESTINATION / COMPONENT hidden_component)
|
||||
install(FILES my_file.txt DESTINATION / COMPONENT hidden_component2)
|
||||
|
||||
set(CPACK_GENERATOR "INNOSETUP")
|
||||
|
||||
set(CPACK_PACKAGE_NAME "Hello, World!") # Test constant escape (like {cm:...}, see code documentation)
|
||||
set(CPACK_PACKAGE_VENDOR "Sheldon Cooper")
|
||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "hello_world")
|
||||
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "hello_world")
|
||||
set(CPACK_PACKAGE_FILE_NAME "hello_world_setup")
|
||||
set(CPACK_SYSTEM_NAME "win32")
|
||||
set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/my_bitmap.bmp")
|
||||
set(CPACK_VERBATIM_VARIABLES ON)
|
||||
set(CPACK_PACKAGE_EXECUTABLES "hello" "Hello, World!")
|
||||
set(CPACK_CREATE_DESKTOP_LINKS hello)
|
||||
|
||||
set(CPACK_INNOSETUP_INSTALL_ROOT "{autopf}\\Sheldon Cooper")
|
||||
set(CPACK_INNOSETUP_PROGRAM_MENU_FOLDER ".")
|
||||
set(CPACK_INNOSETUP_IGNORE_LICENSE_PAGE ON)
|
||||
set(CPACK_INNOSETUP_IGNORE_README_PAGE OFF) # Test if only readme page is shown
|
||||
set(CPACK_INNOSETUP_SETUP_AppComments ON) # Test if CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT works
|
||||
set(CPACK_INNOSETUP_CUSTOM_INSTALL_INSTRUCTIONS "extras/empty"
|
||||
"Name: \"{userdocs}\\empty\"\; Check: ReturnTrue\; Components: accessories\\extras")
|
||||
set(CPACK_INNOSETUP_MENU_LINKS "https://www.example.com" "Web"
|
||||
"my_file.txt" "Text")
|
||||
set(CPACK_INNOSETUP_RUN_EXECUTABLES hello)
|
||||
set(CPACK_INNOSETUP_CREATE_UNINSTALL_LINK ON)
|
||||
# Test if this macro is available in the code file below containing the check function
|
||||
set(CPACK_INNOSETUP_DEFINE_PascalMacro "end;")
|
||||
set(CPACK_INNOSETUP_CODE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/Code.pas")
|
||||
set(CPACK_INNOSETUP_EXECUTABLE "ISCC.exe")
|
||||
|
||||
include(CPackComponent)
|
||||
|
||||
cpack_add_install_type(basic DISPLAY_NAME "Basic installation")
|
||||
cpack_add_install_type(full DISPLAY_NAME "\"Large\" installation") # Test double quote syntax
|
||||
cpack_add_component_group(accessories DISPLAY_NAME "Accessories")
|
||||
|
||||
cpack_add_component(application DISPLAY_NAME "Application" INSTALL_TYPES basic full REQUIRED)
|
||||
cpack_add_component(extras DISPLAY_NAME "Additional components" INSTALL_TYPES full GROUP accessories)
|
||||
cpack_add_component(hidden_component HIDDEN)
|
||||
cpack_add_component(hidden_component2 HIDDEN DISABLED)
|
||||
set(CPACK_INNOSETUP_extras_INSTALL_DIRECTORY "{userdocs}")
|
||||
|
||||
include(CPack)
|
4
Tests/CPackInnoSetupGenerator/Code.pas
Normal file
4
Tests/CPackInnoSetupGenerator/Code.pas
Normal file
@ -0,0 +1,4 @@
|
||||
function ReturnTrue(): Boolean;
|
||||
begin
|
||||
Result := true;
|
||||
{#PascalMacro}
|
136
Tests/CPackInnoSetupGenerator/RunCPackVerifyResult.cmake
Normal file
136
Tests/CPackInnoSetupGenerator/RunCPackVerifyResult.cmake
Normal file
@ -0,0 +1,136 @@
|
||||
message(STATUS "=============================================================")
|
||||
message(STATUS "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)")
|
||||
message(STATUS "")
|
||||
|
||||
if(NOT CPackInnoSetupGenerator_BINARY_DIR)
|
||||
message(FATAL_ERROR "CPackInnoSetupGenerator_BINARY_DIR not set")
|
||||
endif()
|
||||
|
||||
message(STATUS "CMAKE_COMMAND: ${CMAKE_COMMAND}")
|
||||
message(STATUS "CMAKE_CPACK_COMMAND: ${CMAKE_CPACK_COMMAND}")
|
||||
message(STATUS "CPackInnoSetupGenerator_BINARY_DIR: ${CPackInnoSetupGenerator_BINARY_DIR}")
|
||||
|
||||
if(config)
|
||||
set(_C_config -C ${config})
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND "${CMAKE_CPACK_COMMAND}"
|
||||
${_C_config}
|
||||
RESULT_VARIABLE CPack_result
|
||||
OUTPUT_VARIABLE CPack_output
|
||||
ERROR_VARIABLE CPack_output
|
||||
WORKING_DIRECTORY "${CPackInnoSetupGenerator_BINARY_DIR}")
|
||||
|
||||
if(CPack_result)
|
||||
message(FATAL_ERROR "CPack execution went wrong!, Output: ${CPack_output}")
|
||||
else ()
|
||||
message(STATUS "Output: ${CPack_output}")
|
||||
endif()
|
||||
|
||||
file(GLOB project_file "${CPackInnoSetupGenerator_BINARY_DIR}/_CPack_Packages/win32/INNOSETUP/ISScript.iss")
|
||||
file(GLOB installer_file "${CPackInnoSetupGenerator_BINARY_DIR}/_CPack_Packages/win32/INNOSETUP/hello_world_setup.exe")
|
||||
|
||||
message(STATUS "Project file: '${project_file}'")
|
||||
message(STATUS "Installer file: '${installer_file}'")
|
||||
|
||||
if(NOT project_file)
|
||||
message(FATAL_ERROR "Project file does not exist")
|
||||
endif()
|
||||
|
||||
if(NOT installer_file)
|
||||
message(FATAL_ERROR "Installer file does not exist")
|
||||
endif()
|
||||
|
||||
# Test if the correct registry key is set
|
||||
file(STRINGS "${project_file}" results REGEX "^AppId=hello_world$")
|
||||
if(results STREQUAL "")
|
||||
message(FATAL_ERROR "CPACK_PACKAGE_INSTALL_REGISTRY_KEY doesn't match AppId")
|
||||
endif()
|
||||
|
||||
# Test if only readme page is shown
|
||||
file(STRINGS "${project_file}" results REGEX "^LicenseFile=")
|
||||
file(STRINGS "${project_file}" results2 REGEX "^InfoBeforeFile=")
|
||||
if(NOT results STREQUAL "" OR results2 STREQUAL "")
|
||||
message(FATAL_ERROR "Erroneous output with license and readme files")
|
||||
endif()
|
||||
|
||||
# Test if classic style is used by default
|
||||
file(STRINGS "${project_file}" results REGEX "compiler:SetupClassicIcon\\.ico")
|
||||
file(STRINGS "${project_file}" results2 REGEX "compiler:WizClassicImage\\.bmp")
|
||||
if(results STREQUAL "" OR results2 STREQUAL "")
|
||||
message(FATAL_ERROR "Images of classic style not used")
|
||||
endif()
|
||||
|
||||
# Test if the top-level start menu folder is used
|
||||
file(STRINGS "${project_file}" results REGEX "{autoprograms}")
|
||||
file(STRINGS "${project_file}" results2 REGEX "{group}")
|
||||
if(results STREQUAL "" OR NOT results2 STREQUAL "")
|
||||
message(FATAL_ERROR "Top-level start menu folder not used")
|
||||
endif()
|
||||
|
||||
# Test CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT
|
||||
file(STRINGS "${project_file}" results REGEX "^AppComments=yes$")
|
||||
if(results STREQUAL "")
|
||||
message(FATAL_ERROR "CPACK_INNOSETUP_USE_CMAKE_BOOL_FORMAT doesn't convert booleans")
|
||||
endif()
|
||||
|
||||
# Test the custom installation rule
|
||||
file(STRINGS "${project_file}" results REGEX "^Name: \"{userdocs}\\\\empty\"; Check: ReturnTrue; Components: accessories\\\\extras$")
|
||||
if(results STREQUAL "")
|
||||
message(FATAL_ERROR "Custom installation rule not found or incomplete")
|
||||
endif()
|
||||
|
||||
# Test if an uninstall shortcut has been created
|
||||
file(STRINGS "${project_file}" results REGEX "{uninstallexe}")
|
||||
if(results STREQUAL "")
|
||||
message(FATAL_ERROR "No uninstall shortcut created")
|
||||
endif()
|
||||
|
||||
# Test CPACK_INNOSETUP_<compName>_INSTALL_DIRECTORY
|
||||
file(STRINGS "${project_file}" results REGEX "{app}.*Components: accessories\\\\extras")
|
||||
if(NOT results STREQUAL "")
|
||||
message(FATAL_ERROR "Component not in custom install directory")
|
||||
endif()
|
||||
|
||||
# Test if component names are nested correctly
|
||||
file(STRINGS "${project_file}" results REGEX "Components:.* extras")
|
||||
if(NOT results STREQUAL "")
|
||||
message(FATAL_ERROR "Component names must contain their parent groups according to the documentation")
|
||||
endif()
|
||||
|
||||
# Test if custom installation type exists
|
||||
file(STRINGS "${project_file}" results REGEX "Flags: .*iscustom")
|
||||
if(results STREQUAL "")
|
||||
message(FATAL_ERROR "Custom installation type doesn't exist")
|
||||
endif()
|
||||
|
||||
# Test if hidden components are processed but not displayed
|
||||
file(STRINGS "${project_file}" results REGEX "Source:.+hidden_component\\\\my_file\\.txt")
|
||||
file(STRINGS "${project_file}" results2 REGEX "Name: \"hidden_component\"")
|
||||
if(results STREQUAL "" OR NOT results2 STREQUAL "")
|
||||
message(FATAL_ERROR "Hidden component displayed or one of its files ignored")
|
||||
endif()
|
||||
|
||||
# Test if disabled and hidden components are ignored at all
|
||||
file(STRINGS "${project_file}" results REGEX "Source:.+hidden_component2\\\\my_file\\.txt")
|
||||
if(NOT results STREQUAL "")
|
||||
message(FATAL_ERROR "Disabled and hidden component not ignored")
|
||||
endif()
|
||||
|
||||
# Test if required components ignore their installation types
|
||||
file(STRINGS "${project_file}" results REGEX "Types: (basic|full|custom|basic full|full basic|basic custom|full custom); Flags: fixed")
|
||||
if(NOT results STREQUAL "")
|
||||
message(FATAL_ERROR "Required components don't ignore their installation types")
|
||||
endif()
|
||||
|
||||
# Test constant escape (should contain Hello%2c World!)
|
||||
file(STRINGS "${project_file}" results REGEX "Hello%2c World!")
|
||||
if(results STREQUAL "")
|
||||
message(FATAL_ERROR "The comma character isn't escaped to %2c")
|
||||
endif()
|
||||
|
||||
# Test double quote syntax
|
||||
file(STRINGS "${project_file}" results REGEX "\"\"Large\"\"")
|
||||
if(results STREQUAL "")
|
||||
message(FATAL_ERROR "The quote character isn't escaped correctly")
|
||||
endif()
|
7
Tests/CPackInnoSetupGenerator/main.c
Normal file
7
Tests/CPackInnoSetupGenerator/main.c
Normal file
@ -0,0 +1,7 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("Hello, World!\n");
|
||||
return 42;
|
||||
}
|
BIN
Tests/CPackInnoSetupGenerator/my_bitmap.bmp
Normal file
BIN
Tests/CPackInnoSetupGenerator/my_bitmap.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.1 KiB |
1
Tests/CPackInnoSetupGenerator/my_file.txt
Normal file
1
Tests/CPackInnoSetupGenerator/my_file.txt
Normal file
@ -0,0 +1 @@
|
||||
Hello, World!
|
Loading…
Reference in New Issue
Block a user