Files
2026-06-14 19:09:18 +01:00

136 lines
4.1 KiB
CMake

#[============================================================================
# Copyright 2022, Khronos Group, Inc.
# SPDX-License-Identifier: Apache-2.0
#============================================================================]
# Functions to convert unix-style paths into paths useable by cmake on windows.
#[=======================================================================[.rst:
Findsigntool
-------
Finds the signtool executable used for codesigning on Windows.
Note that signtool does not offer a way to make it print its version
so version selection and reporting is not possible.
Result Variables
^^^^^^^^^^^^^^^^
This will define the following variables:
``signtool_FOUND``
True if the system has the signtool executable.
``signtool_EXECUTABLE``
The signtool command executable.
#]=======================================================================]
if (WIN32 AND CMAKE_HOST_SYSTEM_NAME MATCHES "CYGWIN.*")
find_program(CYGPATH
NAMES cygpath
HINTS [HKEY_LOCAL_MACHINE\\Software\\Cygwin\\setup;rootdir]/bin
PATHS C:/cygwin64/bin
C:/cygwin/bin
)
endif ()
function(convert_cygwin_path _pathvar)
if (WIN32 AND CYGPATH)
execute_process(
COMMAND "${CYGPATH}" -m "${${_pathvar}}"
OUTPUT_VARIABLE ${_pathvar}
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(${_pathvar} "${${_pathvar}}" PARENT_SCOPE)
endif ()
endfunction()
function(convert_windows_path _pathvar)
if (CYGPATH)
execute_process(
COMMAND "${CYGPATH}" "${${_pathvar}}"
OUTPUT_VARIABLE ${_pathvar}
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(${_pathvar} "${${_pathvar}}" PARENT_SCOPE)
endif ()
endfunction()
# Make a list of Windows Kit versions with newer versions first.
#
# _root string KitsRoot for the Windows version whose kits to find.
# _versions variable name Variable in which to return the list of versions.
#
function(find_kits _winver _kit_versions)
set(${_kit_versions})
set(_kit_root "KitsRoot${_winver}")
set(regkey "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots")
set(regval ${_kit_root})
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
# Note: must be a cache operation in order to read from the registry.
get_filename_component(_kits_path "[${regkey};${regval}]"
ABSOLUTE CACHE
)
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "CYGWIN.*")
# On Cygwin, CMake's built-in registry query won't work.
# Use Cygwin utility "regtool" instead.
execute_process(COMMAND regtool get "\\${regkey}\\${regval}"
OUTPUT_VARIABLE _kits_path}
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if (_kits_path)
convert_windows_path(_kits_path)
endif ()
endif()
if (_kits_path)
file(GLOB ${_kit_versions} "${_kits_path}/bin/${_winver}.*")
# Reverse list, so newer versions (higher-numbered) appear first.
list(REVERSE ${_kit_versions})
endif ()
unset(_kits_path CACHE)
set(${_kit_versions} ${${_kit_versions}} PARENT_SCOPE)
endfunction()
if (WIN32 AND NOT signtool_EXECUTABLE)
if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "AMD64")
set(arch "x64")
else()
set(arch ${CMAKE_HOST_SYSTEM_PROCESSOR})
endif()
# Look for latest signtool
foreach(winver 11 10)
find_kits(${winver} kit_versions)
if (kit_versions)
find_program(signtool_EXECUTABLE
NAMES signtool
PATHS ${kit_versions}
PATH_SUFFIXES ${arch}
bin/${arch}
bin
NO_DEFAULT_PATH
)
if (signtool_EXECUTABLE)
break()
endif()
endif()
endforeach()
if (signtool_EXECUTABLE)
mark_as_advanced (signtool_EXECUTABLE)
endif ()
# handle the QUIETLY and REQUIRED arguments and set *_FOUND to TRUE
# if all listed variables are found or TRUE
include (FindPackageHandleStandardArgs)
find_package_handle_standard_args (
signtool
REQUIRED_VARS
signtool_EXECUTABLE
FAIL_MESSAGE
"Could NOT find signtool. Will be unable to sign Windows binaries."
)
endif()