From 432e9cc7745628d3b8bffa6c927ad4f23443249b Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 20 Aug 2022 10:18:43 +0800 Subject: add catalyst for iphoneos --- xmake/modules/detect/sdks/find_xcode.lua | 26 +++++++++++++++++++++++-- xmake/platforms/iphoneos/xmake.lua | 2 +- xmake/toolchains/xcode/check.lua | 33 ++++++++++++++------------------ xmake/toolchains/xcode/load_iphoneos.lua | 14 ++++++++++---- 4 files changed, 49 insertions(+), 26 deletions(-) diff --git a/xmake/modules/detect/sdks/find_xcode.lua b/xmake/modules/detect/sdks/find_xcode.lua index e3c927979..ed4412420 100644 --- a/xmake/modules/detect/sdks/find_xcode.lua +++ b/xmake/modules/detect/sdks/find_xcode.lua @@ -41,7 +41,7 @@ function _find_xcode_sdkver(sdkdir, opt) local plat = opt.plat local arch = opt.arch local platsdkdir = nil - if plat == "iphoneos" then + if plat == "iphoneos" and opt.appledev ~= "catalyst" then if arch == "i386" or arch == "x86_64" then platsdkdir = "Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator*.*.sdk" else @@ -72,6 +72,25 @@ function _find_xcode_sdkver(sdkdir, opt) end end +-- find the target minver +function _find_target_minver(sdkdir, sdkver, opt) + opt = opt or {} + local target_minver = sdkver + if opt.plat == "macosx" and opt.appledev ~= "catalyst" then + local macos_ver = macos.version() + if macos_ver then + target_minver = macos_ver:major() .. "." .. macos_ver:minor() + end + elseif opt.plat == "iphoneos" and opt.appledev == "catalyst" then + local platsdkdir = "Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS*.*.sdk" + local dir = find_directory(platsdkdir, sdkdir) + if dir then + target_minver = dir:match("%d+%.%d+") + end + end + return target_minver +end + -- find the xcode toolchain function _find_xcode(sdkdir, opt) @@ -87,6 +106,9 @@ function _find_xcode(sdkdir, opt) return {} end + -- find the target minver + local target_minver = _find_target_minver(sdkdir, sdkver, opt) + -- find codesign local codesign_identity, mobile_provision if opt.find_codesign then @@ -126,7 +148,7 @@ function _find_xcode(sdkdir, opt) end end end - return {sdkdir = sdkdir, sdkver = sdkver, codesign_identity = codesign_identity, mobile_provision = mobile_provision} + return {sdkdir = sdkdir, sdkver = sdkver, target_minver = target_minver, codesign_identity = codesign_identity, mobile_provision = mobile_provision} end -- find xcode toolchain diff --git a/xmake/platforms/iphoneos/xmake.lua b/xmake/platforms/iphoneos/xmake.lua index 057a2704b..9e592c1f0 100644 --- a/xmake/platforms/iphoneos/xmake.lua +++ b/xmake/platforms/iphoneos/xmake.lua @@ -46,7 +46,7 @@ platform("iphoneos") , {nil, "xcode_mobile_provision", "kv", "auto", "The Mobile Provision for Xcode" } , {nil, "target_minver", "kv", "auto", "The Target Minimal Version" } , {nil, "appledev", "kv", nil, "The Apple Device Type", - values = {"simulator", "iphone", "watchtv", "appletv"}} + values = {"simulator", "iphone", "watchtv", "appletv", "catalyst"}} } , global = diff --git a/xmake/toolchains/xcode/check.lua b/xmake/toolchains/xcode/check.lua index 927eadceb..31949eaec 100644 --- a/xmake/toolchains/xcode/check.lua +++ b/xmake/toolchains/xcode/check.lua @@ -26,11 +26,23 @@ import("detect.sdks.find_xcode") -- main entry function main(toolchain) + -- get apple device + local simulator + local appledev = toolchain:config("appledev") or config.get("appledev") + if appledev and appledev == "simulator" then + simulator = true + appledev = "simulator" + elseif not toolchain:is_plat("macosx") and toolchain:is_arch("i386", "x86_64") then + simulator = true + appledev = "simulator" + end + -- find xcode local xcode_sdkver = toolchain:config("xcode_sdkver") or config.get("xcode_sdkver") local xcode = find_xcode(config.get("xcode"), {force = true, verbose = true, find_codesign = toolchain:is_global(), sdkver = xcode_sdkver, + appledev = appledev, plat = toolchain:plat(), arch = toolchain:arch()}) if not xcode then @@ -59,21 +71,10 @@ function main(toolchain) end end - -- get apple device - local simulator - local appledev = toolchain:config("appledev") or config.get("appledev") - if appledev and appledev == "simulator" then - simulator = true - appledev = "simulator" - elseif not toolchain:is_plat("macosx") and toolchain:is_arch("i386", "x86_64") then - simulator = true - appledev = "simulator" - end - -- save xcode sysroot directory local xcode_sysroot if xcode.sdkdir and xcode_sdkver then - if toolchain:is_plat("macosx") then + if toolchain:is_plat("macosx") or appledev == "catalyst" then xcode_sysroot = xcode.sdkdir .. "/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX" .. xcode_sdkver .. ".sdk" elseif toolchain:is_plat("iphoneos") then local platname = simulator and "iPhoneSimulator" or "iPhoneOS" @@ -102,13 +103,7 @@ function main(toolchain) -- local target_minver = toolchain:config("target_minver") or config.get("target_minver") if xcode_sdkver and not target_minver then - target_minver = xcode_sdkver - if toolchain:is_plat("macosx") then - local macos_ver = macos.version() - if macos_ver then - target_minver = macos_ver:major() .. "." .. macos_ver:minor() - end - end + target_minver = xcode.target_minver end toolchain:config_set("xcode", xcode.sdkdir) toolchain:config_set("xcode_sdkver", xcode_sdkver) diff --git a/xmake/toolchains/xcode/load_iphoneos.lua b/xmake/toolchains/xcode/load_iphoneos.lua index 77a581b0c..d64172ed2 100644 --- a/xmake/toolchains/xcode/load_iphoneos.lua +++ b/xmake/toolchains/xcode/load_iphoneos.lua @@ -29,15 +29,21 @@ function main(toolchain) local xcode_sdkver = toolchain:config("xcode_sdkver") local xcode_sysroot = toolchain:config("xcode_sysroot") - -- is simulator? - local simulator = toolchain:config("appledev") == "simulator" - -- init target minimal version + local appledev = toolchain:config("appledev") local target_minver = toolchain:config("target_minver") if target_minver and tonumber(target_minver) > 10 and (arch == "armv7" or arch == "armv7s" or arch == "i386") then target_minver = "10" -- iOS 10 is the maximum deployment target for 32-bit targets end - local target_minver_flags = (simulator and "-mios-simulator-version-min=" or "-miphoneos-version-min=") .. target_minver + if target_minver and tonumber(target_minver) < 13 and appledev == "catalyst" then + target_minver = "13.1" + end + local target_minver_flags + if appledev == "simulator" then + target_minver_flags = "-mios-simulator-version-min=" .. target_minver + else + target_minver_flags = "-miphoneos-version-min=" .. target_minver + end -- init flags for c/c++ toolchain:add("cxflags", "-arch", arch, target_minver_flags, "-isysroot", xcode_sysroot) -- cgit v1.3.1 From 82c2ee867dc33097800caa4d25ab44aa1696517b Mon Sep 17 00:00:00 2001 From: ruki Date: Sat, 20 Aug 2022 20:58:52 +0800 Subject: use catalyst for macosx --- xmake/modules/detect/sdks/find_xcode.lua | 26 +++++++++-------- xmake/toolchains/xcode/check.lua | 2 +- xmake/toolchains/xcode/load_iphoneos.lua | 14 +++------- xmake/toolchains/xcode/load_macosx.lua | 48 +++++++++++++++----------------- 4 files changed, 43 insertions(+), 47 deletions(-) diff --git a/xmake/modules/detect/sdks/find_xcode.lua b/xmake/modules/detect/sdks/find_xcode.lua index ed4412420..80f3daead 100644 --- a/xmake/modules/detect/sdks/find_xcode.lua +++ b/xmake/modules/detect/sdks/find_xcode.lua @@ -41,7 +41,7 @@ function _find_xcode_sdkver(sdkdir, opt) local plat = opt.plat local arch = opt.arch local platsdkdir = nil - if plat == "iphoneos" and opt.appledev ~= "catalyst" then + if plat == "iphoneos" then if arch == "i386" or arch == "x86_64" then platsdkdir = "Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator*.*.sdk" else @@ -76,16 +76,20 @@ end function _find_target_minver(sdkdir, sdkver, opt) opt = opt or {} local target_minver = sdkver - if opt.plat == "macosx" and opt.appledev ~= "catalyst" then - local macos_ver = macos.version() - if macos_ver then - target_minver = macos_ver:major() .. "." .. macos_ver:minor() - end - elseif opt.plat == "iphoneos" and opt.appledev == "catalyst" then - local platsdkdir = "Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS*.*.sdk" - local dir = find_directory(platsdkdir, sdkdir) - if dir then - target_minver = dir:match("%d+%.%d+") + if opt.plat == "macosx" then + if opt.appledev == "catalyst" then + local platsdkdir = "Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS*.*.sdk" + local dir = find_directory(platsdkdir, sdkdir) + if dir then + target_minver = dir:match("%d+%.%d+") + else + target_minver = "13.1" + end + else + local macos_ver = macos.version() + if macos_ver then + target_minver = macos_ver:major() .. "." .. macos_ver:minor() + end end end return target_minver diff --git a/xmake/toolchains/xcode/check.lua b/xmake/toolchains/xcode/check.lua index 31949eaec..30886e584 100644 --- a/xmake/toolchains/xcode/check.lua +++ b/xmake/toolchains/xcode/check.lua @@ -74,7 +74,7 @@ function main(toolchain) -- save xcode sysroot directory local xcode_sysroot if xcode.sdkdir and xcode_sdkver then - if toolchain:is_plat("macosx") or appledev == "catalyst" then + if toolchain:is_plat("macosx") then xcode_sysroot = xcode.sdkdir .. "/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX" .. xcode_sdkver .. ".sdk" elseif toolchain:is_plat("iphoneos") then local platname = simulator and "iPhoneSimulator" or "iPhoneOS" diff --git a/xmake/toolchains/xcode/load_iphoneos.lua b/xmake/toolchains/xcode/load_iphoneos.lua index d64172ed2..77a581b0c 100644 --- a/xmake/toolchains/xcode/load_iphoneos.lua +++ b/xmake/toolchains/xcode/load_iphoneos.lua @@ -29,21 +29,15 @@ function main(toolchain) local xcode_sdkver = toolchain:config("xcode_sdkver") local xcode_sysroot = toolchain:config("xcode_sysroot") + -- is simulator? + local simulator = toolchain:config("appledev") == "simulator" + -- init target minimal version - local appledev = toolchain:config("appledev") local target_minver = toolchain:config("target_minver") if target_minver and tonumber(target_minver) > 10 and (arch == "armv7" or arch == "armv7s" or arch == "i386") then target_minver = "10" -- iOS 10 is the maximum deployment target for 32-bit targets end - if target_minver and tonumber(target_minver) < 13 and appledev == "catalyst" then - target_minver = "13.1" - end - local target_minver_flags - if appledev == "simulator" then - target_minver_flags = "-mios-simulator-version-min=" .. target_minver - else - target_minver_flags = "-miphoneos-version-min=" .. target_minver - end + local target_minver_flags = (simulator and "-mios-simulator-version-min=" or "-miphoneos-version-min=") .. target_minver -- init flags for c/c++ toolchain:add("cxflags", "-arch", arch, target_minver_flags, "-isysroot", xcode_sysroot) diff --git a/xmake/toolchains/xcode/load_macosx.lua b/xmake/toolchains/xcode/load_macosx.lua index d5e3d3b9a..107e5a9da 100644 --- a/xmake/toolchains/xcode/load_macosx.lua +++ b/xmake/toolchains/xcode/load_macosx.lua @@ -29,43 +29,41 @@ function main(toolchain) local target_minver = toolchain:config("target_minver") local xcode_sysroot = toolchain:config("xcode_sysroot") - -- init flags for c/c++ - toolchain:add("cxflags", "-arch", arch) - toolchain:add("ldflags", "-arch", arch) - toolchain:add("shflags", "-arch", arch) + -- init target flags + local appledev = toolchain:config("appledev") if target_minver then - toolchain:add("cxflags", "-mmacosx-version-min=" .. target_minver) - toolchain:add("mxflags", "-mmacosx-version-min=" .. target_minver) - toolchain:add("ldflags", "-mmacosx-version-min=" .. target_minver) - toolchain:add("shflags", "-mmacosx-version-min=" .. target_minver) + local target = ("%s-apple-macos%s"):format(arch, target_minver) + if appledev == "catalyst" then + target = ("%s-apple-ios%s-macabi"):format(arch, target_minver) + end + toolchain:add("cxflags", "-target", target) + toolchain:add("mxflags", "-target", target) + toolchain:add("asflags", "-target", target) + toolchain:add("ldflags", "-target", target) + toolchain:add("shflags", "-target", target) + toolchain:add("scflags", "-target", target) + toolchain:add("scldflags", "-target", target) + toolchain:add("scshflags", "-target", target) end + + -- add sysroot flags if xcode_sysroot then toolchain:add("cxflags", "-isysroot", xcode_sysroot) + toolchain:add("asflags", "-isysroot", xcode_sysroot) toolchain:add("ldflags", "-isysroot", xcode_sysroot) toolchain:add("shflags", "-isysroot", xcode_sysroot) + toolchain:add("mxflags", "-isysroot", xcode_sysroot) + toolchain:add("scflags", "-sdk " .. xcode_sysroot) + toolchain:add("scshflags", "-sdk " .. xcode_sysroot) + toolchain:add("scldflags", "-sdk " .. xcode_sysroot) end + + -- init flags for c/c++ toolchain:add("ldflags", "-stdlib=libc++") toolchain:add("shflags", "-stdlib=libc++") toolchain:add("syslinks", "z") -- init flags for objc/c++ (with ldflags and shflags) - toolchain:add("mxflags", "-arch", arch) - if xcode_sysroot then - toolchain:add("mxflags", "-isysroot", xcode_sysroot) - end -- we can use `add_mxflags("-fno-objc-arc")` to override it in xmake.lua toolchain:add("mxflags", "-fobjc-arc") - - -- init flags for asm - toolchain:add("asflags", "-arch", arch) - if xcode_sysroot then - toolchain:add("asflags", "-isysroot", xcode_sysroot) - end - - -- init flags for swift - if target_minver and xcode_sysroot then - toolchain:add("scflags", format("-target %s-apple-macosx%s", arch, target_minver) , "-sdk " .. xcode_sysroot) - toolchain:add("scshflags", format("-target %s-apple-macosx%s", arch, target_minver) , "-sdk " .. xcode_sysroot) - toolchain:add("scldflags", format("-target %s-apple-macosx%s", arch, target_minver) , "-sdk " .. xcode_sysroot) - end end -- cgit v1.3.1