monado/cmake/GenerateKhrManifest.cmake
2023-12-18 14:29:02 -06:00

149 lines
5.8 KiB
CMake

# 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:
GenerateKhrManifest
-------------------
This is a utility module, usually wrapped by more usage-specific modules.
The general goal is to be able to generate a (JSON) manifest describing targets
with some absolute, relative, or unspecified path, such as required by the OpenXR
and Vulkan loaders for runtimes and API layers.
The following functions are provided by this module:
- :command:`generate_khr_manifest_buildtree`
- :command:`generate_khr_manifest_at_install`
.. command:: generate_khr_manifest_buildtree
Generates a manifest suitable for use in the build tree,
with absolute paths, at configure time::
generate_khr_manifest_buildtree(
MANIFEST_TEMPLATE <template> # The template for your manifest file
TARGET <target> # Name of your target (layer, runtime, etc)
OUT_FILE <outfile> # Name of the manifest file (with path) to generate
MANIFEST_DESCRIPTION "<desc>" # A brief description of the thing we're generating (e.g. "Vulkan API layer manifest")
)
.. command:: generate_khr_manifest_at_install
Generates a manifest at install time and installs it where desired::
generate_khr_manifest_at_install(
MANIFEST_TEMPLATE <template> # The template for your manifest file
TARGET <target> # Name of your target (layer, runtime, etc)
DESTINATION <dest> # The install-prefix-relative path to install the manifest to.
RELATIVE_TARGET_DIR <dir> # The install-prefix-relative path that the target library is installed to.
MANIFEST_DESCRIPTION "<desc>" # A brief description of the thing we're generating (e.g. "Vulkan API layer manifest")
[COMPONENT <comp>] # If present, the component to place the manifest in.
[ABSOLUTE_TARGET_PATH| # If present, path in generated manifest is absolute
TARGET_DIR_RELATIVE_TO_MANIFEST <dir>]
# If present (and ABSOLUTE_TARGET_PATH not present), specifies the
# target directory relative to the manifest directory in the installed layout
[OUT_FILENAME <outfilename> # Optional: Alternate name of the manifest file to generate (defaults to target name + .json)
)
#]]
get_filename_component(_KHR_MANIFEST_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}"
PATH)
set(_KHR_MANIFEST_SCRIPT
"${_KHR_MANIFEST_CMAKE_DIR}/GenerateKhrManifestInternals.cmake.in"
CACHE INTERNAL "" FORCE)
function(generate_khr_manifest_buildtree)
set(options)
set(oneValueArgs MANIFEST_TEMPLATE TARGET OUT_FILE MANIFEST_DESCRIPTION)
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_TARGET)
message(FATAL_ERROR "Need TARGET specified!")
endif()
if(NOT _genmanifest_OUT_FILE)
message(FATAL_ERROR "Need OUT_FILE specified!")
endif()
if(NOT _genmanifest_MANIFEST_DESCRIPTION)
message(FATAL_ERROR "Need MANIFEST_DESCRIPTION specified!")
endif()
# Set template values
set(_genmanifest_INTERMEDIATE_MANIFEST
${CMAKE_CURRENT_BINARY_DIR}/intermediate_manifest_buildtree_${_genmanifest_TARGET}.json
)
set(_genmanifest_IS_INSTALL OFF)
set(_script
${CMAKE_CURRENT_BINARY_DIR}/make_build_manifest_${_genmanifest_TARGET}.cmake
)
configure_file("${_KHR_MANIFEST_SCRIPT}" "${_script}" @ONLY)
add_custom_command(
TARGET ${_genmanifest_TARGET}
POST_BUILD
BYPRODUCTS "${_genmanifest_OUT_FILE}"
COMMAND
"${CMAKE_COMMAND}" "-DOUT_FILE=${_genmanifest_OUT_FILE}"
"-DTARGET_PATH=$<TARGET_FILE:${_genmanifest_TARGET}>" -P
"${_script}" DEPENDS "${_script}"
COMMENT
"Generating ${_genmanifest_MANIFEST_DESCRIPTION} named ${_genmanifest_OUT_FILE} for build tree usage"
)
endfunction()
function(generate_khr_manifest_at_install)
set(options ABSOLUTE_TARGET_PATH)
set(oneValueArgs
MANIFEST_TEMPLATE
TARGET
DESTINATION
OUT_FILENAME
TARGET_DIR_RELATIVE_TO_MANIFEST
RELATIVE_TARGET_DIR
MANIFEST_DESCRIPTION
COMPONENT)
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_TARGET)
message(FATAL_ERROR "Need TARGET specified!")
endif()
if(NOT _genmanifest_DESTINATION)
message(FATAL_ERROR "Need DESTINATION specified!")
endif()
if(NOT _genmanifest_RELATIVE_TARGET_DIR)
message(FATAL_ERROR "Need RELATIVE_TARGET_DIR specified!")
endif()
if(NOT _genmanifest_OUT_FILENAME)
set(_genmanifest_OUT_FILENAME "${_genmanifest_TARGET}.json")
endif()
if(NOT _genmanifest_COMPONENT)
set(_genmanifest_COMPONENT Unspecified)
endif()
set(_genmanifest_INTERMEDIATE_MANIFEST
"${CMAKE_CURRENT_BINARY_DIR}/${_genmanifest_OUT_FILENAME}")
set(_genmanifest_IS_INSTALL ON)
# Template value
set(TARGET_FILENAME
${CMAKE_SHARED_MODULE_PREFIX}${_genmanifest_TARGET}${CMAKE_SHARED_MODULE_SUFFIX}
)
set(_script
${CMAKE_CURRENT_BINARY_DIR}/make_manifest_${_genmanifest_TARGET}.cmake)
configure_file("${_KHR_MANIFEST_SCRIPT}" "${_script}" @ONLY)
install(SCRIPT "${_script}" COMPONENT ${_genmanifest_COMPONENT})
endfunction()