136 lines
4.1 KiB
CMake
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()
|