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

请求添加 mac catalyst 的支持 #2679

Closed
CaffreySun opened this issue Aug 16, 2022 · 11 comments
Closed

请求添加 mac catalyst 的支持 #2679

CaffreySun opened this issue Aug 16, 2022 · 11 comments

Comments

@CaffreySun
Copy link

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

我有个动态库 framework 需要适配 mac catalyst。
mac catalyst的介绍:https://developer.apple.com/cn/mac-catalyst

我现在使用 option 实现了 mac catalyst 库的编译

set_languages("c++14")
add_rules("mode.debug", "mode.release")

option("mac_catalyst")
    set_default(false)
    set_showmenu(true)
    set_description("是否编译 mac catalyst")
    add_cxxflags("-target x86_64-apple-ios13.1-macabi")
    add_shflags("-target x86_64-apple-ios13.1-macabi")
option_end()

target("MyLibrary")
    add_options("mac_catalyst")
    add_rules("xcode.framework")
    set_kind("shared")
    add_files("src/*.cpp")
    add_files("src/Info.plist")

然后

xmake f -p macosx -a arm64 -m release --mac_catalyst=y
xmake

但是这样有问题:

  1. 用编译出的framework不能使用,使用时会报错Library not loaded: @rpath/MyLibrary
  2. 想要修改option中的x86_64-apple-ios13.1-macabi中的ios13.1版本就比较麻烦。
  3. ios13.1其实是iphoneos的版本号,而在macosx平台下只能设置mac的sdk版本号。

描述可能的解决方案

一、在 macosx 平台下修改

在 xmake config 中增加 mac catalyst 配置项,
然后根据配置把load_macosx.lua文件中的
format("-target %s-apple-macosx%s", arch, target_minver)
改为
format("-target %s-apple-ios%s", arch, target_minver)
但这里有一个麻烦点,现在target_minver是macos的版本,需要改为对应的ios版本,
并且 mac catalyst 最低支持ios13.1。
还有就是Library not loaded: @rpath/MyLibrary报错不知道该怎么处理。

二、在 iphoneos 平台下修改

在 xmake config 中增加 mac catalyst 配置项,
然后在find_xcode.lua中判断如果plat == "iphoneos"并且是 mac catalyst时,
platsdkdir改为macos的sdk路径:
platsdkdir = "Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX*.*.sdk"
但是有一个注意点,在load_iphoneos.lua中设置format("-target %s-apple-ios%s", arch, target_minver)时,target_minver最低支持13.1

描述你认为的候选方案

No response

其他信息

No response

@waruqi waruqi added this to the v2.7.1 milestone Aug 20, 2022
@waruqi
Copy link
Member

waruqi commented Aug 20, 2022

试下这个 patch #2695

xmake update -s github:xmake-io/xmake#catalyst

@waruqi
Copy link
Member

waruqi commented Aug 20, 2022

还是有点问题,编译器要用 xcrun -sdk iphoneos clang 还是 xcrun -sdk macosx clang?

xmake f -p iphoneos -a x86_64 --appledev=catalyst

@CaffreySun
Copy link
Author

sdk 使用 macosx

@waruqi
Copy link
Member

waruqi commented Aug 20, 2022

好了,再试试

xmake update -s dev
xmake f --appledev=catalyst -c
xmake

@CaffreySun
Copy link
Author

现在可以编译,但是使用编译出的Framework时会报错
dyld[15247]: Library not loaded: @rpath/RbtBezier
Referenced from: /Users/xxxxx/Library/Developer/Xcode/DerivedData/Demo-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/Demo.app/Contents/MacOS/Demo
Reason: tried: '/Users/xxxxx/Library/Developer/Xcode/DerivedData/Demo-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/RbtBezier' (no such file), '/usr/lib/system/introspection/RbtBezier' (no such file), '/Users/xxxxx/Library/Developer/Xcode/DerivedData/Demo-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/Demo.app/Contents/MacOS/../Frameworks/RbtBezier' (no such file), '/Users/xxxxx/Library/Developer/Xcode/DerivedData/Demo-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/Demo.app/Contents/MacOS/Frameworks/RbtBezier' (no such file), '/Users/xxxxx/Library/Developer/Xcode/DerivedData/Demo-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/Demo.app/Contents/MacOS/../Frameworks/RbtBezier' (no such file), '/Users/xxxxx/Library/Developer/Xcode/DerivedData/Demo-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/Demo.app/Contents/MacOS/Frameworks/RbtBezier' (no such file), '/usr/lib/RbtBezier' (no such file)

在使用xmake -v 编译时,看到输出 -install_name @rpath/RbtBezie,我用xcode工程编译的时候能看到输出-install_name @rpath/RbtBezierLib.framework/Versions/A/RbtBezier,是不是这个区别导致了Library not loaded: @rpath/RbtBezier 报错。

@waruqi
Copy link
Member

waruqi commented Aug 22, 2022

不清楚,不过我刚修了点其他的问题,storyboard 编译,和 UIKit 的支持等等。。

https://github.com/xmake-io/xmake/tree/master/tests/projects/objc/iosapp_with_framework

我用这个带 framework 的例子测试,是可以正常编译和加载 framework的。。

$ xmake update -s dev
$ cd iosapp_with_framework
$ xmake f --appledev=catalyst -c
$ xmake
$ xmake run
2022-08-22 10:29:37.074 demo[78404:5225667] add(1, 2): 3
2022-08-22 10:29:37.074 demo[78404:5225667] hello xmake!

@CaffreySun
Copy link
Author

我把iosapp_with_framework编译出来的test.framework放到一个新建的xcode工程里,就会报错:
dyld[34419]: Library not loaded: @rpath/test
Referenced from: /Users/xxxx/Library/Developer/Xcode/DerivedData/tttttt-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/tttttt.app/Contents/MacOS/tttttt
Reason: tried: '/Users/xxxx/Library/Developer/Xcode/DerivedData/tttttt-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/test' (no such file), '/usr/lib/system/introspection/test' (no such file), '/Users/xxxx/Library/Developer/Xcode/DerivedData/tttttt-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/tttttt.app/Contents/MacOS/../Frameworks/test' (no such file), '/Users/xxxx/Library/Developer/Xcode/DerivedData/tttttt-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/tttttt.app/Contents/MacOS/Frameworks/test' (no such file), '/Users/xxxx/Library/Developer/Xcode/DerivedData/tttttt-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/tttttt.app/Contents/MacOS/../Frameworks/test' (no such file), '/Users/xxxx/Library/Developer/Xcode/DerivedData/tttttt-cjvicqnencowhaafwrwedaypfvgm/Build/Products/Debug-maccatalyst/tttttt.app/Contents/MacOS/Frameworks/test' (no such file), '/usr/lib/test' (no such file)

iosapp_with_framework 使用 xmake f --appledev=catalyst -c 编译出来的demo.app的目录结构和xcode不太一样
xcode编译出来的app目录结构:

  • Demo.app
    • Contents
      • MacOS
        • demo
      • Frameworks
        • test.framework

xmake编译出来的app目录

  • Demo.app
    • Contents
      • MacOS
        • demo
        • test

所以xmake run可以运行起来,因为test和demo在一个目录下,@rpath/test 能找到test

@waruqi
Copy link
Member

waruqi commented Aug 22, 2022

依赖的 frameworks copy 到 .app 一直还没搞,TODO 状态,之前只是临时性 copy 了 dylib 过去

-- copy dependent dynamic libraries, TODO copy frameworks
for _, dep in ipairs(target:orderdeps()) do
if dep:kind() == "shared" then
os.vcp(dep:targetfile(), binarydir)
end
end

@CaffreySun
Copy link
Author

依赖的 frameworks copy 到 .app 一直还没搞,TODO 状态,之前只是临时性 copy 了 dylib 过去

-- copy dependent dynamic libraries, TODO copy frameworks
for _, dep in ipairs(target:orderdeps()) do
if dep:kind() == "shared" then
os.vcp(dep:targetfile(), binarydir)
end
end

好的,辛苦了大佬

@waruqi
Copy link
Member

waruqi commented Aug 23, 2022

可以了,你再更新到 dev 试试

@CaffreySun
Copy link
Author

可以了,你再更新到 dev 试试

👍确实可以了,大佬辛苦了

@waruqi waruqi closed this as completed Aug 23, 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

2 participants