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

交叉编译 #1008

Closed
zt449569708 opened this issue Nov 1, 2020 · 19 comments
Closed

交叉编译 #1008

zt449569708 opened this issue Nov 1, 2020 · 19 comments
Milestone

Comments

@zt449569708
Copy link

`
if is_plat("arm64") then
set_config("sdk", "/opt/gcc-arm64")
set_config("bin", "/opt/gcc-arm64/bin")
end

target("hello")
set_kind("binary")
add_files("src/*.c")
`
想请教一下,这种写法方式为什么无法交叉编译呢?因为我代码可能在多个不同的CPU平台编译,但是可能又记不住那么长的配置命令,所以只想通过简单地 xmake f -p 'plat' 来进行平台切换。

@waruqi
Copy link
Member

waruqi commented Nov 1, 2020

is_plat 依赖 xmake f -p plat 配置读取,而里面的 set_config 又是设置 xmake config 中的配置值,这就会存在先有鸡还是先有蛋的问题。。

所以尽量不要使用set_config,即使要用,不要在 is_plat/is_arch 的 if 内部配置。

交叉编译通常只需要指定 --sdk= 一个参数,xmake f -p cross --sdk=/opt/gcc-arm64 就行了,也就是切不同的sdk路径,通常cross/bin什么的,都会自动检测到,配置命令也不会长到哪去。

如果要省去sdk的设置,尽量使用 set_toolset/set_toolchains,这个是可以特定每个target单独设置,不同更加细粒度到cc/ld。

也可以在 xmake.lua 中自己定义自己的多个 toolchain("xxx") ,里面可以通过 set_sdkdir()写死sdk dir,然后 xmake f -p cross --toolchain=xxx
就可以随意切工具链了,这也是切换自定义工具链的推荐做法,可以参考:

如果--toolchains=参数也不想传,那就自己定义好toolchain("xxx") 工具链后,通过 判断 is_plat 然后设置 set_toolchains("xxx") 关联对应工具链。

@waruqi
Copy link
Member

waruqi commented Nov 1, 2020

如果非要根据自己的 xmake f -p myplat 切特定工具链,可以参考下面的配置(注:我稍微改进了下,所以需要更新到dev版本,才能生效,xmake update -s dev

toolchain("my_toolchain")
    set_kind("standalone")
    set_cross("arm-linux-musleabi-")
    set_sdkdir("/tmp/arm-linux-musleabi-cross")
    set_bindir("/tmp/arm-linux-musleabi-cross/bin")
    on_load(function (toolchain)
        -- load some basic configuration for cross-toolchain, e.g. toolchain:set("toolchain", "cc", cross .. "gcc")
        import("toolchains.cross.load", {rootdir = os.programdir()})
        load(toolchain)
        -- add some custom flags
        --toolchain:add("ldflags", "--static", {force = true})
        --toolchain:add("syslinks", "gcc", "c")
    end)
toolchain_end()

target("hello")
    set_kind("binary")
    add_files("apps/hello/*.c")
    if is_plat("myplat") then
        set_toolchains("my_toolchain")
    end

这里通过 set_toolchains 来绑定自定义工具链到特定 target,当然也可以设置对所有target生效,然后只需要 xmake f -p myplat -c; xmake -rv

当然,如果不用set_toolchains,那么,也只需要 xmake f -p myplat --toolchain=my_toolchain 手动切下自己的工具链。

@waruqi
Copy link
Member

waruqi commented Nov 1, 2020

我稍微改进了下,简化了交叉工具链的定制,现在只需要这样就可以了,请更新到dev版本:xmake update -s dev

toolchain("my_toolchain")
    set_kind("standalone")
    set_cross("arm-linux-musleabi-")
    set_sdkdir("/tmp/arm-linux-musleabi-cross")
toolchain_end()

target("hello")
    set_kind("binary")
    add_files("apps/hello/*.c")
    if is_plat("myplat") then
        set_toolchains("my_toolchain")
    end

@waruqi
Copy link
Member

waruqi commented Nov 2, 2020

昨天的patch改出了点问题,如果已经拉取,请重新更新下dev版本,xmake update -s dev

@zt449569708
Copy link
Author

zt449569708 commented Nov 2, 2020 via email

@zt449569708
Copy link
Author

zt449569708 commented Nov 8, 2020

昨天的patch改出了点问题,如果已经拉取,请重新更新下dev版本,xmake update -s dev

问题1:
`
toolchain("ppc64_toolchain")

set_kind("standalone")

set_bindir("/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc64-fsl-linux")

set_sdkdir("/opt/fsl-qoriq/2.0/sysroots/ppc64e6500-fsl-linux/usr")

set_cross("powerpc64-fsl-linux-")

toolchain_end()
`

上面代码set_bindir设置后没有作用,然后我查了一下core/tool/toolchain.lua文件,这里是不是应该改一下:
`
function _instance:bindir()

local bindir = config.get("bin") or self:info():get("bindir")

if self:cross() and self:sdkdir() and os.isdir(path.join(self:sdkdir(), "bin")) then

    bindir = path.join(self:sdkdir(), "bin")

end

return bindir

end
改成
function _instance:bindir()

local bindir = config.get("bin") or self:info():get("bindir")

if bindir==nil and self:cross() and self:sdkdir() and os.isdir(path.join(self:sdkdir(), "bin")) then

    bindir = path.join(self:sdkdir(), "bin")

end

return bindir

end
`
是不是要判断一下bindir (bindir==nil),如果bindir已经设置了,是不是不应该被重新设置?或者path用append方法(不知道有没有append方法,只是觉得这样更合理),来再添加一个路径。

问题2:
`
toolchain("arm64_toolchain")

set_kind("standalone")

set_sdkdir("/opt/gcc-arm64")

set_cross("aarch64-none-linux-gnu-")

toolchain_end()

`
通过这种方式设置交叉编译链,必须要设置set_cross,不然找不到交叉编译链。但是通过 xmake f -p cross --sdk=/opt/gcc-arm64 就行。

@waruqi
Copy link
Member

waruqi commented Nov 8, 2020

问题一,是后来的改动没还好,我回头再改下
问题二,目前xmake.lua里面写死绑定toolchain,会跳过toolchain的check过程,所以cross得手动配置上,否则没取到,但是走 xmake f 会自动check cross toolchain,所以有cross值
关于一个问题,之前我就知道的,只不过后来一直没时间细看,你先加上cross用吧,我可能需要等后面有时间了,才能够细看下如果加上check

@zt449569708
Copy link
Author

zt449569708 commented Nov 8, 2020 via email

@zt449569708
Copy link
Author

zt449569708 commented Nov 8, 2020 via email

@waruqi
Copy link
Member

waruqi commented Nov 8, 2020

默认的交叉工具链会设置 -L lib ,你可以自定义toolchain在 on_load中,追加 toolchain:add("linkdirs", "xxxx/lib64")

可以参考musl工具链:

on_load(function (toolchain)
-- load basic configuration of cross toolchain
toolchain:load_cross_toolchain()
-- add flags for arch
if toolchain:is_arch("arm") then
toolchain:add("cxflags", "-march=armv7-a", "-msoft-float", {force = true})
toolchain:add("ldflags", "-march=armv7-a", "-msoft-float", {force = true})
end
toolchain:add("ldflags", "--static", {force = true})
toolchain:add("syslinks", "gcc", "c")
end)

在 toolchain:load_cross_toolchain 之前优先添加 toolchain:add("linkdirs", "xxxx/lib64")

local linkdir = path.join(sdkdir, "lib")
if os.isdir(linkdir) then
toolchain:add("linkdirs", linkdir)
end
end

@waruqi
Copy link
Member

waruqi commented Nov 8, 2020

问题1 的 bindir 我修复了 dev

@waruqi
Copy link
Member

waruqi commented Nov 9, 2020

还有个问题,当交叉编译链安装目录下有lib目录是,xmake会去显性链接-L/$sdkdir/lib,那对于64位编译器下面的lib64好像就没有去显性链接。因为链接了lib目录,但没有链接lib64目录,感觉有点别扭。实际上没有必要去显性链接,因为gcc一般会自动去链接 “ aarch64-none-linux-gnu-gcc -print-search-dirs“ 打印出的目录。

------------------ 原始邮件 ------------------ 发件人: "xmake-io/xmake" <[email protected]>; 发送时间: 2020年11月8日(星期天) 下午3:02 收件人: "xmake-io/xmake"<[email protected]>; 抄送: "449569708"<[email protected]>;"Author"<[email protected]>; 主题: Re: [xmake-io/xmake] 交叉编译 (#1008) 问题一,是后来的改动没还好,我回头再改下 问题二,目前xmake.lua里面写死绑定toolchain,会跳过toolchain的check过程,所以cross得手动配置上,否则没取到,但是走 xmake f 会自动check cross toolchain,所以有cross值 关于一个问题,之前我就知道的,只不过后来一直没时间细看,你先加上cross用吧,我可能需要等后面有时间了,才能够细看下如果加上check — You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

关于这个问题,我dev上去掉了内置显式的 sdk/inclde sdk/lib ,完全依赖编译器自身内部去找,这样兼容性应该会更好些,你可以再试试

@waruqi waruqi added this to the v2.3.9 milestone Nov 9, 2020
@zt449569708
Copy link
Author

zt449569708 commented Nov 9, 2020 via email

@waruqi
Copy link
Member

waruqi commented Nov 12, 2020

通过这种方式设置交叉编译链,必须要设置set_cross,不然找不到交叉编译链。但是通过 xmake f -p cross --sdk=/opt/gcc-arm64 就行。

这个问题我dev上修复了,你再更新下试试

@waruqi
Copy link
Member

waruqi commented Nov 13, 2020

你这也在更新下吧,dev,我修复了一个 set_toolset 配置问题,#1024

@waruqi waruqi closed this as completed Nov 13, 2020
@zt449569708
Copy link
Author

zt449569708 commented Nov 15, 2020 via email

@waruqi
Copy link
Member

waruqi commented Nov 15, 2020

github ci上每次构建,都会有对应win安装包,下载下来直接安装就行了

@zt449569708
Copy link
Author

zt449569708 commented Nov 15, 2020 via email

@waruqi
Copy link
Member

waruqi commented Nov 15, 2020

安装包下来安装 ,lua脚本不就也同步更新了么。有什么区别呢? 安装包又不大,没必要为了省这一几百k,单独下载lua

如果你非要只更新lua脚本,直接git clone xmake的仓库源码,覆盖里面的整个xmake子目录不就好了,就是lua脚本

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