Replies: 11 comments 7 replies
-
关于 cross 平台其实之前对 cross 的解释有点误解,并不是说 cross,在包构建就一定是交叉编译。你可以理解成,cross 平台时候,xmake 才会对 工具链透传所有 cc, ld, cflags 等全部工具链信息。 也就是说,你即使不是交叉编译,只是 linux 换 gcc版本,也是可以切到 cross 下,透传工具链就行了,并不强制要求一定是交叉编译工具链。 说白了,对于你这需求,唯一的区别,就是 假设每个平台都支持工具链透传一个包的制作, 对包的维护,还有 xmake 内部的处理,工作量和复杂度只增不减。 如果就 cross 支持工具链透传linux, mingw, windows 等现有已知平台的包维护,完全不用改,并且可以在 ci 上可靠验证。。 仅仅只需要加一个 xmake 内部会对 cmake/autoconf 等,将工具链的 cc/ld/cflags/ar 等全部信息透传过去。这跟你说的 CC 环境变量传入 cmake/autoconf 没有本质区别。。
这些, cross 都支持
仅仅只是包里面加个 cross 字符串而已,其他真没啥区别了,即使让 linux 和 macosx 也支持工具链切换,其实也就是个 linux 和 cross 名字的差异。。
cross 支持 cc cxx 完整透传,也支持 CC CXX 环境变量探测切换
完全不需要哈,你可以吧 linux macosx 平台的工具链切花,gcc 切到 clang 什么的,仅仅只是换个平台名字到 cross 而已。 这里只是使用 cross ,作为统一的工具链切换逻辑,而不是把工具链切换逻辑分散在不同的平台代码里面。 你可以在 linux, macosx 上,非交叉编译切 gcc-11, clang 。。不要吧 cross 理解为交叉编译,仅仅理解为:统一的工具链切换平台 xrepo install -p cross --toolchain=clang
xrepo install -p cross --toolchain=gcc-11 |
Beta Was this translation helpful? Give feedback.
-
不是,现在按照包,有两种模式
而默认工具链,ci 上会严格测试,就比如 windows,会去对 MT/MD + static/shared 各种组合编译测试,确保完全可靠,因为针对性优化过得。 也会对 mingw xcode 特殊平台工具链,内部修复解决各种对接 cmake autoconf上的坑。 而我即使让 linux/windows 等平台全加上工具链透传切换,ci 上也是没办法测试到的。。一切包的安装是否顺利,全凭用户人品,你随便换个工具链,可能就跪了。
也就是说,即使你在 cross 平台,切换各种未知工具链,可靠性和成功率也是非常高的 |
Beta Was this translation helpful? Give feedback.
-
就拿 windows 来说 仅支持 cross 切换工具链方案on_install("windows", function (package)
-- 我只需要内部对接 msvc 处理包构建,而且 vs 版本还是能切换
-- 我可以对 msvc 的各种坑,vs runtime 做特殊优化处理稳定性
import("package.tools.cmake").install(package, configs)
end)
-- cross 处理一切工具链切换问题,透传所有,稳定测试,而通常也只需要加几行配置就行了。
on_install("cross", function (package)
import("package.tools.cmake").install(package, configs)
end) 如果用的都是 cmake ,还可以简单合并下,仅仅多了个 cross 字符串,就全支持了。。 on_install("windows", "cross", function (package)
import("package.tools.cmake").install(package, configs)
end) 全部平台支持切换工具链方案我我需要根据 而其他工具链,又要去透传他们。两种处理模式混合在一起。而ci 上,又没法测试全。 on_install("windows", function (package)
import("package.tools.cmake").install(package, configs)
end) 也许还需要对不同工具链,加各种 包特定的配置 on_install("windows", function (package)
if gcc then
-- add configs
else if msvc then
-- add configs
else if clang then
-- add configs
end
import("package.tools.cmake").install(package, configs)
end) 这还只是 windows,linux, macosx 都要来一遍。。 而不是像方案一,统一放在 |
Beta Was this translation helpful? Give feedback.
-
如果这个包全平台支持,也支持工具链透传,只需要这么配置 如果这个包,切换其他工具链,原本就不支持,比如用的 makefile ,不是 autoconf/cmake,并且 makefile 内部也没获取 CC 变量,压根支持不了。。 你不限制,用户切工具链安装,报一堆编译错误,还不如直接提示不支持,省得用户趟坑。 如果这个包后续想通过 patch makefile 进行工具量切换支持了,只需要在 |
Beta Was this translation helpful? Give feedback.
-
非常感谢如此详细的解释。我日常只使用 gcc, clang 这两个编译器,对于 msvc, mingw 以及 windows 上的编译没有经验。我能想像得到支持多种编译器可能遇到很多问题,完全接受按现在的方案进行处理。 仔细想了下,描述下我的理解,烦请指出有错的地方。 简单起见,以下对 platform, toolchain 的理解描述不考虑交叉编译。 package 能否在特定 platform 上编译、能否使用特定 toolchain,这是 package 源代码以及其构建代码本身的问题。 任何一次编译构建都在一个特定的 platform 和 toolchain 的组合下进行。如果仅指定 platform,实际隐含了使用该 platform 默认的 toolchain。
问题 1: 那在 具体来说,是否可以写如下代码: on_install("cross", function (package)
if package:is_plat("windows") then
-- add configs
end
end) 问题 2: 在卸载 gcc, clang 的 Arch Linux 上观察了下 |
Beta Was this translation helpful? Give feedback.
-
目前的处理逻辑,这里面再去判断原生 windows/linux 平台去区分不了的,因为已经切到 -p cross 了。。 但是,也不是完全没有办法区分,因为除了,linux, macosx, windows等已知的内置平台,其他任意未知平台,都会做为 cross 逻辑处理,所以你可以用一个其他平台名区分它,比如: xrepo install -p xxx_windows 然后,就能判断了 on_install("cross", function (package)
if package:is_plat("xxx_windows") then
-- add configs
end
end) 这样也避免了,windows 等内置平台内部的工具链和特殊逻辑干扰。
这是因为,每个内置平台,默认都会绑定一批工具链,比如 linux ,会自动尝试从 gcc/ clang 探测,优先使用。 不同平台探测的工具链名,顺序都有差异。 比如:macosx 下,clang 会优先探测,windows 下 msvc 会优先探测等等 |
Beta Was this translation helpful? Give feedback.
-
这个 commit 为 gflags 和 glog 添加了 "cross" platform,能正常使用。 昨天我在 Arch Linux 上指定 这个用法对 package xmake.lua 文件的改动很少,创建一个 private xrepo repository 也不困难,从完成指定编译器的目的来说足够了。 还有一些问题想做探讨。 关于 xrepo 的 package:
关于 xmake 的行为: 对于仅指定
|
Beta Was this translation helpful? Give feedback.
-
如果这些包,可以支持上 cross,欢迎来 pr 。。之前有些包 我只是没空弄和测试,所以暂时没加而已
最好是直接报错提示。 |
Beta Was this translation helpful? Give feedback.
-
另外,如果指定了 toolchain,我昨天改进了下,对 buildhash 也增加了 toolchain 的计算,不同工具链安装的包,不会互相冲突。 |
Beta Was this translation helpful? Give feedback.
-
这个,我转入 discussion 了,回头可以继续在那边讨论。 |
Beta Was this translation helpful? Give feedback.
-
$ xrepo scan libunwind
scanning packages ..
libunwind-v1.6.2:
-> ee651f42c30745f6abc414c060337018: linux, x86_64, unused
-> {debug=false,minidebuginfo=true,pic=true,shared=false,zlibdebuginfo=true}
-> a8242ea273e54d9284d4a8fe7320c29c: cross, none
-> {debug=false,minidebuginfo=false,pic=true,shared=false,toolchains="clang",zlibdebuginfo=false}
$ xrepo remove -p cross -f debug=false,minidebuginfo=false,pic=true,shared=false,toolchains=clang,zlibdebuginfo=false libunwind
error: checking for architecture ... none
error: target(working): toolchain not found!
$ xrepo remove -p cross --toolchains=clang -f debug=false,minidebuginfo=false,pic=true,shared=false,toolchains=clang,zlibdebuginfo=false libunwind
error: Invalid option: --toolchain=clang |
Beta Was this translation helpful? Give feedback.
-
你在什么场景下需要该功能?
在非交叉编译的需求下,切换编译器依然是合理的需求。我能想到的切换编译器的一些场景:
描述可能的解决方案
准备多个 Linux 环境安装不同的编译器是一个解决方案,但搭建开发环境毕竟比在现有系统多安装一个编译器工作量大很多。
目前 xrepo 指定编译器的方法:
on_loda
和on_install
支持 "cross",或者不加平台限制xrepo install -p cross --toolchain=<toolchain>
这个方案目前尝试可以走通,但需要修改不支持 "cross" 编译的 package。我会另外开 issue 来描述目前遇到的问题,有些问题或许并不难解决。
描述你认为的候选方案
CMake, autotools 等工具通过修改
CC
,CXX
环境变量即可实现切换编译器。而目前 xrepo-cmake 的代码在调用 xmake 时特意去除了CC
,CXX
环境变量。在 #1987 中我尝试过执行
xrepo install --toolchain
来指定编译器。当时从直觉来说,指定
toolchain
就能切换编译器是我预期的行为。是否可能通过在非 cross 平台下也透传 toolchain 来实现切换编译器?
之前的讨论中有说过这种方式难以对接 CI 进行测试,是否是指难以在 CI 环境中测试 toolchain 这个功能?
如果是 Ubuntu 环境的话,单个系统里安装多个编译器倒并不太麻烦。Arch Linux 上的确不太好搞,目前仅提供 Clang + GCC 两个编译器,但也能 cover 到这个 test case。
Beta Was this translation helpful? Give feedback.
All reactions