Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请增加AppleTVSimulator,iPhoneSimulator,WatchSimulator等平台的arm64架构的支持 #2185

Closed
leleliu008 opened this issue Mar 21, 2022 · 24 comments

Comments

@leleliu008
Copy link

你在什么场景下需要该功能?

目前,Apple已经全面支持了arm64架构,但是xmake只支持了x86_64,已经无法满足现实需要。

Apple M1(arm64) 第一款推出到现在已经有一年多了,已经发布了2次,很多人已经买了这种机器,使用模拟器也是很常见的,所以有必要支持。

描述可能的解决方案

方案1: 增加一个参数控制是否是模拟器平台,比如使用--simulator,这样对现有代码的改动可能比较小。
方案2: 重新实现。将os和simulator分开,这样好理解,但是重写风险太大,耗时。

描述你认为的候选方案

No response

其他信息

https://developer.apple.com/documentation/xcode-release-notes/xcode-12_2-release-notes

@waruqi
Copy link
Member

waruqi commented Mar 25, 2022

目前这两方案,都会有点问题,暂时我还没想到更好的方案。

方案1: 增加一个参数控制是否是模拟器平台,比如使用--simulator,这样对现有代码的改动可能比较小。

首先是这个参数不通用,需要对各种地方获取特殊的参数处理,要透传进包,工具链,还得单独加各种接口获取它,各种特殊处理

方案2: 重新实现。将os和simulator分开,这样好理解,但是重写风险太大,耗时。

分平台,尽管更合理,但是一个就是改动大,有些地方会 broken ,影响最大的还是 xmake-repo 仓库的所有包,

原本 on_install("iphoneos") ,就能每个包 改成 on_install("iphoneos", "iphonesimulator", "watchos", ....) 不好维护。。

@leleliu008
Copy link
Author

但是我认为要想完整支持Apple的这些东西,还是要用第二种方案。因为第一种方案,不能对simulator的min-version进行设置,现实情况很可能要对这个进行设置的。无论哪种方案都要不少改动,多做测试就是了,反正github actions是免费的,多做各种情况的测试就行了,如果API需要做调整的话,将大版本提升到V3呗。

@leleliu008
Copy link
Author

原本 on_install("iphoneos") ,就能每个包 改成 on_install("iphoneos", "iphonesimulator", "watchos", ....) 不好维护。。

这个其实还好吧,就是把"iphoneos"换成iphone, "iphonesimulator",多了几个而已,关键是这种方式与Apple的工具链保持了一致,对于新人很友好,对于看代码的人也很友好。

现在的问题其实是值不值得实现这个功能而已,有多少人用xmake做Apple开发,如果很少几个人用来做Apple开发也没必要花大力气做这个。

@leleliu008
Copy link
Author

还有一个办法是:

增加3个platform:iphone 'iwatch' appletv

iphone = iPhoneOS + iPhoneSimulator
iwatch = WatchOS + WatchSimulator
appletv + AppleTvOS + AppleTvSimulator

这3种阿情况下,关于version-min的设置使用环境变量:
IPHONEOS_DEPLOYMENT_TARGET
IPHONESIMULATOR_DEPLOYMENT_TARGET
APPLETVOS_DEPLOYMENT_TARGET

之类的

@waruqi
Copy link
Member

waruqi commented Mar 25, 2022

原本 on_install("iphoneos") ,就能每个包 改成 on_install("iphoneos", "iphonesimulator", "watchos", ....) 不好维护。。

这个其实还好吧,就是把"iphoneos"换成iphone, "iphonesimulator",多了几个而已,关键是这种方式与Apple的工具链保持了一致,对于新人很友好,对于看代码的人也很友好。

没你想的那么简单,牵扯的地方多了,光你说的这处改名,就会 broken 掉现有 xmake-repo 所有 ios 包。。

除了值不值,还得要看改动后 兼容性,维护成本,可维护性。。要综合考虑的,在还没想到可行方案前,我暂时不会动。

@waruqi
Copy link
Member

waruqi commented Mar 25, 2022

还有一个办法是:

增加3个platform:iphone 'iwatch' appletv

iphone = iPhoneOS + iPhoneSimulator iwatch = WatchOS + WatchSimulator appletv + AppleTvOS + AppleTvSimulator

这3种阿情况下,关于version-min的设置使用环境变量: IPHONEOS_DEPLOYMENT_TARGET IPHONESIMULATOR_DEPLOYMENT_TARGET APPLETVOS_DEPLOYMENT_TARGET

之类的

每新增一个平台,xmake-repo 仓库的所有包 要新增一倍的维护成本,所以内置平台我会尽量保持收敛

@waruqi
Copy link
Member

waruqi commented Mar 26, 2022

目前这边能想到的改动最小,兼容性和通用性都还可以的方案,就是增加一个通用的配置参数 -d/--device 来对每个平台的编译配置作补充,描述生成的目标程序会运行在指定的 目标设备类型。

xmake f -p iphoneos --device=simulator
xmake f -p iphoneos -d simulator

对于 iphoneos 平台,默认是 iphone,也可以显式切到 simulator
对于 watchos 平台,默认是 watchtv,也可以显式切到 simulator
对于 appletvos 平台,默认是 appletv,也可以显式切到 simulator

而对于 linux, windows, macos ,可以默认为空,暂时不需要,如有需要,后期可以扩展,比如 surface, pad, ...,如果编译配置依赖特定设备的话。

对于自定义工具链和交叉编译,用于可以自定义运行的嵌入式设备类型。。

对于包管理和包配置,基本不用做改动,还是 iphoneos 等现有平台处理,需要区分 simulator,可以用 package:is_device("simulator") 接口

对于 target,也会提供 target:is_device() 接口。

对于描述域,可以用 is_device 接口判断。

@leleliu008 @xq114 可以评估下,如果觉得这样 ok,我就开始弄了,目前我没想到更好的方案,如果你们有更好的方案,也可以提过来。

@xq114
Copy link
Contributor

xq114 commented Mar 26, 2022

用toolchain区分怎么样?xmake f -p iphoneos --toolchain=iphonesimulator/watchsimulator ... 默认还是iphone

@waruqi
Copy link
Member

waruqi commented Mar 26, 2022

用toolchain区分怎么样?xmake f -p iphoneos --toolchain=iphonesimulator/watchsimulator ... 默认还是iphone

我之前有想过,工具链不太好弄,目前 iphoneos/watchtv/appletv 几个平台,其实都是共用一个 xcode 工具链,99%都是相同的工具链逻辑,没必要拆这么细,而且一个是工具链,iphonesimulator 这种只是目标代码运行的 设备环境差异,并不算工具链差异,概念抽象上,也不对。

另外,尽管现在是 --toolchain=,但其实工具链都会支持 toolchains list,一个编译目标,同时使用多个工具链也是可能的,是一对多的关系。

如果用户使用 set_toolchains 绑定的工具链到 target,原本只需要 set_toolchains("xcode") ,现在却要拆分成 4个,而且没其他参数控制

@xq114
Copy link
Contributor

xq114 commented Mar 26, 2022

用额外参数也行,但感觉这个device参数不太通用,毕竟其他平台上没有这个概念,加缩写-d就更没必要了。我觉得参数名就叫iosdevice=simulator/iostarget=simulator就好了,同时提供一个显式设置xcode sdk目录的接口,如果没有设置iosdevice那就自动从sdk目录取,这样显式设置sdk目录为simulator的目录也能起到设置iosdevice的作用

@xq114
Copy link
Contributor

xq114 commented Mar 26, 2022

用额外参数也行,但感觉这个device参数不太通用,毕竟其他平台上没有这个概念,加缩写-d就更没必要了。我觉得参数名就叫iosdevice=simulator/iostarget=simulator就好了,同时提供一个显式设置xcode sdk目录的接口,如果没有设置iosdevice那就自动从sdk目录取,这样显式设置sdk目录为simulator的目录也能起到设置iosdevice的作用

其他平台上也会有这样的sdk variant,但都用一个device不合适。例如windows上有uwp/win32的区别,uwp用不同的sdk,但他们的device是一样的。还不如对每个sdk区别单独加参数,类似android ndk那样

@waruqi
Copy link
Member

waruqi commented Mar 26, 2022

用额外参数也行,但感觉这个device参数不太通用,毕竟其他平台上没有这个概念,加缩写-d就更没必要了。我觉得参数名就叫iosdevice=simulator/iostarget=simulator就好了,同时提供一个显式设置xcode sdk目录的接口,如果没有设置iosdevice那就自动从sdk目录取,这样显式设置sdk目录为simulator的目录也能起到设置iosdevice的作用

现在的问题是,必须要通过一个通用的参数来控制,因为要给 package:is_xxx target:is_xxx 都要暴露这个通用接口,在各种地方判断使用的。。。单纯只是给 ios 加参数,就没法在 package/target 中开放接口来判断它了。。

@waruqi
Copy link
Member

waruqi commented Mar 26, 2022

用额外参数也行,但感觉这个device参数不太通用,毕竟其他平台上没有这个概念,加缩写-d就更没必要了。我觉得参数名就叫iosdevice=simulator/iostarget=simulator就好了,同时提供一个显式设置xcode sdk目录的接口,如果没有设置iosdevice那就自动从sdk目录取,这样显式设置sdk目录为simulator的目录也能起到设置iosdevice的作用

其他平台上也会有这样的sdk variant,但都用一个device不合适。例如windows上有uwp/win32的区别,uwp用不同的sdk,但他们的device是一样的。还不如对每个sdk区别单独加参数,类似android ndk那样

所以目前来讲,不是所有平台都需要,不需要的,单纯忽略这个参数就行了。。只有需要的 才去判断它。。当然,如果有更好的命名,也可以提出来

我原本是想考虑用 --target 参数的,不过这跟 target 又有点混淆了

@waruqi
Copy link
Member

waruqi commented Mar 26, 2022

做成 ios 特有参数也可以,暂定 --iosdevice=simulator|iphone|watchtv|appletv 好了,不过得内部稍微改下,得用 package:toolchain("xcode"):config("iosdevice") == "simulator" 来判断

@leleliu008
Copy link
Author

做成 ios 特有参数也可以,暂定 --iosdevice=simulator|iphone|watchtv|appletv 好了,不过得内部稍微改下,得用 package:toolchain("xcode"):config("iosdevice") == "simulator" 来判断

不对吧,如果用户这么传入参数 --plat=iphoneos --iosdevice=watchtv,这是个啥意思呢?既然是特定于xcode的参数,用--simulator是不是更好?

另外,ios这个术语是对原来iPhoneOS增加了iPad后合并的称谓,并不包含watch和tv

@xq114
Copy link
Contributor

xq114 commented Mar 26, 2022

我觉得做成toolchain的config是比较合适的,当然命名上可能还有待商榷。cmake的搞法是ios simulator用不同的toolchain,而uwp直接复用了交叉编译的CMAKE_SYSTEM_NAME。xmake这里复用cross的target_os参数似乎也行,但逻辑上我感觉不如toolchain config直观合理。uwp可以用package:toolchain("msvc"):config("app_platform")这样的来判断

@xq114
Copy link
Contributor

xq114 commented Mar 26, 2022

做成 ios 特有参数也可以,暂定 --iosdevice=simulator|iphone|watchtv|appletv 好了,不过得内部稍微改下,得用 package:toolchain("xcode"):config("iosdevice") == "simulator" 来判断

iphonesimulator/watchsimulator/appletvsimulator都是不同的sdk,要区分的,ios不行可以改--appledevice=iphonesimulator/watchsimulator/appletvsimulator/simulator/iphone/watch/appletv

@waruqi
Copy link
Member

waruqi commented Mar 26, 2022

做成 ios 特有参数也可以,暂定 --iosdevice=simulator|iphone|watchtv|appletv 好了,不过得内部稍微改下,得用 package:toolchain("xcode"):config("iosdevice") == "simulator" 来判断

不对吧,如果用户这么传入参数 --plat=iphoneos --iosdevice=watchtv,这是个啥意思呢?既然是特定于xcode的参数,用--simulator是不是更好?

另外,ios这个术语是对原来iPhoneOS增加了iPad后合并的称谓,并不包含watch和tv

只需要 -p iphoneos --iosdevice=simulator 就行了,iphone, watchtv 那些值只是暂定保留的,目前即使完全没有也没关系,默认就是

-p iphoneos
-p watchtvos

表示真机,只是说,如果用户非要设置值进来,那就等价于

-p iphoneos --iosdevice=iphone
-p watchtvos --iosdevice=watchtv

当然,通常完全可以不用去写明

@leleliu008
Copy link
Author

-p iphoneos --simulator
-p appletvos --simulator
-p watchos --simulator

这样不是更简洁明了?

@waruqi
Copy link
Member

waruqi commented Mar 26, 2022

做成 ios 特有参数也可以,暂定 --iosdevice=simulator|iphone|watchtv|appletv 好了,不过得内部稍微改下,得用 package:toolchain("xcode"):config("iosdevice") == "simulator" 来判断

iphonesimulator/watchsimulator/appletvsimulator都是不同的sdk,要区分的,ios不行可以改--appledevice=iphonesimulator/watchsimulator/appletvsimulator/simulator/iphone/watch/appletv

--appledevice 也可以,更加通用些

@waruqi
Copy link
Member

waruqi commented Mar 26, 2022

-p iphoneos --simulator
-p appletvos --simulator
-p watchos --simulator

这样不是更简洁明了?

不行,--simulator 没有标明是 apple 特有的工具链,影响面太广,用户看了 --help ,也不知道这个参数是给 apple 用的,还是给哪些工具链的

而且 --simulator 是 keyonly 参数,不方便扩展,后面又遇到其他需要特殊设备区分的,还得再加其他参数。。

@waruqi
Copy link
Member

waruqi commented Mar 26, 2022

初步支持了 #2204

参数暂定 --appledev=simulator ,简化了下。

默认真机

$ xmake f -p iphoneos
$ xmake f -p watchos
$ xmake f -p appletvos

模拟器

$ xmake f -p iphoneos --appledev=simulator
$ xmake f -p watchos --appledev=simulator
$ xmake f -p appletvos --appledev=simulator

并且兼容对之前的处理都做了兼容。

package/target 里面可以通过 package:toolchain("xcode"):config("appledev")target:toolchain("xcode"):config("appledev") 来判断

@waruqi waruqi added this to the v2.6.5 milestone Mar 26, 2022
@waruqi
Copy link
Member

waruqi commented Mar 26, 2022

我合进 dev 了,可以试下,xmake update -s dev

@leleliu008
Copy link
Author

我测试了iPhoneOSiPhoneSimulator,可以正常编译了

@waruqi waruqi closed this as completed Mar 27, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants