Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 24 additions & 10 deletions cmake/toolchains/clang-cl-msvc.cmake
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR x86)
set(OPENTS_TARGET_ARCH "x86" CACHE STRING "Target architecture: x86 or x64")
set_property(CACHE OPENTS_TARGET_ARCH PROPERTY STRINGS x86 x64)
if(NOT OPENTS_TARGET_ARCH MATCHES "^(x86|x64)$")
message(FATAL_ERROR "OPENTS_TARGET_ARCH must be x86 or x64.")
endif()
if(OPENTS_TARGET_ARCH STREQUAL "x64")
set(CMAKE_SYSTEM_PROCESSOR AMD64)
else()
set(CMAKE_SYSTEM_PROCESSOR x86)
endif()

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)
list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES OPENTS_MSVC_ROOT OPENTS_TARGET_ARCH)

if(NOT OPENTS_MSVC_ROOT AND DEFINED ENV{OPENTS_MSVC_ROOT})
set(OPENTS_MSVC_ROOT "$ENV{OPENTS_MSVC_ROOT}" CACHE PATH "" FORCE)
Expand Down Expand Up @@ -45,8 +54,8 @@ foreach(_candidate IN LISTS _opents_sdk_candidates)
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")
AND IS_DIRECTORY "${_opents_sdk_dir}/Lib/${_candidate}/ucrt/${OPENTS_TARGET_ARCH}"
AND IS_DIRECTORY "${_opents_sdk_dir}/Lib/${_candidate}/um/${OPENTS_TARGET_ARCH}")
set(_opents_sdk_version "${_candidate}")
break()
endif()
Expand All @@ -72,8 +81,13 @@ find_program(_opents_llvm_rc llvm-rc 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)
if(OPENTS_TARGET_ARCH STREQUAL "x64")
set(_opents_compiler_target x86_64-pc-windows-msvc)
else()
set(_opents_compiler_target i686-pc-windows-msvc)
endif()
set(CMAKE_C_COMPILER_TARGET "${_opents_compiler_target}")
set(CMAKE_CXX_COMPILER_TARGET "${_opents_compiler_target}")
set(CMAKE_C_FLAGS_INIT
"/clang:-fms-compatibility-version=${_opents_msvc_compatibility_version}")
set(CMAKE_CXX_FLAGS_INIT
Expand Down Expand Up @@ -102,10 +116,10 @@ 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\"")
"/libpath:\"${_opents_msvc_dir}/atlmfc/lib/${OPENTS_TARGET_ARCH}\""
"/libpath:\"${_opents_msvc_dir}/lib/${OPENTS_TARGET_ARCH}\""
"/libpath:\"${_opents_sdk_dir}/Lib/${_opents_sdk_version}/ucrt/${OPENTS_TARGET_ARCH}\""
"/libpath:\"${_opents_sdk_dir}/Lib/${_opents_sdk_version}/um/${OPENTS_TARGET_ARCH}\"")
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}")
Expand Down
3 changes: 3 additions & 0 deletions docs/BUILDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,9 @@ cmake -S . -B build/clang-cl -G Ninja \
cmake --build build/clang-cl
```

`OPENTS_TARGET_ARCH` defaults to `x86`. For x64, add
`-DOPENTS_TARGET_ARCH=x64` and use a separate build directory.

The toolchain requires `clang-cl`, `lld-link`, `llvm-lib`, `llvm-mt`, and
`llvm-rc` on `PATH`. It exports `compile_commands.json`; one configuration in
`.vscode/c_cpp_properties.clang.example.json` reads that file for IntelliSense.
Expand Down
7 changes: 5 additions & 2 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,14 @@ function(opents_add_test target)
target_compile_definitions(${target} PRIVATE ${TEST_DEFINITIONS})
endif()

if(MSVC)
set_property(TARGET ${target} PROPERTY MSVC_RUNTIME_LIBRARY
"MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()

# The option spellings and the Win32 import libraries below are MSVC's, so a harness built
# by another compiler takes its defaults instead.
target_compile_options(${target} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:$<$<CONFIG:Debug>:/MTd>>
$<$<CXX_COMPILER_ID:MSVC>:$<$<CONFIG:Release>:/MT>>
$<$<CXX_COMPILER_ID:MSVC>:/EHsc>
$<$<CXX_COMPILER_ID:MSVC>:/Zc:__cplusplus>
)
Expand Down
4 changes: 0 additions & 4 deletions tests/nettiming/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,3 @@ opents_add_test(NetConnection
DEFINITIONS WIN32 _WINDOWS _MBCS NOMINMAX
LIBRARIES winmm
)

set_source_files_properties("${CMAKE_SOURCE_DIR}/code/combuf.cpp" PROPERTIES
COMPILE_OPTIONS "/source-charset:437;/execution-charset:437"
)
Loading