mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2024-12-28 02:26:16 +00:00
149 lines
5.8 KiB
CMake
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()
|