Skip to content

Instantly share code, notes, and snippets.

@objectx
Created August 31, 2021 08:03
Show Gist options
  • Save objectx/9560f592b5dd75bbf082707c06deaf7f to your computer and use it in GitHub Desktop.
Save objectx/9560f592b5dd75bbf082707c06deaf7f to your computer and use it in GitHub Desktop.
Find a MSVC directory
# Copyright (c) 2021 Masashi Fujita.
# SPDX-License-Identifier: MIT
cmake_minimum_required (VERSION 3.20)
include_guard (GLOBAL)
define_property (GLOBAL PROPERTY MSVC_INSTALL_DIRECTORY
BRIEF_DOCS "Holds the MSVC installation directory"
FULL_DOCS "Holds the MSVC installation directory to cache the probing result")
function (find_msvc_directory_slow var_)
list (APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION})
if (DEFINED ENV{VSINSTALLDIR})
message (DEBUG "obeys $$VSINSTALLDIR (= $ENV{VSINSTALLDIR}) settings")
set (vsdir_ "$ENV{VSINSTALLDIR}")
else ()
message ("use vswhere to determine the Visual Studio installation directory")
cmake_path (SET vswhere_ NORMALIZE "$ENV{ProgramFiles\(x86\)}/Microsoft Visual Studio/Installer/vswhere.exe")
execute_process (COMMAND ${vswhere_}
-latest
-requires Microsoft.VisualStudio.Component.VC.ASAN
-property installationPath
OUTPUT_VARIABLE vsdir_
RESULT_VARIABLE result_)
if (NOT (result_ EQUAL 0))
set (${var_} "VC-NOTFOUND" PARENT_SCOPE)
message (AUTHOR_WARNING "missing MSVC (${result_})")
return ()
endif ()
string (STRIP "${vsdir_}" vsdir_)
endif ()
cmake_path (NORMAL_PATH vsdir_)
cmake_path (APPEND vsdir_ "VC/Auxiliary/Build/Microsoft.VCToolsVersion.default.txt" OUTPUT_VARIABLE version_text_)
if (NOT EXISTS ${version_text_})
set (${var_} "VCVersion-NOTFOUND")
message (AUTHOR_WARNING "missing MSVC version file ${version_text_}")
return ()
endif ()
file (READ ${version_text_} version_)
string (STRIP ${version_} version_)
cmake_path (APPEND vsdir_ "VC/Tools/MSVC" ${version_} "bin/Hostx64/x64" OUTPUT_VARIABLE vcdir_)
if (EXISTS ${vcdir_})
set (${var_} ${vcdir_} PARENT_SCOPE)
else ()
set (${var_} "VCDirectory-NOTFOUND")
message (AUTHOR_WARNING "missing MSVC directory ${vcdir_}")
endif ()
endfunction ()
function (find_msvc_directory var_)
list (APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION})
get_property (is_cached_ GLOBAL PROPERTY MSVC_INSTALL_DIRECTORY SET)
if (is_cached_)
get_property (cache_ GLOBAL PROPERTY MSVC_INSTALL_DIRECTORY)
message (DEBUG "found in cache (${cache_})")
set (${var_} ${cache_} PARENT_SCOPE)
return ()
else ()
find_msvc_directory_slow (vcdir_)
set_property (GLOBAL PROPERTY MSVC_INSTALL_DIRECTORY ${vcdir_})
set (${var_} ${vcdir_} PARENT_SCOPE)
endif ()
endfunction ()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment