Files
LookingGlass/cmake/toolchains/msquic-clangcl-mingw64.cmake
2026-11-06 14:37:38 +11:00

141 lines
5.1 KiB
CMake

set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR AMD64)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
set(MSQUIC_MINGW_TRIPLE x86_64-w64-mingw32 CACHE STRING
"MinGW-w64 target triple")
set(MSQUIC_MINGW_ROOT "/usr/${MSQUIC_MINGW_TRIPLE}" CACHE PATH
"MinGW-w64 target root")
set(MSQUIC_CLANG_CL clang-cl CACHE FILEPATH
"clang-cl used to build the static MsQuic archive")
set(MSQUIC_LLVM_LIB llvm-lib CACHE FILEPATH
"llvm-lib used to create the static MsQuic archive")
set(MSQUIC_WINDRES "${MSQUIC_MINGW_TRIPLE}-windres" CACHE FILEPATH
"MinGW-w64 resource compiler")
set(MSQUIC_MINGW_GCC "${MSQUIC_MINGW_TRIPLE}-gcc" CACHE FILEPATH
"MinGW-w64 compiler used to locate compatibility headers")
if(NOT MSQUIC_CLANG_RESOURCE_DIR)
execute_process(
COMMAND "${MSQUIC_CLANG_CL}" /clang:-print-resource-dir
RESULT_VARIABLE MSQUIC_CLANG_RESOURCE_RESULT
OUTPUT_VARIABLE MSQUIC_CLANG_RESOURCE_ROOT
ERROR_VARIABLE MSQUIC_CLANG_RESOURCE_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT MSQUIC_CLANG_RESOURCE_RESULT EQUAL 0)
message(FATAL_ERROR
"Unable to locate the clang resource headers: "
"${MSQUIC_CLANG_RESOURCE_ERROR}")
endif()
set(MSQUIC_CLANG_RESOURCE_DIR
"${MSQUIC_CLANG_RESOURCE_ROOT}/include" CACHE PATH
"clang resource headers used by the MsQuic cross-build")
endif()
if(NOT MSQUIC_MINGW_GCC_INCLUDE)
execute_process(
COMMAND "${MSQUIC_MINGW_GCC}" -print-file-name=include
RESULT_VARIABLE MSQUIC_MINGW_GCC_INCLUDE_RESULT
OUTPUT_VARIABLE MSQUIC_MINGW_GCC_INCLUDE
ERROR_VARIABLE MSQUIC_MINGW_GCC_INCLUDE_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT MSQUIC_MINGW_GCC_INCLUDE_RESULT EQUAL 0)
message(FATAL_ERROR
"Unable to locate the MinGW-w64 compiler headers: "
"${MSQUIC_MINGW_GCC_INCLUDE_ERROR}")
endif()
set(MSQUIC_MINGW_GCC_INCLUDE "${MSQUIC_MINGW_GCC_INCLUDE}" CACHE PATH
"MinGW-w64 compiler headers used by the MsQuic cross-build")
endif()
if(NOT MSQUIC_MINGW_GCC_INCLUDE_FIXED)
execute_process(
COMMAND "${MSQUIC_MINGW_GCC}" -print-file-name=include-fixed
RESULT_VARIABLE MSQUIC_MINGW_GCC_FIXED_RESULT
OUTPUT_VARIABLE MSQUIC_MINGW_GCC_INCLUDE_FIXED
ERROR_VARIABLE MSQUIC_MINGW_GCC_FIXED_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT MSQUIC_MINGW_GCC_FIXED_RESULT EQUAL 0)
message(FATAL_ERROR
"Unable to locate the fixed MinGW-w64 compiler headers: "
"${MSQUIC_MINGW_GCC_FIXED_ERROR}")
endif()
set(MSQUIC_MINGW_GCC_INCLUDE_FIXED
"${MSQUIC_MINGW_GCC_INCLUDE_FIXED}" CACHE PATH
"Fixed MinGW-w64 compiler headers used by the MsQuic cross-build")
endif()
foreach(MSQUIC_REQUIRED_INCLUDE
"${MSQUIC_MINGW_ROOT}/include"
"${MSQUIC_CLANG_RESOURCE_DIR}"
"${MSQUIC_MINGW_GCC_INCLUDE}")
if(NOT IS_DIRECTORY "${MSQUIC_REQUIRED_INCLUDE}")
message(FATAL_ERROR
"Required MsQuic cross-build headers are missing: "
"${MSQUIC_REQUIRED_INCLUDE}")
endif()
endforeach()
set(CMAKE_C_COMPILER "${MSQUIC_CLANG_CL}")
set(CMAKE_CXX_COMPILER "${MSQUIC_CLANG_CL}")
set(CMAKE_C_COMPILER_TARGET "${MSQUIC_MINGW_TRIPLE}")
set(CMAKE_CXX_COMPILER_TARGET "${MSQUIC_MINGW_TRIPLE}")
set(CMAKE_AR "${MSQUIC_LLVM_LIB}")
set(CMAKE_RC_COMPILER "${MSQUIC_WINDRES}")
set(MSQUIC_COMPAT_HEADER
"${CMAKE_CURRENT_LIST_DIR}/msquic-mingw-compat.h")
set(MSQUIC_CLANG_CL_OPTIONS
"/clang:-nostdinc"
"/clang:-isystem"
"/clang:${MSQUIC_MINGW_ROOT}/include"
"/clang:-isystem"
"/clang:${MSQUIC_CLANG_RESOURCE_DIR}"
"/clang:-isystem"
"/clang:${MSQUIC_MINGW_GCC_INCLUDE}")
if(IS_DIRECTORY "${MSQUIC_MINGW_GCC_INCLUDE_FIXED}")
list(APPEND MSQUIC_CLANG_CL_OPTIONS
"/clang:-isystem"
"/clang:${MSQUIC_MINGW_GCC_INCLUDE_FIXED}")
endif()
list(APPEND MSQUIC_CLANG_CL_OPTIONS
"/clang:-fms-extensions"
"/clang:-Wno-unknown-pragmas"
"/clang:-Wno-microsoft-anon-tag"
"/clang:-Wno-missing-field-initializers"
"/clang:-Wno-sign-compare"
"/clang:-Wno-int-conversion"
"/clang:-Wno-unused-function"
"/clang:-Wno-incompatible-pointer-types"
"/clang:-Wno-duplicate-decl-specifier"
"/FI${MSQUIC_COMPAT_HEADER}")
list(JOIN MSQUIC_CLANG_CL_OPTIONS " " MSQUIC_CLANG_CL_FLAGS)
set(CMAKE_C_FLAGS "${MSQUIC_CLANG_CL_FLAGS}" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "${MSQUIC_CLANG_CL_FLAGS}" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_DEBUG "/clang:-O0 /Zi" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_DEBUG "/clang:-O0 /Zi" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELEASE "/clang:-O3 /DNDEBUG" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE "/clang:-O3 /DNDEBUG" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELWITHDEBINFO
"/clang:-O2 /Zi /DNDEBUG" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
"/clang:-O2 /Zi /DNDEBUG" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_MINSIZEREL "/clang:-Os /DNDEBUG" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_MINSIZEREL
"/clang:-Os /DNDEBUG" CACHE STRING "" FORCE)
set(CMAKE_USER_MAKE_RULES_OVERRIDE
"${CMAKE_CURRENT_LIST_DIR}/msquic-clangcl-rules.cmake")
set(CMAKE_FIND_ROOT_PATH "${MSQUIC_MINGW_ROOT}")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)