if (NOT WIN32)
message(FATAL_ERROR "This file is only for use with windows.")
endif()
# msvc compile options
if (MSVC)
list(APPEND ASY_COMPILE_OPTS
/Zc:__cplusplus /Zc:__STDC__
/Zc:externC /Zc:preprocessor
/Zc:hiddenFriend)
endif()
# alot of asymptote sources use __MSDOS__ macro for checking windows
list(APPEND ASY_MACROS WIN32_LEAN_AND_MEAN NOMINMAX __MSDOS__=1)
# set ASYMPTOTE_SYSDIR to empty string
if (CTAN_BUILD)
list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="")
else()
# because of how ASYMPTOTE_SYSDIR is calculated on windows,
# this value is replaced by the what is in the registry when we launch
# asymptote, given if ASYMPTOTE_SYSDIR is not empty
# (empty indicates a CTAN build which uses kpsewhich for determining path)
# hence, we can leave this value to anything non-empty.
list(APPEND ASY_MACROS ASYMPTOTE_SYSDIR="NUL")
endif()
set(BUILD_SHARED_LIBS OFF)
# gcc/clang++ compatible validators
function(validate_gcc_compat_cxx validator_result_var gcccompat_compiler)
execute_process(
COMMAND ${gcccompat_compiler} "--version"
OUTPUT_VARIABLE COMPILER_RESULT)
if (NOT COMPILER_RESULT MATCHES
"(clang version )|(g\\+\\+\\.exe \\(MinGW\\))|(g\\+\\+ \\(GCC\\))")
set(${validator_result_var} FALSE PARENT_SCOPE)
endif()
endfunction()
macro(find_compatible_gcc_compilers)
find_program(
GCCCOMPAT_CXX_COMPILER_FOUND
NAMES clang++ g++
VALIDATOR validate_gcc_compat_cxx
)
if (GCCCOMPAT_CXX_COMPILER_FOUND)
message(STATUS "Found clang++/g++ at ${GCCCOMPAT_CXX_COMPILER_FOUND}")
set(GCCCOMPAT_CXX_COMPILER_FOR_MSVC ${GCCCOMPAT_CXX_COMPILER_FOUND})
endif()
endmacro()
# attempting to find gcc-compatible C++ compiler
if (MSVC)
if (NOT GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
message(STATUS "GCCCOMPAT_CXX_COMPILER_FOR_MSVC not given, will attempt to find g++.exe or clang++.exe")
find_compatible_gcc_compilers()
endif()
if (GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
message(STATUS "Using GCC-compatible C++ compiler at \
${GCCCOMPAT_CXX_COMPILER_FOR_MSVC} for preprocessing.")
endif()
if (NOT GCCCOMPAT_CXX_COMPILER_FOR_MSVC)
message(WARNING "\
GCC-compatible C++ compiler not specified, target dependency resolution for generated files may \
not work properly. If you are looking for a GCC-compatible C++ compiler on windows for preprocessing, \
we recommend the LLVM toolchain. You can find LLVM at \
\
https://releases.llvm.org/download.html \
\
or through msys2. After that, re-run cmake with either \
-DGCCCOMPAT_CXX_COMPILER_FOR_MSVC=<path to clang++.exe> \
or if running msvc/* presets, with GCCCOMPAT_CXX_COMPILER_FOR_MSVC \
environment variable set to the path \
to clang++.exe.")
endif()
endif()
# additional win32 api libraries
list(APPEND ASY_STATIC_LIBARIES Shlwapi Shell32 Ws2_32)
# RC file
set(ASY_WIN_RESOURCE_DIR ${ASY_RESOURCE_DIR}/windows)
list(APPEND ASY_WIN_RC_FILE ${ASY_WIN_RESOURCE_DIR}/asy.rc)
# Minimum Windows version - for now, pinning on windows 10,
# since that is currently the minimum supported version by Microsoft
# See
https://learn.microsoft.com/en-us/windows/win32/winprog/using-the-windows-headers
set(ASY_WIN32_WINVER_VERSION 0x0A00)
list(APPEND ASY_MACROS _WIN32_WINNT=${ASY_WIN32_WINVER_VERSION})