aboutsummaryrefslogtreecommitdiff
path: root/xmake.lua
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2026-03-16 10:52:45 +0100
committerGitHub Enterprise <[email protected]>2026-03-16 10:52:45 +0100
commit79e10a165cf09dc2cc120b3a226c51f87c235f20 (patch)
treecf51b07e097904044b4bf65bc3fe0ad14134074f /xmake.lua
parentLinux build improvements (#843) (diff)
downloadzen-79e10a165cf09dc2cc120b3a226c51f87c235f20.tar.xz
zen-79e10a165cf09dc2cc120b3a226c51f87c235f20.zip
Enable cross compilation of Windows targets on Linux (#839)
This PR makes it *possible* to do a Windows build on Linux via `clang-cl`. It doesn't actually change any build process. No policy change, just mechanics and some code fixes to clear clang compilation. The code fixes are mainly related to #include file name casing, to match the on-disk casing of the SDK files (via xwin).
Diffstat (limited to 'xmake.lua')
-rw-r--r--xmake.lua98
1 files changed, 51 insertions, 47 deletions
diff --git a/xmake.lua b/xmake.lua
index 4110f25e2..846bc8f1d 100644
--- a/xmake.lua
+++ b/xmake.lua
@@ -6,6 +6,12 @@ set_configvar("ZEN_DATA_FORCE_SCRUB_VERSION", 0)
set_allowedplats("windows", "linux", "macosx")
set_allowedarchs("windows|x64", "linux|x86_64", "macosx|x86_64", "macosx|arm64")
+-- Returns true when building for Windows with native MSVC (not clang-cl cross-compilation)
+function is_native_msvc()
+ local tc = get_config("toolchain") or ""
+ return is_plat("windows") and tc ~= "clang-cl"
+end
+
--------------------------------------------------------------------------
-- We support debug and release modes. On Windows we use static CRT to
-- minimize dependencies.
@@ -146,7 +152,9 @@ enable_unity = false
if is_mode("release") then
-- LTO does not appear to work with the current Linux UE toolchain
-- Also, disabled LTO on Mac to reduce time spent building openssl tests
- if not is_plat("linux", "macosx") then
+ -- Disabled for cross-compilation (clang-cl on Linux) due to cmake package compat issues
+ local is_cross_win = is_plat("windows") and is_host("linux")
+ if not is_plat("linux", "macosx") and not is_cross_win then
set_policy("build.optimization.lto", true)
end
set_optimize("fastest")
@@ -169,6 +177,12 @@ else
set_encodings("source:utf-8", "target:utf-8")
end
+-- When cross-compiling with clang-cl, the xwin SDK may ship a newer MSVC STL
+-- than the host clang version supports. Bypass the version gate.
+if is_plat("windows") and not is_native_msvc() then
+ add_defines("_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH")
+end
+
if is_os("windows") then
add_defines(
"_CRT_SECURE_NO_WARNINGS",
@@ -181,59 +195,49 @@ if is_os("windows") then
"_WIN32_WINNT=0x0A00",
"_WINSOCK_DEPRECATED_NO_WARNINGS" -- let us use the ANSI functions
)
- -- Make builds more deterministic and portable
- add_cxxflags("/d1trimfile:$(curdir)\\") -- eliminates the base path from __FILE__ paths
- add_cxxflags("/experimental:deterministic") -- (more) deterministic compiler output
- add_ldflags("/PDBALTPATH:%_PDB%") -- deterministic pdb reference in exe
-
- add_cxxflags("/Zc:preprocessor") -- Enable preprocessor conformance mode
- add_cxxflags("/Zc:u8EscapeEncoding") -- Enable UTF-8 encoding for u8 string literals
- add_cxxflags("/Zc:inline") -- Enforce inline semantics
+ -- Make builds more deterministic and portable (MSVC-only flags)
+ if is_native_msvc() then
+ add_cxxflags("/d1trimfile:$(curdir)\\") -- eliminates the base path from __FILE__ paths
+ add_cxxflags("/experimental:deterministic") -- (more) deterministic compiler output
+ add_ldflags("/PDBALTPATH:%_PDB%") -- deterministic pdb reference in exe
+ add_cxxflags("/Zc:u8EscapeEncoding") -- Enable UTF-8 encoding for u8 string literals (clang does this by default)
+ add_cxxflags("/Zc:preprocessor") -- Enable preprocessor conformance mode
+ add_cxxflags("/Zc:inline") -- Enforce inline semantics
+ end
-- add_ldflags("/MAP")
end
-if is_os("linux") or is_os("macosx") then
- add_cxxflags("-Wno-implicit-fallthrough")
- add_cxxflags("-Wno-missing-field-initializers")
- add_cxxflags("-Wno-strict-aliasing")
- add_cxxflags("-Wno-switch")
- add_cxxflags("-Wno-unused-lambda-capture")
- add_cxxflags("-Wno-unused-private-field")
- add_cxxflags("-Wno-unused-value")
- add_cxxflags("-Wno-unused-variable")
- add_cxxflags("-Wno-vla-cxx-extension")
+-- Clang warning suppressions (native clang on Linux/Mac, or clang-cl cross-compile)
+if is_os("linux") or is_os("macosx") or not is_native_msvc() then
+ -- Silence warnings about unrecognized -Wno-* flags on older clang versions
+ add_cxxflags("-Wno-unknown-warning-option", {force = true})
+ add_cxxflags("-Wno-delete-non-abstract-non-virtual-dtor", {force = true})
+ add_cxxflags("-Wno-format", {force = true})
+ add_cxxflags("-Wno-implicit-fallthrough", {force = true})
+ add_cxxflags("-Wno-inconsistent-missing-override", {force = true})
+ add_cxxflags("-Wno-missing-field-initializers", {force = true})
+ add_cxxflags("-Wno-nonportable-include-path", {force = true})
+ add_cxxflags("-Wno-sign-compare", {force = true})
+ add_cxxflags("-Wno-strict-aliasing", {force = true})
+ add_cxxflags("-Wno-switch", {force = true})
+ add_cxxflags("-Wno-unused-lambda-capture", {force = true})
+ add_cxxflags("-Wno-unused-private-field", {force = true})
+ add_cxxflags("-Wno-unused-value", {force = true})
+ add_cxxflags("-Wno-unused-variable", {force = true})
+ add_cxxflags("-Wno-vla-cxx-extension", {force = true})
-- GCC false positive: constinit static locals used by reference are reported as unused-but-set
- add_cxxflags("-Wno-unused-but-set-variable", {tools="gcc"})
+ add_cxxflags("-Wno-unused-but-set-variable", {tools = "gcc"})
end
+-- Additional suppressions specific to clang-cl cross-compilation
if get_config("toolchain") == "clang-cl" then
- add_cxxflags("-Wno-unknown-warning-option", {force=true})
- add_cxxflags("-Wno-cast-function-type-mismatch", {force=true})
- add_cxxflags("-Wno-delete-non-abstract-non-virtual-dtor", {force=true})
- add_cxxflags("-Wno-format", {force=true})
- add_cxxflags("-Wno-implicit-fallthrough", {force=true})
- add_cxxflags("-Wno-inconsistent-missing-override", {force=true})
- add_cxxflags("-Wno-missing-field-initializers", {force=true})
- add_cxxflags("-Wno-parentheses-equality", {force=true})
- add_cxxflags("-Wno-reorder-ctor", {force=true})
- add_cxxflags("-Wno-sign-compare", {force=true})
- add_cxxflags("-Wno-strict-aliasing", {force=true})
- add_cxxflags("-Wno-switch", {force=true})
- add_cxxflags("-Wno-unused-but-set-variable", {force=true})
- add_cxxflags("-Wno-unused-lambda-capture", {force=true})
- add_cxxflags("-Wno-unused-parameter", {force=true})
- add_cxxflags("-Wno-unused-private-field", {force=true})
- add_cxxflags("-Wno-unused-value", {force=true})
- add_cxxflags("-Wno-unused-variable", {force=true})
- add_cxxflags("-Wno-vla-cxx-extension", {force=true})
- add_cflags("-Wno-unknown-warning-option", {force=true})
- add_cflags("-Wno-unused-command-line-argument", {force=true})
-end
-
-if is_os("macosx") then
- -- silence warnings about -Wno-vla-cxx-extension since to my knowledge we can't
- -- detect the clang version used in Xcode and only recent versions contain this flag
- add_cxxflags("-Wno-unknown-warning-option")
+ add_cxxflags("-Wno-cast-function-type-mismatch", {force = true})
+ add_cxxflags("-Wno-parentheses-equality", {force = true})
+ add_cxxflags("-Wno-reorder-ctor", {force = true})
+ add_cxxflags("-Wno-unused-but-set-variable", {force = true})
+ add_cxxflags("-Wno-unused-parameter", {force = true})
+ add_cflags("-Wno-unknown-warning-option", {force = true})
+ add_cflags("-Wno-unused-command-line-argument", {force = true})
end
if is_os("linux") then