monado/cmake/GenerateOpenXRRuntimeManifest.cmake
Ryan Pavlik c718d69dae cmake: Put the manifest generation in a CMake module.
Will make it easier to modify/customize and
integrate the trampoline.
2022-04-21 17:17:16 -05:00

121 lines
4.8 KiB
CMake

# Copyright 2019-2022, Collabora, Ltd.
# SPDX-License-Identifier: BSL-1.0
#[[.rst:
GenerateOpenXRRuntimeManifest
---------------
The following functions are provided by this module:
- :command:`generate_openxr_runtime_manifest_buildtree`
- :command:`generate_openxr_runtime_manifest_at_install`
.. command:: generate_openxr_runtime_manifest_buildtree
Generates a runtime manifest suitable for use in the build tree,
with absolute paths, at configure time::
generate_openxr_runtime_manifest_buildtree(
RUNTIME_TARGET <target> # Name of your runtime target
OUT_FILE <outfile> # Name of the manifest file (with path) to generate
[MANIFEST_TEMPLATE <template>] # Optional: Specify an alternate template to use
)
.. command:: generate_openxr_runtime_manifest_at_install
Generates a runtime manifest at install time and installs it where desired::
generate_openxr_runtime_manifest_buildtree(
RUNTIME_TARGET <target> # Name of your runtime target
DESTINATION <dest> # The install-prefix-relative path to install the manifest to.
RELATIVE_RUNTIME_DIR <dir> # The install-prefix-relative path that the runtime library is installed to.
[ABSOLUTE_RUNTIME_PATH| # If present, path in generated manifest is absolute
RUNTIME_DIR_RELATIVE_TO_MANIFEST <dir>]
# If present (and ABSOLUTE_RUNTIME_PATH not present), specifies the
# runtime directory relative to the manifest directory in the installed layout
[OUT_FILENAME <outfilename> # Optional: Alternate name of the manifest file to generate
[MANIFEST_TEMPLATE <template>] # Optional: Specify an alternate template to use
)
#]]
get_filename_component(_OXR_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
set(_OXR_MANIFEST_SCRIPT
"${_OXR_CMAKE_DIR}/GenerateOpenXRRuntimeManifestInstall.cmake.in"
CACHE INTERNAL "" FORCE)
set(_OXR_MANIFEST_TEMPLATE
"${_OXR_CMAKE_DIR}/openxr_monado.in.json"
CACHE INTERNAL "" FORCE)
function(generate_openxr_runtime_manifest_buildtree)
set(options)
set(oneValueArgs RUNTIME_TARGET OUT_FILE MANIFEST_TEMPLATE)
set(multiValueArgs)
cmake_parse_arguments(_genmanifest "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
if(NOT _genmanifest_RUNTIME_TARGET)
message(FATAL_ERROR "Need RUNTIME_TARGET specified!")
endif()
if(NOT _genmanifest_OUT_FILE)
message(FATAL_ERROR "Need OUT_FILE specified!")
endif()
if(NOT _genmanifest_MANIFEST_TEMPLATE)
set(_genmanifest_MANIFEST_TEMPLATE "${_OXR_MANIFEST_TEMPLATE}")
endif()
# Set template values
# SHELL_PATH isn't perfect here, we actually always want backslashes on Windows,
# but it's the closest we have in generator expressions.
set(runtime_path $<SHELL_PATH:$<TARGET_FILE:${_genmanifest_RUNTIME_TARGET}>>)
# Need this step because file(GENERATE) only evaluates generator expressions, and not what configure_file does.
set(_intermediate
${CMAKE_CURRENT_BINARY_DIR}/intermediate_manifest_buildtree_${_genmanifest_RUNTIME_TARGET}.json
)
configure_file("${_genmanifest_MANIFEST_TEMPLATE}" "${_intermediate}" @ONLY)
file(
GENERATE
OUTPUT "${_genmanifest_OUT_FILE}"
INPUT "${_intermediate}")
endfunction()
function(generate_openxr_runtime_manifest_at_install)
set(options ABSOLUTE_RUNTIME_PATH)
set(oneValueArgs
RUNTIME_TARGET DESTINATION OUT_FILENAME
RUNTIME_DIR_RELATIVE_TO_MANIFEST RELATIVE_RUNTIME_DIR MANIFEST_TEMPLATE)
set(multiValueArgs)
cmake_parse_arguments(_genmanifest "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
if(NOT _genmanifest_RUNTIME_TARGET)
message(FATAL_ERROR "Need RUNTIME_TARGET specified!")
endif()
if(NOT _genmanifest_DESTINATION)
message(FATAL_ERROR "Need DESTINATION specified!")
endif()
if(NOT _genmanifest_RELATIVE_RUNTIME_DIR)
message(FATAL_ERROR "Need RELATIVE_RUNTIME_DIR specified!")
endif()
if(NOT _genmanifest_OUT_FILENAME)
set(_genmanifest_OUT_FILENAME "${_genmanifest_RUNTIME_TARGET}.json")
endif()
if(NOT _genmanifest_MANIFEST_TEMPLATE)
set(_genmanifest_MANIFEST_TEMPLATE "${_OXR_MANIFEST_TEMPLATE}")
endif()
set(_genmanifest_INTERMEDIATE_MANIFEST
"${CMAKE_CURRENT_BINARY_DIR}/${_genmanifest_OUT_FILENAME}")
# Template value
set(RUNTIME_FILENAME
${CMAKE_SHARED_MODULE_PREFIX}${_genmanifest_RUNTIME_TARGET}${CMAKE_SHARED_MODULE_SUFFIX}
)
set(_script
${CMAKE_CURRENT_BINARY_DIR}/make_manifest_${_genmanifest_RUNTIME_TARGET}.cmake
)
configure_file("${_OXR_MANIFEST_SCRIPT}" "${_script}" @ONLY)
install(SCRIPT "${_script}")
endfunction()