summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-05-21 21:12:41 +0800
committerruki <[email protected]>2025-05-21 21:12:41 +0800
commitd1d99cdda06f6d779fb249d547f7fe09aca06ba4 (patch)
tree9dcc14cf438f39c3013c37ffb15f940554fb240a
parenta0db85a02c45598fd64b9811407a023b68e8b055 (diff)
improve llvm for macos
-rw-r--r--xmake/toolchains/llvm/check.lua14
-rw-r--r--xmake/toolchains/llvm/xmake.lua98
2 files changed, 71 insertions, 41 deletions
diff --git a/xmake/toolchains/llvm/check.lua b/xmake/toolchains/llvm/check.lua
index 69ad691e8..933146fbf 100644
--- a/xmake/toolchains/llvm/check.lua
+++ b/xmake/toolchains/llvm/check.lua
@@ -28,6 +28,14 @@ import("detect.sdks.find_cross_toolchain")
-- find xcode on macos
function _find_xcode(toolchain)
+ -- get apple device
+ local appledev = toolchain:config("appledev") or config.get("appledev")
+ if appledev and appledev == "simulator" then
+ appledev = "simulator"
+ elseif not toolchain:is_plat("macosx") and toolchain:is_arch("i386", "x86_64") then
+ appledev = "simulator"
+ end
+
-- find xcode
local xcode_sdkver = toolchain:config("xcode_sdkver") or config.get("xcode_sdkver")
local xcode = find_xcode(toolchain:config("xcode") or config.get("xcode"), {force = true, verbose = true,
@@ -46,8 +54,14 @@ function _find_xcode(toolchain)
config.set("xcode", xcode.sdkdir, {force = true, readonly = true})
cprint("checking for Xcode directory ... ${color.success}%s", xcode.sdkdir)
end
+ local target_minver = toolchain:config("target_minver") or config.get("target_minver")
+ if xcode_sdkver and not target_minver then
+ target_minver = xcode.target_minver
+ end
toolchain:config_set("xcode", xcode.sdkdir)
toolchain:config_set("xcode_sdkver", xcode_sdkver)
+ toolchain:config_set("target_minver", target_minver)
+ toolchain:config_set("appledev", appledev)
toolchain:configs_save()
cprint("checking for SDK version of Xcode for %s (%s) ... ${color.success}%s", toolchain:plat(), toolchain:arch(), xcode_sdkver)
end
diff --git a/xmake/toolchains/llvm/xmake.lua b/xmake/toolchains/llvm/xmake.lua
index 2960858be..dbc79e244 100644
--- a/xmake/toolchains/llvm/xmake.lua
+++ b/xmake/toolchains/llvm/xmake.lua
@@ -48,23 +48,74 @@ toolchain("llvm")
toolchain:add("runtimes", "MT", "MTd", "MD", "MDd")
end
- -- add march flags
- local march
+ -- add target flags
+ local target
if toolchain:is_plat("windows") and not is_host("windows") then
- -- cross-compilation for windows
if toolchain:is_arch("i386", "x86") then
- march = "-target i386-pc-windows-msvc"
+ target = "i386-pc-windows-msvc"
else
- march = "-target x86_64-pc-windows-msvc"
+ target = "x86_64-pc-windows-msvc"
end
+ elseif toolchain:is_plat("macosx") then
+ local arch = toolchain:arch()
+ local target_minver = toolchain:config("target_minver")
+ local appledev = toolchain:config("appledev")
+ if target_minver then
+ target = ("%s-apple-macos%s"):format(arch, target_minver)
+ if appledev == "catalyst" then
+ target = ("%s-apple-ios%s-macabi"):format(arch, target_minver)
+ end
+ end
+ elseif toolchain:is_plat("cross") then
+ local cross = toolchain:cross():gsub("(.*)%-$", "%1")
+ target = "--target=" .. cross
+ end
+ local target_flags
+ if target then
+ target_flags = "--target=" .. target
+ elseif toolchain:is_arch("x86_64", "x64") then
+ target_flags = "-m64"
+ elseif toolchain:is_arch("i386", "x86") then
+ target_flags = "-m32"
+ end
+ if target_flags then
+ toolchain:add("cxflags", target_flags)
+ toolchain:add("mxflags", target_flags)
+ toolchain:add("asflags", target_flags)
+ toolchain:add("ldflags", target_flags)
+ toolchain:add("shflags", target_flags)
+ end
+
+ -- init flags for platform
+ if toolchain:is_plat("windows") and not is_host("windows") then
toolchain:add("ldflags", "-fuse-ld=lld")
toolchain:add("shflags", "-fuse-ld=lld")
+ elseif toolchain:is_plat("macosx") then
+ local xcode_dir = get_config("xcode")
+ local xcode_sdkver = toolchain:config("xcode_sdkver")
+ local xcode_sdkdir = nil
+ if xcode_dir and xcode_sdkver then
+ xcode_sdkdir = xcode_dir .. "/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX" .. xcode_sdkver .. ".sdk"
+ toolchain:add("cxflags", {"-isysroot", xcode_sdkdir})
+ toolchain:add("mxflags", {"-isysroot", xcode_sdkdir})
+ toolchain:add("ldflags", {"-isysroot", xcode_sdkdir})
+ toolchain:add("shflags", {"-isysroot", xcode_sdkdir})
+ else
+ -- @see https://github.com/xmake-io/xmake/issues/1179
+ local macsdk = "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk"
+ if os.exists(macsdk) then
+ toolchain:add("cxflags", {"-isysroot", macsdk})
+ toolchain:add("mxflags", {"-isysroot", macsdk})
+ toolchain:add("ldflags", {"-isysroot", macsdk})
+ toolchain:add("shflags", {"-isysroot", macsdk})
+ end
+ end
+ toolchain:add("mxflags", "-fobjc-arc")
elseif toolchain:is_plat("cross") then
local sysroot
local sdkdir = toolchain:sdkdir()
local bindir = toolchain:bindir()
local cross = toolchain:cross():gsub("(.*)%-$", "%1")
- march = "--target=" .. cross
if bindir and os.isexec(path.join(bindir, cross .. "-gcc" .. (is_host("windows") and ".exe" or ""))) then
local gcc_toolchain = path.directory(bindir)
toolchain:add("cxflags", "--gcc-toolchain=" .. gcc_toolchain)
@@ -86,41 +137,6 @@ toolchain("llvm")
toolchain:add("ldflags", "--sysroot=" .. sysroot)
toolchain:add("shflags", "--sysroot=" .. sysroot)
end
- elseif toolchain:is_arch("x86_64", "x64") then
- march = "-m64"
- elseif toolchain:is_arch("i386", "x86") then
- march = "-m32"
- end
- if march then
- toolchain:add("cxflags", march)
- toolchain:add("mxflags", march)
- toolchain:add("asflags", march)
- toolchain:add("ldflags", march)
- toolchain:add("shflags", march)
- end
-
- -- init flags for macOS
- if toolchain:is_plat("macosx") then
- local xcode_dir = get_config("xcode")
- local xcode_sdkver = toolchain:config("xcode_sdkver")
- local xcode_sdkdir = nil
- if xcode_dir and xcode_sdkver then
- xcode_sdkdir = xcode_dir .. "/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX" .. xcode_sdkver .. ".sdk"
- toolchain:add("cxflags", {"-isysroot", xcode_sdkdir})
- toolchain:add("mxflags", {"-isysroot", xcode_sdkdir})
- toolchain:add("ldflags", {"-isysroot", xcode_sdkdir})
- toolchain:add("shflags", {"-isysroot", xcode_sdkdir})
- else
- -- @see https://github.com/xmake-io/xmake/issues/1179
- local macsdk = "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk"
- if os.exists(macsdk) then
- toolchain:add("cxflags", {"-isysroot", macsdk})
- toolchain:add("mxflags", {"-isysroot", macsdk})
- toolchain:add("ldflags", {"-isysroot", macsdk})
- toolchain:add("shflags", {"-isysroot", macsdk})
- end
- end
- toolchain:add("mxflags", "-fobjc-arc")
end
-- add bin search library for loading some dependent .dll files windows