From ee97f9e61c36262a8fcec68248d41688e2ee17a6 Mon Sep 17 00:00:00 2001 From: Belonit <54427022+Belonit@users.noreply.github.com> Date: Mon, 31 Aug 2026 21:16:11 +0300 Subject: [PATCH 01/12] Add experimental clang-cl cross-build --- CMakeLists.txt | 24 +++++++++- cmake/clang-compat.h | 15 ++++++ cmake/toolchains/clang-cl-msvc.cmake | 72 ++++++++++++++++++++++++++++ code/CMakeLists.txt | 43 +++++++++++++---- code/language/CMakeLists.txt | 8 +++- docs/BUILDING.md | 25 ++++++++++ thirdparty/CMakeLists.txt | 17 +++++++ 7 files changed, 192 insertions(+), 12 deletions(-) create mode 100644 cmake/clang-compat.h create mode 100644 cmake/toolchains/clang-cl-msvc.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 33878dba..2763905a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 3.23) project(OpenTS VERSION 0.2.0 LANGUAGES C CXX ASM_MASM) +enable_language(RC) # A SemVer prerelease label, which project() cannot carry because it takes numbers only. Set it # to "beta1" and the version reads 0.1.0-beta1; leave it empty outside a prerelease series. The @@ -11,8 +12,27 @@ set(OPENTS_VERSION_PRERELEASE "") # alone. Every other build names the commit it came from as well. option(OPENTS_OFFICIAL_BUILD "Build as an official release of the declared version" OFF) -if(NOT MSVC OR MSVC_VERSION LESS 1930) - message(FATAL_ERROR "OpenTS requires the Visual Studio 2022 MSVC toolchain.") +option(OPENTS_EXPERIMENTAL_CLANG_CL "Build with clang-cl using the MSVC ABI" OFF) + +set(OPENTS_MSVC_ABI_COMPILER OFF) +if(MSVC) + if(MSVC_VERSION LESS 1930) + message(FATAL_ERROR "OpenTS requires MSVC 19.30 or newer.") + endif() + set(OPENTS_MSVC_ABI_COMPILER ON) +elseif(OPENTS_EXPERIMENTAL_CLANG_CL + AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" + AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") + set(OPENTS_MSVC_ABI_COMPILER ON) + set(CMAKE_DEPFILE_FLAGS_RC "" CACHE STRING "" FORCE) + set(CMAKE_RC_COMPILE_OBJECT + " /C 1252 /fo " + CACHE STRING "" FORCE) +else() + message(FATAL_ERROR + "OpenTS requires the Visual Studio 2022 MSVC toolchain. " + "The unsupported clang-cl experiment must be configured with " + "-DOPENTS_EXPERIMENTAL_CLANG_CL=ON.") endif() set(CMAKE_CXX_STANDARD 20) diff --git a/cmake/clang-compat.h b/cmake/clang-compat.h new file mode 100644 index 00000000..35124010 --- /dev/null +++ b/cmake/clang-compat.h @@ -0,0 +1,15 @@ +/******************************************************************************* + * O P E N T S + ****************************************************************************** + * SPDX-License-Identifier: GPL-3.0-or-later + * Copyright 2026 OpenTS contributors + ******************************************************************************/ + +#pragma once + +#include + +#if defined(__clang__) && defined(_M_IX86) +#undef __stdcall +#define __stdcall __attribute__((stdcall)) +#endif diff --git a/cmake/toolchains/clang-cl-msvc.cmake b/cmake/toolchains/clang-cl-msvc.cmake new file mode 100644 index 00000000..e3b366e7 --- /dev/null +++ b/cmake/toolchains/clang-cl-msvc.cmake @@ -0,0 +1,72 @@ +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86) + +set(OPENTS_EXPERIMENTAL_CLANG_CL ON CACHE BOOL "" FORCE) +set(OPENTS_MSVC_ROOT "" CACHE PATH "Path to the MSVC and Windows SDK files") +list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES OPENTS_MSVC_ROOT) + +if(NOT OPENTS_MSVC_ROOT AND DEFINED ENV{OPENTS_MSVC_ROOT}) + set(OPENTS_MSVC_ROOT "$ENV{OPENTS_MSVC_ROOT}" CACHE PATH "" FORCE) +endif() + +if(NOT OPENTS_MSVC_ROOT) + message(FATAL_ERROR + "Set OPENTS_MSVC_ROOT to the directory containing MSVC and the Windows SDK.") +endif() + +set(_opents_msvc_version "14.44.35207") +set(_opents_sdk_version "10.0.26100.0") +set(_opents_msvc_dir "${OPENTS_MSVC_ROOT}/VC/Tools/MSVC/${_opents_msvc_version}") +set(_opents_sdk_dir "${OPENTS_MSVC_ROOT}/Windows Kits/10") + +foreach(_required_path + "${_opents_msvc_dir}/include" + "${_opents_sdk_dir}/Include/${_opents_sdk_version}/um") + if(NOT EXISTS "${_required_path}") + message(FATAL_ERROR "Required MSVC component not found: ${_required_path}") + endif() +endforeach() + +find_program(_opents_clang_cl clang-cl REQUIRED) +find_program(_opents_lld_link lld-link REQUIRED) +find_program(_opents_llvm_lib llvm-lib REQUIRED) +find_program(_opents_llvm_mt llvm-mt REQUIRED) +find_program(_opents_llvm_rc llvm-rc REQUIRED) +find_program(_opents_uasm uasm REQUIRED) + +set(CMAKE_C_COMPILER "${_opents_clang_cl}") +set(CMAKE_CXX_COMPILER "${_opents_clang_cl}") +set(CMAKE_C_COMPILER_TARGET i686-pc-windows-msvc) +set(CMAKE_CXX_COMPILER_TARGET i686-pc-windows-msvc) +set(CMAKE_C_FLAGS_INIT "/clang:-fms-compatibility-version=19.44") +set(CMAKE_CXX_FLAGS_INIT "/clang:-fms-compatibility-version=19.44") +set(CMAKE_LINKER "${_opents_lld_link}") +set(CMAKE_AR "${_opents_llvm_lib}") +set(CMAKE_RC_COMPILER "${_opents_llvm_rc}" CACHE FILEPATH "" FORCE) +set(CMAKE_MT "${_opents_llvm_mt}") +set(CMAKE_ASM_MASM_COMPILER "${_opents_uasm}" CACHE FILEPATH "" FORCE) + +set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES + "${_opents_msvc_dir}/atlmfc/include" + "${_opents_msvc_dir}/include" + "${_opents_sdk_dir}/Include/${_opents_sdk_version}/shared" + "${_opents_sdk_dir}/Include/${_opents_sdk_version}/ucrt" + "${_opents_sdk_dir}/Include/${_opents_sdk_version}/um" + "${_opents_sdk_dir}/Include/${_opents_sdk_version}/winrt") +set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_C_STANDARD_INCLUDE_DIRECTORIES}) + +set(_opents_rc_flags "") +foreach(_include_dir IN LISTS CMAKE_C_STANDARD_INCLUDE_DIRECTORIES) + string(APPEND _opents_rc_flags " /I\"${_include_dir}\"") +endforeach() +set(CMAKE_RC_FLAGS_INIT "${_opents_rc_flags}") + +set(_opents_linker_paths + "/libpath:\"${_opents_msvc_dir}/atlmfc/lib/x86\"" + "/libpath:\"${_opents_msvc_dir}/lib/x86\"" + "/libpath:\"${_opents_sdk_dir}/Lib/${_opents_sdk_version}/ucrt/x86\"" + "/libpath:\"${_opents_sdk_dir}/Lib/${_opents_sdk_version}/um/x86\"") +string(JOIN " " _opents_linker_flags ${_opents_linker_paths}) +set(CMAKE_EXE_LINKER_FLAGS_INIT "${_opents_linker_flags}") +set(CMAKE_SHARED_LINKER_FLAGS_INIT "${_opents_linker_flags}") +set(CMAKE_MODULE_LINKER_FLAGS_INIT "${_opents_linker_flags}") diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 8e90291c..63e1661e 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -57,6 +57,12 @@ endforeach() # message(STATUS "${PROJECT_NAME}: Creating '${PROJECT_NAME}' executable...") +if(OPENTS_EXPERIMENTAL_CLANG_CL) + set(CMAKE_DEPFILE_FLAGS_RC "") + set(CMAKE_RC_COMPILE_OBJECT + " /C 1252 /fo ") +endif() + add_executable(OpenTS WIN32 ${OPENTS_SRC}) target_compile_features(OpenTS PRIVATE cxx_std_20) @@ -92,6 +98,16 @@ set_target_properties(OpenTS PROPERTIES # message(STATUS "${PROJECT_NAME}: Applying compiler flags...") +if(OPENTS_EXPERIMENTAL_CLANG_CL) + set(OPENTS_ASM_MASM_OPTIONS -Zi -c -coff -Cx -safeseh) + set(OPENTS_ASM_MASM_SOURCE_OPTIONS "-Zi -c -coff -Cx -safeseh") + set(OPENTS_PARALLEL_COMPILE_OPTION "") +else() + set(OPENTS_ASM_MASM_OPTIONS /Zi /c /coff /Cx /safeseh) + set(OPENTS_ASM_MASM_SOURCE_OPTIONS "/Zi /c /coff /Cx /safeseh") + set(OPENTS_PARALLEL_COMPILE_OPTION /MP) +endif() + set(OPENTS_COMPILE_OPTIONS # ================= DEBUG ================= @@ -101,17 +117,17 @@ set(OPENTS_COMPILE_OPTIONS # /arch:SSE2 -- IEEE-754 single precision, no x87 excess precision. # /fp:precise -- no reassociation of the engine's accumulations. $<$: - /Zi /Od /RTC1 /GR /MP /EHsc /Oy- /MTd /Zc:__cplusplus /arch:SSE2 /fp:precise + /Zi /Od /RTC1 /GR ${OPENTS_PARALLEL_COMPILE_OPTION} /EHsc /Oy- /MTd /Zc:__cplusplus /arch:SSE2 /fp:precise > # ---------- C ---------- $<$: - /Zi /Od /RTC1 /MP /Oy- /arch:SSE2 /fp:precise + /Zi /Od /RTC1 ${OPENTS_PARALLEL_COMPILE_OPTION} /Oy- /arch:SSE2 /fp:precise > # ---------- MASM ---------- $<$: - /Zi /c /coff /Cx /safeseh + ${OPENTS_ASM_MASM_OPTIONS} > > @@ -122,17 +138,17 @@ set(OPENTS_COMPILE_OPTIONS # /arch:SSE2 -- IEEE-754 single precision, no x87 excess precision. # /fp:precise -- no reassociation of the engine's accumulations. $<$: - /Zi /O2 /GF /GR /MP /EHsc /MT /Zc:__cplusplus /arch:SSE2 /fp:precise + /Zi /O2 /GF /GR ${OPENTS_PARALLEL_COMPILE_OPTION} /EHsc /MT /Zc:__cplusplus /arch:SSE2 /fp:precise > # ---------- C ---------- $<$: - /Zi /O2 /GF /MP /arch:SSE2 /fp:precise + /Zi /O2 /GF ${OPENTS_PARALLEL_COMPILE_OPTION} /arch:SSE2 /fp:precise > # ---------- MASM ---------- $<$: - /Zi /c /coff /Cx /safeseh + ${OPENTS_ASM_MASM_OPTIONS} > > ) @@ -168,6 +184,15 @@ set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/bgfxbackend.cpp" PROPER COMPILE_OPTIONS "/Zc:preprocessor" ) +# bx rewrites __stdcall while its headers are being parsed by clang-cl. Force the +# compatibility header into the renderer translation unit as well as bx/bgfx so the +# MSVC standard-library headers that follow still see the Win32 calling convention. +if(OPENTS_EXPERIMENTAL_CLANG_CL AND CMAKE_SIZEOF_VOID_P EQUAL 4) + set_property(SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/bgfxbackend.cpp" APPEND PROPERTY + COMPILE_OPTIONS "/FI${CMAKE_SOURCE_DIR}/cmake/clang-compat.h" + ) +endif() + message(STATUS "${PROJECT_NAME}: Adding compilier definitions...") target_compile_definitions(OpenTS PRIVATE WIN32 @@ -220,7 +245,7 @@ target_link_libraries(OpenTS PRIVATE ole32 oleaut32 uuid odbc32 odbccp32 ) -if (MSVC) +if (OPENTS_MSVC_ABI_COMPILER) target_link_options(OpenTS PRIVATE /SUBSYSTEM:WINDOWS /DEBUG @@ -245,12 +270,12 @@ message(STATUS "${PROJECT_NAME}: Adding MASM support...") enable_language(ASM_MASM) -# All .asm files compile automatically using ML.EXE with appropriate flags. +# The experimental clang-cl toolchain uses native UASM; Visual Studio uses ML.EXE. foreach(f ${OPENTS_SRC}) if(f MATCHES "\\.asm$") set_source_files_properties(${f} PROPERTIES LANGUAGE ASM_MASM - COMPILE_FLAGS "-Zi -c -coff -Cx" + COMPILE_FLAGS "${OPENTS_ASM_MASM_SOURCE_OPTIONS}" ) endif() endforeach() diff --git a/code/language/CMakeLists.txt b/code/language/CMakeLists.txt index 4d1feabe..2c6fcceb 100644 --- a/code/language/CMakeLists.txt +++ b/code/language/CMakeLists.txt @@ -3,6 +3,12 @@ file(GLOB_RECURSE LANG_SRC CONFIGURE_DEPENDS "*.h" "*.hpp" "*.hm" ) +if(OPENTS_EXPERIMENTAL_CLANG_CL) + set(CMAKE_DEPFILE_FLAGS_RC "") + set(CMAKE_RC_COMPILE_OBJECT + " /C 1252 /fo ") +endif() + add_library(Language SHARED ${LANG_SRC}) target_compile_features(Language PRIVATE cxx_std_20) target_compile_definitions(Language PRIVATE NOMINMAX) @@ -12,7 +18,7 @@ target_compile_definitions(Language PRIVATE NOMINMAX) target_include_directories(Language PRIVATE "${OPENTS_GENERATED_DIR}") add_dependencies(Language OpenTSBuildStamp) -if (MSVC) +if (OPENTS_MSVC_ABI_COMPILER) target_link_options(Language PRIVATE "/NOENTRY" "/NODEFAULTLIB") endif() diff --git a/docs/BUILDING.md b/docs/BUILDING.md index f9078a61..48e882ec 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -23,6 +23,31 @@ supported by the current tree. Install Visual Studio 2022 with the **Desktop development with C++** workload, a Windows SDK, CMake 3.23 or newer, and Git for Windows. +### Experimental clang-cl cross-build + +An unsupported Linux cross-build is available for compiler-portability work. It +uses native `clang-cl`, LLD, LLVM library and resource tools, and UASM with +the MSVC headers and libraries. It does not expand the supported build matrix +or establish runtime behavior. + +The reconstructed codebase may still contain undefined behavior that the +supported MSVC build happens not to expose. A successful clang-cl build may +therefore run incorrectly or fail at runtime; validate any result separately. + +Provide a directory containing MSVC 14.44.35207 and Windows SDK 10.0.26100.0, +then configure a single-configuration Ninja build: + +```bash +cmake -S . -B build/clang-cl -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/clang-cl-msvc.cmake \ + -DOPENTS_MSVC_ROOT=/path/to/msvc +cmake --build build/clang-cl +``` + +The toolchain requires `clang-cl`, `lld-link`, `llvm-lib`, `llvm-mt`, +`llvm-rc`, and `uasm` on `PATH`. + ## Dependencies The renderer is built on [bgfx](https://github.com/bkaradzic/bgfx), vendored as the diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index 603217a7..2e80372e 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -19,3 +19,20 @@ set(BGFX_CONFIG_RENDERER_WEBGPU OFF CACHE BOOL "" FORCE) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") add_subdirectory(bgfx.cmake) + +if(OPENTS_EXPERIMENTAL_CLANG_CL AND CMAKE_SIZEOF_VOID_P EQUAL 4) + # bx treats Clang with the MSVC CRT like a non-x86 compiler and erases + # __stdcall. Restore it before Windows declarations are parsed. + foreach(target bx bimg bgfx) + target_compile_options(${target} PRIVATE + "$<$:/FI${PROJECT_SOURCE_DIR}/cmake/clang-compat.h>" + ) + endforeach() + + # The ASTC encoder selects a 64-bit popcount intrinsic when SSE4.2 is enabled, + # but that intrinsic is unavailable for the Win32 target. Its SSE2 path is portable. + target_compile_definitions(bimg PRIVATE ASTCENC_POPCNT=0 ASTCENC_SSE=20) + + # These libraries support the disabled texture tools and are not linked into OpenTS. + set_target_properties(bimg_decode bimg_encode PROPERTIES EXCLUDE_FROM_ALL TRUE) +endif() From 36f68380f0a5cca06780d8f98e9664365b334b30 Mon Sep 17 00:00:00 2001 From: Belonit <54427022+Belonit@users.noreply.github.com> Date: Mon, 31 Aug 2026 21:16:11 +0300 Subject: [PATCH 02/12] Update c_cpp_properties.clang.example.json --- .vscode/c_cpp_properties.clang.example.json | 51 +++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .vscode/c_cpp_properties.clang.example.json diff --git a/.vscode/c_cpp_properties.clang.example.json b/.vscode/c_cpp_properties.clang.example.json new file mode 100644 index 00000000..6cf637ba --- /dev/null +++ b/.vscode/c_cpp_properties.clang.example.json @@ -0,0 +1,51 @@ +{ + // Copy this file to c_cpp_properties.json and adjust these paths if needed. + "env": { + // LLVM installed with its default Windows installer location. + "CLANG_CL_PATH": "${env:ProgramFiles}/LLVM/bin/clang-cl.exe", + // Visual Studio 2022 Community. Change the edition or installation path as needed. + "MSVC_ROOT": "${env:ProgramFiles}/Microsoft Visual Studio/2022/Community", + "MSVC_VERSION": "14.44.35207", + // The Windows SDK is normally installed under Program Files (x86). + "WINDOWS_SDK_ROOT": "${env:ProgramFiles(x86)}/Windows Kits/10", + "WINDOWS_SDK_VERSION": "10.0.26100.0", + // Set this to the CMake binary directory used for the clang-cl build. + "CLANG_BUILD_DIR": "${workspaceFolder}/build/clang-cl" + }, + "configurations": [ + { + "name": "Win32 clang-cl with MSVC headers", + "compilerPath": "${CLANG_CL_PATH}", + "compilerArgs": [ + "--target=i686-pc-windows-msvc", + "/clang:-fms-compatibility-version=19.44" + ], + "intelliSenseMode": "windows-clang-x86", + "cStandard": "c17", + "cppStandard": "c++20", + "includePath": [ + "${workspaceFolder}/code", + "${workspaceFolder}/code/vqalib", + "${workspaceFolder}/thirdparty/**", + "${CLANG_BUILD_DIR}/generated", + "${MSVC_ROOT}/VC/Tools/MSVC/${MSVC_VERSION}/include", + "${MSVC_ROOT}/VC/Tools/MSVC/${MSVC_VERSION}/atlmfc/include", + "${WINDOWS_SDK_ROOT}/Include/${WINDOWS_SDK_VERSION}/ucrt", + "${WINDOWS_SDK_ROOT}/Include/${WINDOWS_SDK_VERSION}/shared", + "${WINDOWS_SDK_ROOT}/Include/${WINDOWS_SDK_VERSION}/um", + "${WINDOWS_SDK_ROOT}/Include/${WINDOWS_SDK_VERSION}/winrt", + "${WINDOWS_SDK_ROOT}/Include/${WINDOWS_SDK_VERSION}/cppwinrt" + ], + "defines": [ + "WIN32", + "_WIN32", + "_WINDOWS", + "_MBCS", + "NOMINMAX", + "NO_BLOWFISH_DLL", + "BX_CONFIG_DEBUG=0" + ] + } + ], + "version": 4 +} From 0153be92d11f565e43d2cfdccfd62204085cdc40 Mon Sep 17 00:00:00 2001 From: Belonit <54427022+Belonit@users.noreply.github.com> Date: Tue, 1 Sep 2026 12:38:51 +0300 Subject: [PATCH 03/12] Fix clang-cl compiler and resource configuration --- CMakeLists.txt | 26 +++++++++++------------- cmake/toolchains/clang-cl-msvc.cmake | 3 +++ cmake/toolchains/clang-cl-rc-rules.cmake | 3 +++ code/CMakeLists.txt | 8 +------- code/language/CMakeLists.txt | 8 +------- 5 files changed, 20 insertions(+), 28 deletions(-) create mode 100644 cmake/toolchains/clang-cl-rc-rules.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 2763905a..27386aa8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,6 @@ cmake_minimum_required(VERSION 3.23) project(OpenTS VERSION 0.2.0 LANGUAGES C CXX ASM_MASM) -enable_language(RC) # A SemVer prerelease label, which project() cannot carry because it takes numbers only. Set it # to "beta1" and the version reads 0.1.0-beta1; leave it empty outside a prerelease series. The @@ -14,27 +13,26 @@ option(OPENTS_OFFICIAL_BUILD "Build as an official release of the declared versi option(OPENTS_EXPERIMENTAL_CLANG_CL "Build with clang-cl using the MSVC ABI" OFF) -set(OPENTS_MSVC_ABI_COMPILER OFF) -if(MSVC) +if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" + AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") + if(NOT OPENTS_EXPERIMENTAL_CLANG_CL) + message(FATAL_ERROR + "The unsupported clang-cl experiment must be configured with " + "-DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/clang-cl-msvc.cmake.") + endif() +elseif(MSVC) if(MSVC_VERSION LESS 1930) message(FATAL_ERROR "OpenTS requires MSVC 19.30 or newer.") endif() - set(OPENTS_MSVC_ABI_COMPILER ON) -elseif(OPENTS_EXPERIMENTAL_CLANG_CL - AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang" - AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") - set(OPENTS_MSVC_ABI_COMPILER ON) - set(CMAKE_DEPFILE_FLAGS_RC "" CACHE STRING "" FORCE) - set(CMAKE_RC_COMPILE_OBJECT - " /C 1252 /fo " - CACHE STRING "" FORCE) else() message(FATAL_ERROR "OpenTS requires the Visual Studio 2022 MSVC toolchain. " - "The unsupported clang-cl experiment must be configured with " - "-DOPENTS_EXPERIMENTAL_CLANG_CL=ON.") + "For the unsupported clang-cl experiment, configure with " + "-DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/clang-cl-msvc.cmake.") endif() +enable_language(RC) + set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) diff --git a/cmake/toolchains/clang-cl-msvc.cmake b/cmake/toolchains/clang-cl-msvc.cmake index e3b366e7..f2ba09aa 100644 --- a/cmake/toolchains/clang-cl-msvc.cmake +++ b/cmake/toolchains/clang-cl-msvc.cmake @@ -46,6 +46,9 @@ set(CMAKE_RC_COMPILER "${_opents_llvm_rc}" CACHE FILEPATH "" FORCE) set(CMAKE_MT "${_opents_llvm_mt}") set(CMAKE_ASM_MASM_COMPILER "${_opents_uasm}" CACHE FILEPATH "" FORCE) +set(CMAKE_USER_MAKE_RULES_OVERRIDE + "${CMAKE_CURRENT_LIST_DIR}/clang-cl-rc-rules.cmake") + set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES "${_opents_msvc_dir}/atlmfc/include" "${_opents_msvc_dir}/include" diff --git a/cmake/toolchains/clang-cl-rc-rules.cmake b/cmake/toolchains/clang-cl-rc-rules.cmake new file mode 100644 index 00000000..f2ebf475 --- /dev/null +++ b/cmake/toolchains/clang-cl-rc-rules.cmake @@ -0,0 +1,3 @@ +set(CMAKE_DEPFILE_FLAGS_RC "") +set(CMAKE_RC_COMPILE_OBJECT + " /C 1252 /fo ") diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 63e1661e..6886f226 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -57,12 +57,6 @@ endforeach() # message(STATUS "${PROJECT_NAME}: Creating '${PROJECT_NAME}' executable...") -if(OPENTS_EXPERIMENTAL_CLANG_CL) - set(CMAKE_DEPFILE_FLAGS_RC "") - set(CMAKE_RC_COMPILE_OBJECT - " /C 1252 /fo ") -endif() - add_executable(OpenTS WIN32 ${OPENTS_SRC}) target_compile_features(OpenTS PRIVATE cxx_std_20) @@ -245,7 +239,7 @@ target_link_libraries(OpenTS PRIVATE ole32 oleaut32 uuid odbc32 odbccp32 ) -if (OPENTS_MSVC_ABI_COMPILER) +if(MSVC) target_link_options(OpenTS PRIVATE /SUBSYSTEM:WINDOWS /DEBUG diff --git a/code/language/CMakeLists.txt b/code/language/CMakeLists.txt index 2c6fcceb..110a2ad1 100644 --- a/code/language/CMakeLists.txt +++ b/code/language/CMakeLists.txt @@ -3,12 +3,6 @@ file(GLOB_RECURSE LANG_SRC CONFIGURE_DEPENDS "*.h" "*.hpp" "*.hm" ) -if(OPENTS_EXPERIMENTAL_CLANG_CL) - set(CMAKE_DEPFILE_FLAGS_RC "") - set(CMAKE_RC_COMPILE_OBJECT - " /C 1252 /fo ") -endif() - add_library(Language SHARED ${LANG_SRC}) target_compile_features(Language PRIVATE cxx_std_20) target_compile_definitions(Language PRIVATE NOMINMAX) @@ -18,7 +12,7 @@ target_compile_definitions(Language PRIVATE NOMINMAX) target_include_directories(Language PRIVATE "${OPENTS_GENERATED_DIR}") add_dependencies(Language OpenTSBuildStamp) -if (OPENTS_MSVC_ABI_COMPILER) +if(MSVC) target_link_options(Language PRIVATE "/NOENTRY" "/NODEFAULTLIB") endif() From 0ad06d7373f1a6200193a067183fb614b13d5cdd Mon Sep 17 00:00:00 2001 From: Belonit <54427022+Belonit@users.noreply.github.com> Date: Tue, 1 Sep 2026 12:39:14 +0300 Subject: [PATCH 04/12] Detect clang-cl MSVC and Windows SDK versions --- cmake/toolchains/clang-cl-msvc.cmake | 46 +++++++++++++++++++++++++--- docs/BUILDING.md | 5 +-- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/cmake/toolchains/clang-cl-msvc.cmake b/cmake/toolchains/clang-cl-msvc.cmake index f2ba09aa..ab7c670c 100644 --- a/cmake/toolchains/clang-cl-msvc.cmake +++ b/cmake/toolchains/clang-cl-msvc.cmake @@ -14,11 +14,47 @@ if(NOT OPENTS_MSVC_ROOT) "Set OPENTS_MSVC_ROOT to the directory containing MSVC and the Windows SDK.") endif() -set(_opents_msvc_version "14.44.35207") -set(_opents_sdk_version "10.0.26100.0") +set(_opents_msvc_version_file + "${OPENTS_MSVC_ROOT}/VC/Auxiliary/Build/Microsoft.VCToolsVersion.default.txt") +if(NOT EXISTS "${_opents_msvc_version_file}") + message(FATAL_ERROR + "Default MSVC toolset version not found: ${_opents_msvc_version_file}") +endif() + +file(STRINGS "${_opents_msvc_version_file}" _opents_msvc_version LIMIT_COUNT 1) +string(STRIP "${_opents_msvc_version}" _opents_msvc_version) +if(NOT _opents_msvc_version MATCHES "^14\\.([0-9]+)\\.") + message(FATAL_ERROR "Unsupported MSVC toolset version: ${_opents_msvc_version}") +endif() +set(_opents_msvc_compatibility_version "19.${CMAKE_MATCH_1}") + set(_opents_msvc_dir "${OPENTS_MSVC_ROOT}/VC/Tools/MSVC/${_opents_msvc_version}") set(_opents_sdk_dir "${OPENTS_MSVC_ROOT}/Windows Kits/10") +file(GLOB _opents_sdk_candidates + LIST_DIRECTORIES TRUE + RELATIVE "${_opents_sdk_dir}/Include" + "${_opents_sdk_dir}/Include/*") +list(SORT _opents_sdk_candidates COMPARE NATURAL ORDER DESCENDING) + +unset(_opents_sdk_version) +foreach(_candidate IN LISTS _opents_sdk_candidates) + if(_candidate MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+(\\.[0-9]+)?$" + AND IS_DIRECTORY "${_opents_sdk_dir}/Include/${_candidate}/shared" + AND IS_DIRECTORY "${_opents_sdk_dir}/Include/${_candidate}/ucrt" + AND IS_DIRECTORY "${_opents_sdk_dir}/Include/${_candidate}/um" + AND IS_DIRECTORY "${_opents_sdk_dir}/Include/${_candidate}/winrt" + AND IS_DIRECTORY "${_opents_sdk_dir}/Lib/${_candidate}/ucrt/x86" + AND IS_DIRECTORY "${_opents_sdk_dir}/Lib/${_candidate}/um/x86") + set(_opents_sdk_version "${_candidate}") + break() + endif() +endforeach() + +if(NOT _opents_sdk_version) + message(FATAL_ERROR "No complete Windows SDK found under: ${_opents_sdk_dir}") +endif() + foreach(_required_path "${_opents_msvc_dir}/include" "${_opents_sdk_dir}/Include/${_opents_sdk_version}/um") @@ -38,8 +74,10 @@ set(CMAKE_C_COMPILER "${_opents_clang_cl}") set(CMAKE_CXX_COMPILER "${_opents_clang_cl}") set(CMAKE_C_COMPILER_TARGET i686-pc-windows-msvc) set(CMAKE_CXX_COMPILER_TARGET i686-pc-windows-msvc) -set(CMAKE_C_FLAGS_INIT "/clang:-fms-compatibility-version=19.44") -set(CMAKE_CXX_FLAGS_INIT "/clang:-fms-compatibility-version=19.44") +set(CMAKE_C_FLAGS_INIT + "/clang:-fms-compatibility-version=${_opents_msvc_compatibility_version}") +set(CMAKE_CXX_FLAGS_INIT + "/clang:-fms-compatibility-version=${_opents_msvc_compatibility_version}") set(CMAKE_LINKER "${_opents_lld_link}") set(CMAKE_AR "${_opents_llvm_lib}") set(CMAKE_RC_COMPILER "${_opents_llvm_rc}" CACHE FILEPATH "" FORCE) diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 48e882ec..00fceac6 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -34,8 +34,9 @@ The reconstructed codebase may still contain undefined behavior that the supported MSVC build happens not to expose. A successful clang-cl build may therefore run incorrectly or fail at runtime; validate any result separately. -Provide a directory containing MSVC 14.44.35207 and Windows SDK 10.0.26100.0, -then configure a single-configuration Ninja build: +Provide a directory containing a Visual Studio layout and Windows SDK. The +cross-build uses the layout's default MSVC toolset and newest complete SDK. +Configure a single-configuration Ninja build: ```bash cmake -S . -B build/clang-cl -G Ninja \ From 0147bdcd7c09010998c94115e05130136eb20d3e Mon Sep 17 00:00:00 2001 From: Belonit <54427022+Belonit@users.noreply.github.com> Date: Tue, 1 Sep 2026 12:39:33 +0300 Subject: [PATCH 05/12] Clean up bgfx build integration --- code/CMakeLists.txt | 2 +- thirdparty/CMakeLists.txt | 7 ++++--- cmake/clang-compat.h => thirdparty/bx-clang-compat.h | 0 3 files changed, 5 insertions(+), 4 deletions(-) rename cmake/clang-compat.h => thirdparty/bx-clang-compat.h (100%) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 6886f226..74529d40 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -183,7 +183,7 @@ set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/bgfxbackend.cpp" PROPER # MSVC standard-library headers that follow still see the Win32 calling convention. if(OPENTS_EXPERIMENTAL_CLANG_CL AND CMAKE_SIZEOF_VOID_P EQUAL 4) set_property(SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/bgfxbackend.cpp" APPEND PROPERTY - COMPILE_OPTIONS "/FI${CMAKE_SOURCE_DIR}/cmake/clang-compat.h" + COMPILE_OPTIONS "/FI${CMAKE_SOURCE_DIR}/thirdparty/bx-clang-compat.h" ) endif() diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index 2e80372e..e5dec337 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -20,12 +20,15 @@ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") add_subdirectory(bgfx.cmake) +# These libraries support the disabled texture tools and are not linked into OpenTS. +set_target_properties(bimg_decode bimg_encode PROPERTIES EXCLUDE_FROM_ALL TRUE) + if(OPENTS_EXPERIMENTAL_CLANG_CL AND CMAKE_SIZEOF_VOID_P EQUAL 4) # bx treats Clang with the MSVC CRT like a non-x86 compiler and erases # __stdcall. Restore it before Windows declarations are parsed. foreach(target bx bimg bgfx) target_compile_options(${target} PRIVATE - "$<$:/FI${PROJECT_SOURCE_DIR}/cmake/clang-compat.h>" + "$<$:/FI${PROJECT_SOURCE_DIR}/thirdparty/bx-clang-compat.h>" ) endforeach() @@ -33,6 +36,4 @@ if(OPENTS_EXPERIMENTAL_CLANG_CL AND CMAKE_SIZEOF_VOID_P EQUAL 4) # but that intrinsic is unavailable for the Win32 target. Its SSE2 path is portable. target_compile_definitions(bimg PRIVATE ASTCENC_POPCNT=0 ASTCENC_SSE=20) - # These libraries support the disabled texture tools and are not linked into OpenTS. - set_target_properties(bimg_decode bimg_encode PROPERTIES EXCLUDE_FROM_ALL TRUE) endif() diff --git a/cmake/clang-compat.h b/thirdparty/bx-clang-compat.h similarity index 100% rename from cmake/clang-compat.h rename to thirdparty/bx-clang-compat.h From fea288abfefbcf5afeb2846c01e6a42c68a5a189 Mon Sep 17 00:00:00 2001 From: Belonit <54427022+Belonit@users.noreply.github.com> Date: Tue, 1 Sep 2026 12:39:47 +0300 Subject: [PATCH 06/12] Add clang-cl VS Code configuration examples --- .gitignore | 1 + .vscode/c_cpp_properties.clang.example.json | 92 +++++++++++++-------- cmake/toolchains/clang-cl-msvc.cmake | 1 + 3 files changed, 59 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index 98298f9b..9f686a41 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ cmake_install.cmake !.vscode/tasks.json !.vscode/launch.json !.vscode/settings.json +!.vscode/c_cpp_properties.clang.example.json .history/ /.cache/ /.clangd diff --git a/.vscode/c_cpp_properties.clang.example.json b/.vscode/c_cpp_properties.clang.example.json index 6cf637ba..5185e384 100644 --- a/.vscode/c_cpp_properties.clang.example.json +++ b/.vscode/c_cpp_properties.clang.example.json @@ -1,50 +1,72 @@ { - // Copy this file to c_cpp_properties.json and adjust these paths if needed. + // Copy this file to c_cpp_properties.json and launch VS Code from a Visual Studio + // Developer Command Prompt so the selected toolset and SDK are available. "env": { // LLVM installed with its default Windows installer location. "CLANG_CL_PATH": "${env:ProgramFiles}/LLVM/bin/clang-cl.exe", - // Visual Studio 2022 Community. Change the edition or installation path as needed. - "MSVC_ROOT": "${env:ProgramFiles}/Microsoft Visual Studio/2022/Community", - "MSVC_VERSION": "14.44.35207", - // The Windows SDK is normally installed under Program Files (x86). - "WINDOWS_SDK_ROOT": "${env:ProgramFiles(x86)}/Windows Kits/10", - "WINDOWS_SDK_VERSION": "10.0.26100.0", + "MSVC_TOOLS_DIR": "${env:VCToolsInstallDir}", + "WINDOWS_SDK_INCLUDE_DIR": "${env:WindowsSdkDir}/Include/${env:WindowsSDKVersion}", // Set this to the CMake binary directory used for the clang-cl build. - "CLANG_BUILD_DIR": "${workspaceFolder}/build/clang-cl" + "CLANG_BUILD_DIR": "${workspaceFolder}/build/clang-cl", + "CLANG_COMPILER_ARGS": [ + "--target=i686-pc-windows-msvc", + "/clang:-fms-compatibility-version=19.44" + ], + "CLANG_INCLUDE_PATH": [ + "${workspaceFolder}/code", + "${workspaceFolder}/code/vqalib", + "${workspaceFolder}/thirdparty/**", + "${CLANG_BUILD_DIR}/generated", + "${MSVC_TOOLS_DIR}/include", + "${MSVC_TOOLS_DIR}/atlmfc/include", + "${WINDOWS_SDK_INCLUDE_DIR}/ucrt", + "${WINDOWS_SDK_INCLUDE_DIR}/shared", + "${WINDOWS_SDK_INCLUDE_DIR}/um", + "${WINDOWS_SDK_INCLUDE_DIR}/winrt", + "${WINDOWS_SDK_INCLUDE_DIR}/cppwinrt" + ], + "CLANG_DEFINES": [ + "WIN32", + "_WIN32", + "_WINDOWS", + "_MBCS", + "NOMINMAX", + "NO_BLOWFISH_DLL" + ] }, "configurations": [ { - "name": "Win32 clang-cl with MSVC headers", + "name": "Win32 clang-cl Debug", + // Do not let the workspace's Visual Studio CMake provider override this configuration. + "configurationProvider": "", "compilerPath": "${CLANG_CL_PATH}", - "compilerArgs": [ - "--target=i686-pc-windows-msvc", - "/clang:-fms-compatibility-version=19.44" - ], + "compilerArgs": ["${CLANG_COMPILER_ARGS}"], "intelliSenseMode": "windows-clang-x86", "cStandard": "c17", "cppStandard": "c++20", - "includePath": [ - "${workspaceFolder}/code", - "${workspaceFolder}/code/vqalib", - "${workspaceFolder}/thirdparty/**", - "${CLANG_BUILD_DIR}/generated", - "${MSVC_ROOT}/VC/Tools/MSVC/${MSVC_VERSION}/include", - "${MSVC_ROOT}/VC/Tools/MSVC/${MSVC_VERSION}/atlmfc/include", - "${WINDOWS_SDK_ROOT}/Include/${WINDOWS_SDK_VERSION}/ucrt", - "${WINDOWS_SDK_ROOT}/Include/${WINDOWS_SDK_VERSION}/shared", - "${WINDOWS_SDK_ROOT}/Include/${WINDOWS_SDK_VERSION}/um", - "${WINDOWS_SDK_ROOT}/Include/${WINDOWS_SDK_VERSION}/winrt", - "${WINDOWS_SDK_ROOT}/Include/${WINDOWS_SDK_VERSION}/cppwinrt" - ], - "defines": [ - "WIN32", - "_WIN32", - "_WINDOWS", - "_MBCS", - "NOMINMAX", - "NO_BLOWFISH_DLL", - "BX_CONFIG_DEBUG=0" - ] + "includePath": ["${CLANG_INCLUDE_PATH}"], + "defines": ["${CLANG_DEFINES}", "_DEBUG", "BX_CONFIG_DEBUG=1"] + }, + { + "name": "Win32 clang-cl Release", + // Do not let the workspace's Visual Studio CMake provider override this configuration. + "configurationProvider": "", + "compilerPath": "${CLANG_CL_PATH}", + "compilerArgs": ["${CLANG_COMPILER_ARGS}"], + "intelliSenseMode": "windows-clang-x86", + "cStandard": "c17", + "cppStandard": "c++20", + "includePath": ["${CLANG_INCLUDE_PATH}"], + "defines": ["${CLANG_DEFINES}", "NDEBUG", "BX_CONFIG_DEBUG=0"] + }, + { + "name": "Win32 clang-cl compilation database", + // Configure the clang-cl Ninja build before selecting this configuration. + "configurationProvider": "", + "compileCommands": "${CLANG_BUILD_DIR}/compile_commands.json", + "intelliSenseMode": "windows-clang-x86", + "cStandard": "c17", + "cppStandard": "c++20" } ], "version": 4 diff --git a/cmake/toolchains/clang-cl-msvc.cmake b/cmake/toolchains/clang-cl-msvc.cmake index ab7c670c..ba3d7709 100644 --- a/cmake/toolchains/clang-cl-msvc.cmake +++ b/cmake/toolchains/clang-cl-msvc.cmake @@ -2,6 +2,7 @@ set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR x86) set(OPENTS_EXPERIMENTAL_CLANG_CL ON CACHE BOOL "" FORCE) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE BOOL "" FORCE) set(OPENTS_MSVC_ROOT "" CACHE PATH "Path to the MSVC and Windows SDK files") list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES OPENTS_MSVC_ROOT) From bf0a73e1f51e3d2d36830d931e9cb492dca6fdb3 Mon Sep 17 00:00:00 2001 From: ZivDero Date: Tue, 1 Sep 2026 19:24:55 +0300 Subject: [PATCH 07/12] Select MSVC-only compile flags with generator expressions --- code/CMakeLists.txt | 26 ++++++++------------------ thirdparty/CMakeLists.txt | 1 - 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 74529d40..94876c52 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -92,16 +92,6 @@ set_target_properties(OpenTS PROPERTIES # message(STATUS "${PROJECT_NAME}: Applying compiler flags...") -if(OPENTS_EXPERIMENTAL_CLANG_CL) - set(OPENTS_ASM_MASM_OPTIONS -Zi -c -coff -Cx -safeseh) - set(OPENTS_ASM_MASM_SOURCE_OPTIONS "-Zi -c -coff -Cx -safeseh") - set(OPENTS_PARALLEL_COMPILE_OPTION "") -else() - set(OPENTS_ASM_MASM_OPTIONS /Zi /c /coff /Cx /safeseh) - set(OPENTS_ASM_MASM_SOURCE_OPTIONS "/Zi /c /coff /Cx /safeseh") - set(OPENTS_PARALLEL_COMPILE_OPTION /MP) -endif() - set(OPENTS_COMPILE_OPTIONS # ================= DEBUG ================= @@ -111,17 +101,17 @@ set(OPENTS_COMPILE_OPTIONS # /arch:SSE2 -- IEEE-754 single precision, no x87 excess precision. # /fp:precise -- no reassociation of the engine's accumulations. $<$: - /Zi /Od /RTC1 /GR ${OPENTS_PARALLEL_COMPILE_OPTION} /EHsc /Oy- /MTd /Zc:__cplusplus /arch:SSE2 /fp:precise + /Zi /Od /RTC1 /GR $<$:/MP> /EHsc /Oy- /MTd /Zc:__cplusplus /arch:SSE2 /fp:precise > # ---------- C ---------- $<$: - /Zi /Od /RTC1 ${OPENTS_PARALLEL_COMPILE_OPTION} /Oy- /arch:SSE2 /fp:precise + /Zi /Od /RTC1 $<$:/MP> /Oy- /arch:SSE2 /fp:precise > # ---------- MASM ---------- $<$: - ${OPENTS_ASM_MASM_OPTIONS} + -Zi -c -coff -Cx -safeseh > > @@ -132,17 +122,17 @@ set(OPENTS_COMPILE_OPTIONS # /arch:SSE2 -- IEEE-754 single precision, no x87 excess precision. # /fp:precise -- no reassociation of the engine's accumulations. $<$: - /Zi /O2 /GF /GR ${OPENTS_PARALLEL_COMPILE_OPTION} /EHsc /MT /Zc:__cplusplus /arch:SSE2 /fp:precise + /Zi /O2 /GF /GR $<$:/MP> /EHsc /MT /Zc:__cplusplus /arch:SSE2 /fp:precise > # ---------- C ---------- $<$: - /Zi /O2 /GF ${OPENTS_PARALLEL_COMPILE_OPTION} /arch:SSE2 /fp:precise + /Zi /O2 /GF $<$:/MP> /arch:SSE2 /fp:precise > # ---------- MASM ---------- $<$: - ${OPENTS_ASM_MASM_OPTIONS} + -Zi -c -coff -Cx -safeseh > > ) @@ -264,12 +254,12 @@ message(STATUS "${PROJECT_NAME}: Adding MASM support...") enable_language(ASM_MASM) -# The experimental clang-cl toolchain uses native UASM; Visual Studio uses ML.EXE. +# Dash-form options assemble under both ML.EXE and the clang-cl toolchain's UASM. foreach(f ${OPENTS_SRC}) if(f MATCHES "\\.asm$") set_source_files_properties(${f} PROPERTIES LANGUAGE ASM_MASM - COMPILE_FLAGS "${OPENTS_ASM_MASM_SOURCE_OPTIONS}" + COMPILE_FLAGS "-Zi -c -coff -Cx" ) endif() endforeach() diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index e5dec337..f16e34ec 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -35,5 +35,4 @@ if(OPENTS_EXPERIMENTAL_CLANG_CL AND CMAKE_SIZEOF_VOID_P EQUAL 4) # The ASTC encoder selects a 64-bit popcount intrinsic when SSE4.2 is enabled, # but that intrinsic is unavailable for the Win32 target. Its SSE2 path is portable. target_compile_definitions(bimg PRIVATE ASTCENC_POPCNT=0 ASTCENC_SSE=20) - endif() From 4ac3772848217e173e22a0ad7bad5543b65f39a2 Mon Sep 17 00:00:00 2001 From: ZivDero Date: Tue, 1 Sep 2026 19:27:55 +0300 Subject: [PATCH 08/12] Read clang-cl IntelliSense from the compilation database --- .vscode/c_cpp_properties.clang.example.json | 68 ++------------------- 1 file changed, 6 insertions(+), 62 deletions(-) diff --git a/.vscode/c_cpp_properties.clang.example.json b/.vscode/c_cpp_properties.clang.example.json index 5185e384..d612d87c 100644 --- a/.vscode/c_cpp_properties.clang.example.json +++ b/.vscode/c_cpp_properties.clang.example.json @@ -1,69 +1,13 @@ { - // Copy this file to c_cpp_properties.json and launch VS Code from a Visual Studio - // Developer Command Prompt so the selected toolset and SDK are available. - "env": { - // LLVM installed with its default Windows installer location. - "CLANG_CL_PATH": "${env:ProgramFiles}/LLVM/bin/clang-cl.exe", - "MSVC_TOOLS_DIR": "${env:VCToolsInstallDir}", - "WINDOWS_SDK_INCLUDE_DIR": "${env:WindowsSdkDir}/Include/${env:WindowsSDKVersion}", - // Set this to the CMake binary directory used for the clang-cl build. - "CLANG_BUILD_DIR": "${workspaceFolder}/build/clang-cl", - "CLANG_COMPILER_ARGS": [ - "--target=i686-pc-windows-msvc", - "/clang:-fms-compatibility-version=19.44" - ], - "CLANG_INCLUDE_PATH": [ - "${workspaceFolder}/code", - "${workspaceFolder}/code/vqalib", - "${workspaceFolder}/thirdparty/**", - "${CLANG_BUILD_DIR}/generated", - "${MSVC_TOOLS_DIR}/include", - "${MSVC_TOOLS_DIR}/atlmfc/include", - "${WINDOWS_SDK_INCLUDE_DIR}/ucrt", - "${WINDOWS_SDK_INCLUDE_DIR}/shared", - "${WINDOWS_SDK_INCLUDE_DIR}/um", - "${WINDOWS_SDK_INCLUDE_DIR}/winrt", - "${WINDOWS_SDK_INCLUDE_DIR}/cppwinrt" - ], - "CLANG_DEFINES": [ - "WIN32", - "_WIN32", - "_WINDOWS", - "_MBCS", - "NOMINMAX", - "NO_BLOWFISH_DLL" - ] - }, + // Copy this file to c_cpp_properties.json to browse the clang-cl cross-build. + // Configure that build first; this reads its compilation database. "configurations": [ { - "name": "Win32 clang-cl Debug", - // Do not let the workspace's Visual Studio CMake provider override this configuration. + "name": "Win32 clang-cl", + // The workspace points cpptools at the CMake Tools provider for the + // supported MSVC build, which would otherwise take precedence here. "configurationProvider": "", - "compilerPath": "${CLANG_CL_PATH}", - "compilerArgs": ["${CLANG_COMPILER_ARGS}"], - "intelliSenseMode": "windows-clang-x86", - "cStandard": "c17", - "cppStandard": "c++20", - "includePath": ["${CLANG_INCLUDE_PATH}"], - "defines": ["${CLANG_DEFINES}", "_DEBUG", "BX_CONFIG_DEBUG=1"] - }, - { - "name": "Win32 clang-cl Release", - // Do not let the workspace's Visual Studio CMake provider override this configuration. - "configurationProvider": "", - "compilerPath": "${CLANG_CL_PATH}", - "compilerArgs": ["${CLANG_COMPILER_ARGS}"], - "intelliSenseMode": "windows-clang-x86", - "cStandard": "c17", - "cppStandard": "c++20", - "includePath": ["${CLANG_INCLUDE_PATH}"], - "defines": ["${CLANG_DEFINES}", "NDEBUG", "BX_CONFIG_DEBUG=0"] - }, - { - "name": "Win32 clang-cl compilation database", - // Configure the clang-cl Ninja build before selecting this configuration. - "configurationProvider": "", - "compileCommands": "${CLANG_BUILD_DIR}/compile_commands.json", + "compileCommands": "${workspaceFolder}/build/clang-cl/compile_commands.json", "intelliSenseMode": "windows-clang-x86", "cStandard": "c17", "cppStandard": "c++20" From c99cc998200414229b722cf758a51fec462bc324 Mon Sep 17 00:00:00 2001 From: ZivDero Date: Tue, 1 Sep 2026 19:27:56 +0300 Subject: [PATCH 09/12] Move the clang-cl build into its own documentation section --- docs/BUILDING.md | 53 ++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 00fceac6..0ab66d11 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -23,32 +23,6 @@ supported by the current tree. Install Visual Studio 2022 with the **Desktop development with C++** workload, a Windows SDK, CMake 3.23 or newer, and Git for Windows. -### Experimental clang-cl cross-build - -An unsupported Linux cross-build is available for compiler-portability work. It -uses native `clang-cl`, LLD, LLVM library and resource tools, and UASM with -the MSVC headers and libraries. It does not expand the supported build matrix -or establish runtime behavior. - -The reconstructed codebase may still contain undefined behavior that the -supported MSVC build happens not to expose. A successful clang-cl build may -therefore run incorrectly or fail at runtime; validate any result separately. - -Provide a directory containing a Visual Studio layout and Windows SDK. The -cross-build uses the layout's default MSVC toolset and newest complete SDK. -Configure a single-configuration Ninja build: - -```bash -cmake -S . -B build/clang-cl -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/clang-cl-msvc.cmake \ - -DOPENTS_MSVC_ROOT=/path/to/msvc -cmake --build build/clang-cl -``` - -The toolchain requires `clang-cl`, `lld-link`, `llvm-lib`, `llvm-mt`, -`llvm-rc`, and `uasm` on `PATH`. - ## Dependencies The renderer is built on [bgfx](https://github.com/bkaradzic/bgfx), vendored as the @@ -90,6 +64,33 @@ name and copy the runtime files into `TS_RUN_DIR`, which defaults to `Run/`: built configuration replaces the previous copy in `Run/`. Compiler and linker intermediates remain under the selected build directory. +## Experimental clang-cl cross-build + +An unsupported Linux cross-build is available for compiler-portability work. It +uses native `clang-cl`, LLD, LLVM library and resource tools, and UASM with the +MSVC headers and libraries. It does not expand the supported build matrix or +establish runtime behavior. + +The reconstructed codebase may still contain undefined behavior that the +supported MSVC build happens not to expose. A successful clang-cl build may +therefore run incorrectly or fail at runtime; validate any result separately. + +Provide a directory containing a Visual Studio layout and Windows SDK. The +cross-build uses the layout's default MSVC toolset and newest complete SDK. +Configure a single-configuration Ninja build: + +```bash +cmake -S . -B build/clang-cl -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/clang-cl-msvc.cmake \ + -DOPENTS_MSVC_ROOT=/path/to/msvc +cmake --build build/clang-cl +``` + +The toolchain requires `clang-cl`, `lld-link`, `llvm-lib`, `llvm-mt`, `llvm-rc`, +and `uasm` on `PATH`. It exports `compile_commands.json`; +`.vscode/c_cpp_properties.clang.example.json` reads that file for IntelliSense. + ## Build from Visual Studio Code Visual Studio Code (VSCode) support includes (assuming recommended extensions are installed): From ad33cfbb3efa44300ffb978a462aaef9aed5b3e6 Mon Sep 17 00:00:00 2001 From: ZivDero Date: Tue, 1 Sep 2026 19:49:17 +0300 Subject: [PATCH 10/12] Revert "Read clang-cl IntelliSense from the compilation database" This reverts commit 4ac3772848217e173e22a0ad7bad5543b65f39a2. --- .vscode/c_cpp_properties.clang.example.json | 68 +++++++++++++++++++-- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/.vscode/c_cpp_properties.clang.example.json b/.vscode/c_cpp_properties.clang.example.json index d612d87c..5185e384 100644 --- a/.vscode/c_cpp_properties.clang.example.json +++ b/.vscode/c_cpp_properties.clang.example.json @@ -1,13 +1,69 @@ { - // Copy this file to c_cpp_properties.json to browse the clang-cl cross-build. - // Configure that build first; this reads its compilation database. + // Copy this file to c_cpp_properties.json and launch VS Code from a Visual Studio + // Developer Command Prompt so the selected toolset and SDK are available. + "env": { + // LLVM installed with its default Windows installer location. + "CLANG_CL_PATH": "${env:ProgramFiles}/LLVM/bin/clang-cl.exe", + "MSVC_TOOLS_DIR": "${env:VCToolsInstallDir}", + "WINDOWS_SDK_INCLUDE_DIR": "${env:WindowsSdkDir}/Include/${env:WindowsSDKVersion}", + // Set this to the CMake binary directory used for the clang-cl build. + "CLANG_BUILD_DIR": "${workspaceFolder}/build/clang-cl", + "CLANG_COMPILER_ARGS": [ + "--target=i686-pc-windows-msvc", + "/clang:-fms-compatibility-version=19.44" + ], + "CLANG_INCLUDE_PATH": [ + "${workspaceFolder}/code", + "${workspaceFolder}/code/vqalib", + "${workspaceFolder}/thirdparty/**", + "${CLANG_BUILD_DIR}/generated", + "${MSVC_TOOLS_DIR}/include", + "${MSVC_TOOLS_DIR}/atlmfc/include", + "${WINDOWS_SDK_INCLUDE_DIR}/ucrt", + "${WINDOWS_SDK_INCLUDE_DIR}/shared", + "${WINDOWS_SDK_INCLUDE_DIR}/um", + "${WINDOWS_SDK_INCLUDE_DIR}/winrt", + "${WINDOWS_SDK_INCLUDE_DIR}/cppwinrt" + ], + "CLANG_DEFINES": [ + "WIN32", + "_WIN32", + "_WINDOWS", + "_MBCS", + "NOMINMAX", + "NO_BLOWFISH_DLL" + ] + }, "configurations": [ { - "name": "Win32 clang-cl", - // The workspace points cpptools at the CMake Tools provider for the - // supported MSVC build, which would otherwise take precedence here. + "name": "Win32 clang-cl Debug", + // Do not let the workspace's Visual Studio CMake provider override this configuration. "configurationProvider": "", - "compileCommands": "${workspaceFolder}/build/clang-cl/compile_commands.json", + "compilerPath": "${CLANG_CL_PATH}", + "compilerArgs": ["${CLANG_COMPILER_ARGS}"], + "intelliSenseMode": "windows-clang-x86", + "cStandard": "c17", + "cppStandard": "c++20", + "includePath": ["${CLANG_INCLUDE_PATH}"], + "defines": ["${CLANG_DEFINES}", "_DEBUG", "BX_CONFIG_DEBUG=1"] + }, + { + "name": "Win32 clang-cl Release", + // Do not let the workspace's Visual Studio CMake provider override this configuration. + "configurationProvider": "", + "compilerPath": "${CLANG_CL_PATH}", + "compilerArgs": ["${CLANG_COMPILER_ARGS}"], + "intelliSenseMode": "windows-clang-x86", + "cStandard": "c17", + "cppStandard": "c++20", + "includePath": ["${CLANG_INCLUDE_PATH}"], + "defines": ["${CLANG_DEFINES}", "NDEBUG", "BX_CONFIG_DEBUG=0"] + }, + { + "name": "Win32 clang-cl compilation database", + // Configure the clang-cl Ninja build before selecting this configuration. + "configurationProvider": "", + "compileCommands": "${CLANG_BUILD_DIR}/compile_commands.json", "intelliSenseMode": "windows-clang-x86", "cStandard": "c17", "cppStandard": "c++20" From e1391a5088eec107549e9fa62c22864efccda7c8 Mon Sep 17 00:00:00 2001 From: ZivDero Date: Tue, 1 Sep 2026 19:49:45 +0300 Subject: [PATCH 11/12] Describe the clang-cl IntelliSense example accurately --- docs/BUILDING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 0ab66d11..631f9310 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -88,7 +88,7 @@ cmake --build build/clang-cl ``` The toolchain requires `clang-cl`, `lld-link`, `llvm-lib`, `llvm-mt`, `llvm-rc`, -and `uasm` on `PATH`. It exports `compile_commands.json`; +and `uasm` on `PATH`. It exports `compile_commands.json`; one configuration in `.vscode/c_cpp_properties.clang.example.json` reads that file for IntelliSense. ## Build from Visual Studio Code From 884a9784e39f117cfa966878e032ff0cbd395974 Mon Sep 17 00:00:00 2001 From: ZivDero Date: Tue, 1 Sep 2026 20:36:27 +0300 Subject: [PATCH 12/12] Note the toolset the pinned compatibility version matches --- .vscode/c_cpp_properties.clang.example.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.vscode/c_cpp_properties.clang.example.json b/.vscode/c_cpp_properties.clang.example.json index 5185e384..d2a94c3d 100644 --- a/.vscode/c_cpp_properties.clang.example.json +++ b/.vscode/c_cpp_properties.clang.example.json @@ -10,6 +10,7 @@ "CLANG_BUILD_DIR": "${workspaceFolder}/build/clang-cl", "CLANG_COMPILER_ARGS": [ "--target=i686-pc-windows-msvc", + // Match the 14.44 MSVC toolset; update both together. "/clang:-fms-compatibility-version=19.44" ], "CLANG_INCLUDE_PATH": [