CPack AppImage generator
------------------------

.. versionadded:: 4.2

CPack `AppImage`_ generator allows to bundle an application into
AppImage format. It uses ``appimagetool`` to pack the application,
and ``patchelf`` to set the application ``RPATH`` to a relative path
based on where the AppImage will be mounted.

.. _`AppImage`: https://appimage.org

The ``appimagetool`` does not scan for libraries dependencies it only
packs the installed content and check if the provided ``.desktop`` file
was properly created. For best compatibility it's recommended to choose
some old LTS distro and built it there, as well as including most
dependencies on the generated file.

The snipped below can be added to your ``CMakeLists.txt`` file
replacing ``my_application_target`` with your application target,
it will do a best effort to scan and copy the libraries your
application links to and copy to install location.

.. code-block:: cmake

  install(CODE [[
      file(GET_RUNTIME_DEPENDENCIES
          EXECUTABLES $<TARGET_FILE:my_application_target>
          RESOLVED_DEPENDENCIES_VAR resolved_deps
      )

      foreach(dep ${resolved_deps})
          # copy the symlink
          file(COPY ${dep} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)

          # Resolve the real path of the dependency (follows symlinks)
          file(REAL_PATH ${dep} resolved_dep_path)

          # Copy the resolved file to the destination
          file(COPY ${resolved_dep_path} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
      endforeach()
  ]])

For Qt based projects it's recommended to call
``qt_generate_deploy_app_script()`` or ``qt_generate_deploy_qml_app_script()``
and install the files generated by the script, this will install
Qt module's plugins.

You must also set :variable:`CPACK_PACKAGE_ICON` with the same value
listed in the Desktop file.

Variables specific to CPack AppImage generator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. variable:: CPACK_APPIMAGE_TOOL_EXECUTABLE

  Name of the ``appimagetool`` executable, might be located in the build dir,
  full path or reachable in ``PATH``.

  :Default: ``appimagetool`` :variable:`CPACK_PACKAGE_FILE_NAME`

.. variable:: CPACK_APPIMAGE_PATCHELF_EXECUTABLE

  Name of the ``patchelf`` executable, might be located in the build dir,
  full path or reachable in ``PATH``.

  :Default: ``patchelf`` :variable:`CPACK_APPIMAGE_PATCHELF_EXECUTABLE`

.. variable:: CPACK_APPIMAGE_DESKTOP_FILE

  Name of freedesktop.org desktop file installed.

  :Mandatory: Yes
  :Default: :variable:`CPACK_APPIMAGE_DESKTOP_FILE`

.. variable:: CPACK_APPIMAGE_UPDATE_INFORMATION

  Embed update information STRING; if zsyncmake is installed,
  generate zsync file.

  :Default: :variable:`CPACK_APPIMAGE_UPDATE_INFORMATION`

.. variable:: CPACK_APPIMAGE_GUESS_UPDATE_INFORMATION

  Guess update information based on GitHub or GitLab environment variables.

  :Default: :variable:`CPACK_APPIMAGE_GUESS_UPDATE_INFORMATION`

.. variable:: CPACK_APPIMAGE_COMPRESSOR

  Squashfs compression.

  :Default: :variable:`CPACK_APPIMAGE_COMPRESSOR`

.. variable:: CPACK_APPIMAGE_MKSQUASHFS_OPTIONS

  Arguments to pass through to mksquashfs.

  :Default: :variable:`CPACK_APPIMAGE_MKSQUASHFS_OPTIONS`

.. variable:: CPACK_APPIMAGE_NO_APPSTREAM

  Do not check AppStream metadata.

  :Default: :variable:`CPACK_APPIMAGE_NO_APPSTREAM`

.. variable:: CPACK_APPIMAGE_EXCLUDE_FILE

  Uses given file as exclude file for mksquashfs,
  in addition to .appimageignore.

  :Default: :variable:`CPACK_APPIMAGE_EXCLUDE_FILE`

.. variable:: CPACK_APPIMAGE_RUNTIME_FILE

  Runtime file to use, if not set a bash script will be generated.

  :Default: :variable:`CPACK_APPIMAGE_RUNTIME_FILE`

.. variable:: CPACK_APPIMAGE_SIGN

  Sign with gpg[2].

  :Default: :variable:`CPACK_APPIMAGE_SIGN`

.. variable:: CPACK_APPIMAGE_SIGN_KEY

  Key ID to use for gpg[2] signatures.

  :Default: :variable:`CPACK_APPIMAGE_SIGN_KEY`
