# Copyright 2019-2023, Collabora, Ltd.
#
# SPDX-License-Identifier: BSL-1.0
#
# Maintained by:
# 2019-2023 Rylie Pavlik <rylie.pavlik@collabora.com> <rylie@ryliepavlik.com>

#[[.rst:
GenerateVulkanApiLayerManifest
---------------

The following functions are provided by this module:

- :command:`generate_vulkan_api_layer_manifest_buildtree`
- :command:`generate_vulkan_api_layer_manifest_at_install`


.. command:: generate_vulkan_api_layer_manifest_buildtree

  Generates a layer manifest suitable for use in the build tree,
  with absolute paths, at configure time::

    generate_vulkan_api_layer_manifest_buildtree(
        MANIFEST_TEMPLATE <template>     # The template for your manifest file
        LAYER_TARGET <target>            # Name of your layer target
        OUT_FILE <outfile>               # Name of the manifest file (with path) to generate
        )


.. command:: generate_vulkan_api_layer_manifest_at_install

  Generates a layer manifest at install time and installs it where desired::

    generate_vulkan_api_layer_manifest_at_install(
        MANIFEST_TEMPLATE <template>       # The template for your manifest file
        LAYER_TARGET <target>              # Name of your layer target
        DESTINATION <dest>                 # The install-prefix-relative path to install the manifest to.
        RELATIVE_LAYER_DIR <dir>           # The install-prefix-relative path that the layer library is installed to.
        [COMPONENT <comp>]                 # If present, the component to place the manifest in.
        [ABSOLUTE_LAYER_PATH|              # If present, path in generated manifest is absolute
         LAYER_DIR_RELATIVE_TO_MANIFEST <dir>]
                                           # If present (and ABSOLUTE_LAYER_PATH not present), specifies the
                                           # layer directory relative to the manifest directory in the installed layout
        [OUT_FILENAME <outfilename>        # Optional: Alternate name of the manifest file to generate
        )
#]]

# This module is mostly just argument parsing, the guts are in GenerateKhrManifest

get_filename_component(_VK_MANIFEST_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
include("${_VK_MANIFEST_CMAKE_DIR}/GenerateKhrManifest.cmake")

function(generate_vulkan_api_layer_manifest_buildtree)
    set(options)
    set(oneValueArgs MANIFEST_TEMPLATE LAYER_TARGET OUT_FILE)
    set(multiValueArgs)
    cmake_parse_arguments(_genmanifest "${options}" "${oneValueArgs}"
                          "${multiValueArgs}" ${ARGN})

    if(NOT _genmanifest_MANIFEST_TEMPLATE)
        message(FATAL_ERROR "Need MANIFEST_TEMPLATE specified!")
    endif()
    if(NOT _genmanifest_LAYER_TARGET)
        message(FATAL_ERROR "Need LAYER_TARGET specified!")
    endif()
    if(NOT _genmanifest_OUT_FILE)
        message(FATAL_ERROR "Need OUT_FILE specified!")
    endif()

    generate_khr_manifest_buildtree(
        MANIFEST_DESCRIPTION
        "Vulkan API layer manifest"
        MANIFEST_TEMPLATE
        "${_genmanifest_MANIFEST_TEMPLATE}"
        TARGET
        "${_genmanifest_LAYER_TARGET}"
        OUT_FILE
        "${_genmanifest_OUT_FILE}")

endfunction()

function(generate_vulkan_api_layer_manifest_at_install)
    set(options ABSOLUTE_LAYER_PATH)
    set(oneValueArgs
        MANIFEST_TEMPLATE
        DESTINATION
        OUT_FILENAME
        COMPONENT
        LAYER_TARGET
        LAYER_DIR_RELATIVE_TO_MANIFEST
        RELATIVE_LAYER_DIR)
    set(multiValueArgs)
    cmake_parse_arguments(_genmanifest "${options}" "${oneValueArgs}"
                          "${multiValueArgs}" ${ARGN})

    if(NOT _genmanifest_MANIFEST_TEMPLATE)
        message(FATAL_ERROR "Need MANIFEST_TEMPLATE specified!")
    endif()
    if(NOT _genmanifest_LAYER_TARGET)
        message(FATAL_ERROR "Need LAYER_TARGET specified!")
    endif()
    if(NOT _genmanifest_DESTINATION)
        message(FATAL_ERROR "Need DESTINATION specified!")
    endif()
    if(NOT _genmanifest_RELATIVE_LAYER_DIR)
        message(FATAL_ERROR "Need RELATIVE_LAYER_DIR specified!")
    endif()
    if(NOT _genmanifest_OUT_FILENAME)
        set(_genmanifest_OUT_FILENAME "${_genmanifest_LAYER_TARGET}.json")
    endif()

    set(_genmanifest_fwdargs)

    if(_genmanifest_ABSOLUTE_LAYER_PATH)
        list(APPEND _genmanifest_fwdargs ABSOLUTE_TARGET_PATH)
    endif()

    if(_genmanifest_LAYER_DIR_RELATIVE_TO_MANIFEST)
        list(APPEND _genmanifest_fwdargs TARGET_DIR_RELATIVE_TO_MANIFEST
             "${_genmanifest_LAYER_DIR_RELATIVE_TO_MANIFEST}")
    endif()
    if(_genmanifest_COMPONENT)
        list(APPEND _genmanifest_fwdargs COMPONENT "${_genmanifest_COMPONENT}")
    endif()

    generate_khr_manifest_at_install(
        ${_genmanifest_fwdargs}
        MANIFEST_DESCRIPTION
        "Vulkan API layer manifest"
        MANIFEST_TEMPLATE
        "${_genmanifest_MANIFEST_TEMPLATE}"
        TARGET
        "${_genmanifest_LAYER_TARGET}"
        DESTINATION
        "${_genmanifest_DESTINATION}"
        RELATIVE_TARGET_DIR
        "${_genmanifest_RELATIVE_LAYER_DIR}"
        OUT_FILENAME
        "${_genmanifest_OUT_FILENAME}")
endfunction()