blob: e9b387b634f5ff59cf43b9f7c773dff4c5bce0ef [file] [edit]
# WebKit dropped MSVC support. This file is only for clang-cl.
# Detect Windows cross-compilation from Linux
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(WEBKIT_WIN_CROSS_COMPILE ON)
message(STATUS "Cross-compiling Windows port from Linux host")
# Define the sysroot location
set(WEBKIT_WIN_SYSROOT "${CMAKE_SOURCE_DIR}/WebKitLibraries/windows")
# Verify SDK exists
if (NOT EXISTS "${WEBKIT_WIN_SYSROOT}/sdk/include/um/windows.h")
message(FATAL_ERROR "Windows SDK not found at ${WEBKIT_WIN_SYSROOT}. "
"Run Tools/Scripts/check-win-cross-build-deps to download it.")
endif ()
# Define paths
set(WIN_SDK_INC "${WEBKIT_WIN_SYSROOT}/sdk/include")
set(WIN_CRT_INC "${WEBKIT_WIN_SYSROOT}/crt/include")
set(WIN_SDK_LIB "${WEBKIT_WIN_SYSROOT}/sdk/lib")
set(WIN_CRT_LIB "${WEBKIT_WIN_SYSROOT}/crt/lib")
# Set compiler include flags (-imsvc for clang-cl)
string(APPEND CMAKE_C_FLAGS " -imsvc ${WIN_CRT_INC} -imsvc ${WIN_SDK_INC}/ucrt -imsvc ${WIN_SDK_INC}/um -imsvc ${WIN_SDK_INC}/shared -imsvc ${WIN_SDK_INC}/winrt")
string(APPEND CMAKE_CXX_FLAGS " -imsvc ${WIN_CRT_INC} -imsvc ${WIN_SDK_INC}/ucrt -imsvc ${WIN_SDK_INC}/um -imsvc ${WIN_SDK_INC}/shared -imsvc ${WIN_SDK_INC}/winrt")
# Set linker library path flags
if (WTF_CPU_ARM64)
set(WIN_LIB_ARCH "arm64")
else ()
set(WIN_LIB_ARCH "x64")
endif ()
set(WIN_CROSS_LINK_FLAGS "-libpath:${WIN_CRT_LIB}/${WIN_LIB_ARCH} -libpath:${WIN_SDK_LIB}/ucrt/${WIN_LIB_ARCH} -libpath:${WIN_SDK_LIB}/um/${WIN_LIB_ARCH}")
string(APPEND CMAKE_EXE_LINKER_FLAGS " ${WIN_CROSS_LINK_FLAGS}")
string(APPEND CMAKE_SHARED_LINKER_FLAGS " ${WIN_CROSS_LINK_FLAGS}")
string(APPEND CMAKE_MODULE_LINKER_FLAGS " ${WIN_CROSS_LINK_FLAGS}")
# Set RC compiler include flags
set(CMAKE_RC_FLAGS "-I ${WIN_SDK_INC}/um -I ${WIN_SDK_INC}/ucrt -I ${WIN_SDK_INC}/shared")
# Auto-detect LLVM tools (version 20 suffix as installed by deps script)
if (NOT CMAKE_AR)
find_program(CMAKE_AR NAMES llvm-lib-20 llvm-lib REQUIRED)
endif ()
if (NOT CMAKE_RC_COMPILER)
find_program(CMAKE_RC_COMPILER NAMES llvm-rc-20 llvm-rc REQUIRED)
endif ()
if (NOT CMAKE_RANLIB)
find_program(CMAKE_RANLIB NAMES llvm-ranlib-20 llvm-ranlib REQUIRED)
endif ()
message(STATUS "Cross-compile sysroot: ${WEBKIT_WIN_SYSROOT}")
message(STATUS "Cross-compile AR: ${CMAKE_AR}")
message(STATUS "Cross-compile RC: ${CMAKE_RC_COMPILER}")
endif ()
function(MSVC_ADD_COMPILE_OPTIONS)
foreach (_option ${ARGV})
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:${_option}>)
endforeach ()
endfunction()
# Use AT&T syntax for inline asm
MSVC_ADD_COMPILE_OPTIONS(/clang:-masm=att)
# Create pdb files for debugging purposes, also for Release builds
MSVC_ADD_COMPILE_OPTIONS(/Zi /GS)
# Disable ICF (identical code folding) optimization,
# as it makes it unsafe to pointer-compare functions with identical definitions.
add_link_options(/DEBUG /OPT:NOICF /OPT:REF)
# We do not use exceptions
add_definitions(-D_HAS_EXCEPTIONS=0)
string(REGEX REPLACE "/EH[-a-z]+" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
MSVC_ADD_COMPILE_OPTIONS(/EHa- /EHc- /EHs- /fp:except-)
# Disable RTTI
string(REGEX REPLACE "/GR-?" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
MSVC_ADD_COMPILE_OPTIONS(/GR-)
# We have some very large object files that have to be linked
MSVC_ADD_COMPILE_OPTIONS(/analyze- /bigobj)
# Use CRT security features
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE)
# Specify the source code encoding
MSVC_ADD_COMPILE_OPTIONS(/utf-8 /validate-charset)
if (NOT ${CMAKE_GENERATOR} MATCHES "Ninja")
MSVC_ADD_COMPILE_OPTIONS(/MP)
endif ()
WEBKIT_APPEND_GLOBAL_COMPILER_FLAGS(/Wmicrosoft-include)
# More warnings. /W4 should be specified before -Wno-* options for clang-cl.
string(REGEX REPLACE "/W3" "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
string(REGEX REPLACE "/W3" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
WEBKIT_PREPEND_GLOBAL_COMPILER_FLAGS(/W4)
# Not apply class-level dllexport and dllimport attributes to inline member functions
WEBKIT_PREPEND_GLOBAL_COMPILER_FLAGS(/Zc:dllexportInlines-)
# Make sure incremental linking is turned off, as it creates unacceptably long link times.
string(REPLACE "/INCREMENTAL[:A-Z]+" "" CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS})
string(REPLACE "/INCREMENTAL[:A-Z]+" "" CMAKE_EXE_LINKER_FLAGS_DEBUG ${CMAKE_EXE_LINKER_FLAGS_DEBUG})
string(REPLACE "/INCREMENTAL[:A-Z]+" "" CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO})
string(REPLACE "/INCREMENTAL[:A-Z]+" "" CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS})
string(REPLACE "/INCREMENTAL[:A-Z]+" "" CMAKE_SHARED_LINKER_FLAGS_DEBUG ${CMAKE_SHARED_LINKER_FLAGS_DEBUG})
string(REPLACE "/INCREMENTAL[:A-Z]+" "" CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO ${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO})
add_link_options(/INCREMENTAL:NO)
# Link clang runtime builtins library
string(REGEX MATCH "^[0-9]+" CLANG_CL_MAJOR_VERSION ${CMAKE_CXX_COMPILER_VERSION})
cmake_path(REMOVE_FILENAME CMAKE_CXX_COMPILER OUTPUT_VARIABLE CLANG_CL_DIR)
cmake_path(APPEND CLANG_CL_DIR "../lib/clang" ${CLANG_CL_MAJOR_VERSION} "lib/windows")
if (WTF_CPU_ARM64)
set(CLANG_BUILTINS_ARCH "aarch64")
else ()
set(CLANG_BUILTINS_ARCH "x86_64")
endif ()
find_library(CLANG_BUILTINS_LIBRARY clang_rt.builtins-${CLANG_BUILTINS_ARCH}
PATHS ${CLANG_CL_DIR} ${CMAKE_SOURCE_DIR}/WebKitLibraries/windows
REQUIRED NO_DEFAULT_PATH)
link_libraries(${CLANG_BUILTINS_LIBRARY})
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:8388608")