diff options
| author | ruki <[email protected]> | 2025-05-21 21:12:41 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-05-21 21:12:41 +0800 |
| commit | d1d99cdda06f6d779fb249d547f7fe09aca06ba4 (patch) | |
| tree | 9dcc14cf438f39c3013c37ffb15f940554fb240a | |
| parent | a0db85a02c45598fd64b9811407a023b68e8b055 (diff) | |
improve llvm for macos
| -rw-r--r-- | xmake/toolchains/llvm/check.lua | 14 | ||||
| -rw-r--r-- | xmake/toolchains/llvm/xmake.lua | 98 |
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 |
