mirror of https://github.com/H-uru/korman.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
4.6 KiB
120 lines
4.6 KiB
# This file is part of Korman. |
|
# |
|
# Korman is free software: you can redistribute it and/or modify |
|
# it under the terms of the GNU General Public License as published by |
|
# the Free Software Foundation, either version 3 of the License, or |
|
# (at your option) any later version. |
|
# |
|
# Korman is distributed in the hope that it will be useful, |
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
# GNU General Public License for more details. |
|
# |
|
# You should have received a copy of the GNU General Public License |
|
# along with Korman. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
cmake_policy(PUSH) |
|
cmake_policy(SET CMP0057 NEW) # if(IN_LIST) |
|
|
|
function(_get_subdirectories RESULT DIRECTORY) |
|
file(GLOB children INCLUDE_DIRECTORIES RELATIVE "${DIRECTORY}" "${DIRECTORY}/*") |
|
foreach(child IN LISTS children) |
|
if(IS_DIRECTORY "${DIRECTORY}/${child}") |
|
list(APPEND subdirectories "${child}") |
|
endif() |
|
endforeach() |
|
set(${RESULT} ${subdirectories} PARENT_SCOPE) |
|
endfunction() |
|
|
|
# Is this even legal? |
|
if(NOT VCRedist_FIND_COMPONENTS) |
|
set(VCRedist_FIND_COMPONENTS Executable MergeModules) |
|
endif() |
|
|
|
if(MSVC) |
|
# The parens in this env variable give CMake heartburn, so we whisper sweet nothings. |
|
set(_PROGRAMFILES_X86 "PROGRAMFILES(X86)") |
|
set(_PROGRAMFILES_X86 "$ENV{${_PROGRAMFILES_X86}}") |
|
|
|
# TODO: support non visual studio generators |
|
set(_vs_install_root "${CMAKE_VS_DEVENV_COMMAND}/../../../") |
|
get_filename_component(_vs_install_root "${_vs_install_root}" ABSOLUTE) |
|
|
|
# Valid paths: |
|
# 2013, 2015: VC/redist/1033/<exe> |
|
# 2017, 2019: VC/redist/MSVC/<MSVC VERSION>/<exe> |
|
# 2019: VC/redist/MSVC/<toolset version>/<exe> |
|
set(_redist_dir "${_vs_install_root}/VC/redist") |
|
_get_subdirectories(_msvc_subdirs "${_redist_dir}/MSVC") |
|
foreach(_subdir IN LISTS _msvc_subdirs) |
|
list(APPEND _redist_paths "${_redist_dir}/MSVC/${_subdir}") |
|
endforeach() |
|
|
|
# These are known, valid locations, so we prefer them first. |
|
list(INSERT _redist_paths 0 "${_redist_dir}/1033" "${_redist_dir}/MSVC/v${MSVC_TOOLSET_VERSION}") |
|
list(REMOVE_DUPLICATES _redist_paths) |
|
|
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8) |
|
set(_redist_arch x64) |
|
else() |
|
set(_redist_arch x86) |
|
endif() |
|
|
|
if("Executable" IN_LIST VCRedist_FIND_COMPONENTS) |
|
list(APPEND _required_vars "VCRedist_EXECUTABLE") |
|
|
|
find_program(VCRedist_EXECUTABLE |
|
NAMES "vcredist_${_redist_arch}" "vc_redist.${_redist_arch}" |
|
PATHS ${_redist_paths} |
|
) |
|
|
|
mark_as_advanced(VCRedist_EXECUTABLE) |
|
set(VCRedist_NAME "vcredist_${_redist_arch}.exe") |
|
if(EXISTS "${VCRedist_EXECUTABLE}") |
|
set(VCRedist_Executable_FOUND TRUE) |
|
endif() |
|
endif() |
|
|
|
# Valid Paths: |
|
# Visual Studio <= 2015: <Program Files (x86)>/Common Files/Merge Modules/ |
|
# Visual Studio >= 2017: <Visual Studio root>/VC/<MSVC or toolset version>/MergeModules/ |
|
if("MergeModules" IN_LIST VCRedist_FIND_COMPONENTS) |
|
list(APPEND _merge_module_paths "${_PROGRAMFILES_X86}/Common Files" ${_redist_paths}) |
|
set(_merge_module_suffixes "Merge Modules" "MergeModules") |
|
|
|
# We'll flip it OFF if anything is missing |
|
set(VCRedist_MergeModules_FOUND TRUE) |
|
function(_find_merge_module MODULE_NAME) |
|
string(TOUPPER "${MODULE_NAME}" _module_name_upper) |
|
set(VARIABLE "VCRedist_${_module_name_upper}_MERGE_MODULE") |
|
find_file(${VARIABLE} |
|
NAMES "Microsoft_VC${MSVC_TOOLSET_VERSION}_${MODULE_NAME}_${_redist_arch}.msm" |
|
PATHS ${_merge_module_paths} |
|
PATH_SUFFIXES ${_merge_module_suffixes} |
|
) |
|
mark_as_advanced(${VARIABLE}) |
|
set(_required_vars ${_required_vars} ${VARIABLE} PARENT_SCOPE) |
|
if(EXISTS "${${VARIABLE}}") |
|
set(VCRedist_MERGE_MODULES ${VCRedist_MERGE_MODULES} "${${VARIABLE}}" PARENT_SCOPE) |
|
else() |
|
set(VCRedist_MergeModules_FOUND FALSE PARENT_SCOPE) |
|
endif() |
|
endfunction() |
|
|
|
_find_merge_module(CRT) |
|
_find_merge_module(MFC) |
|
_find_merge_module(MFCLOC) |
|
_find_merge_module(OpenMP) |
|
if(MSVC_TOOLSET_VERSION GREATER_EQUAL 110) |
|
_find_merge_module(CXXAMP) |
|
endif() |
|
endif() |
|
endif() |
|
|
|
include(FindPackageHandleStandardArgs) |
|
find_package_handle_standard_args(VCRedist |
|
REQUIRED_VARS ${_required_vars} # Optional in CMake 3.18+, but we only require 3.12 |
|
HANDLE_COMPONENTS |
|
) |
|
|
|
cmake_policy(POP)
|
|
|