当前位置:

首页 > 软件教程 > xmake v2.5.2 发布,支持交叉工具链自动拉取

xmake v2.5.2 发布,支持交叉工具链自动拉取

xmake是一个基于Lua的轻量级跨平台构建工具,使用xmake.lua文件维护项目构建。相比makefile/CMakeLists.txt,xmake的配置语法更加简洁直观,对新手非常友好,短时间内即可快速上手,让用户能够将更多精力集中在实际的项目开发上。在2.5.2版本中,xmake增加了一个重量级的新特性:自动拉取远程交叉编译工具链。这个功能对于有过交叉编译和C/C++项目移植经验的开发者来说尤为重要,因为配置和下载交叉编译工具链是一个复杂且容易出错的过程。现在,xmake

本文目录

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 文件维护项目构建。相比 makefile/CMakeLists.txt,xmake 的配置语法更加简洁直观,对新手非常友好,短时间内即可快速上手,让用户能够将更多精力集中在实际的项目开发上。

    在 2.5.2 版本中,xmake 增加了一个重量级的新特性:自动拉取远程交叉编译工具链。这个功能对于有过交叉编译和 C/C++ 项目移植经验的开发者来说尤为重要,因为配置和下载交叉编译工具链是一个复杂且容易出错的过程。现在,xmake 可以自动下载项目所需的工具链,并使用这些工具链直接编译项目,用户无需关心如何配置工具链,只需执行 xmake 命令即可完成编译。

    xmake v2.5.2 发布, 支持自动拉取交叉工具链和依赖包集成

    不仅如此,对于 C/C++ 依赖包的集成,xmake 也可以自动切换到对应工具链进行编译和安装,整个过程完全自动化,用户无需手动干预。

    除了交叉编译工具链,xmake 还可以自动拉取其他工具链,例如特定版本的 llvm、llvm-mingw 和 zig 等,用于参与 C/C++/Zig 项目的编译。即使是 cmake 也不支持工具链的自动拉取,顶多只能配合 vcpkg/conan 等第三方包管理工具对 C/C++ 依赖包进行集成,而 xmake 则内置了自己的包管理工具,无需任何外部依赖。

    从 2.5.2 版本开始,xmake 支持拉取指定的工具链来集成编译项目,并且可以将依赖包切换到对应的远程工具链进行编译后集成。目前,xmake-repo 仓库中已经收录了以下工具链包:llvm、llvm-mingw、gnu-rm、muslcc 和 zig。虽然目前支持的工具链包数量有限,但整体架构已经打通,后续将收录更多的工具链,如 gcc、tinyc 和 vs-buildtools 等。

    由于 xmake 的包支持语义版本,如果项目依赖特定版本的 gcc/clang 编译器,xmake 会自动检测当前系统的 gcc/clang 版本是否满足需求。如果版本不满足,xmake 会自动拉取并安装特定版本的 gcc/clang,然后再进行项目编译。

    以下是使用特定版本的 llvm 工具链(例如 llvm-10)编译项目的示例代码:

    add_requires("llvm 10.x", {alias = "llvm-10"})
    target("test")
        set_kind("binary")
        add_files("src/*.c")
        set_toolchains("llvm@llvm-10")

    其中,llvm@llvm-10 中的前半部分为工具链名,后半部分为需要关联的工具链包名。如果设置了别名,则优先使用别名 llvm-10。

    后续还将增加 gcc 工具链包到 xmake-repo,使得用户可以自由切换到 gcc-10、gcc-11 等特定版本的 gcc 编译器,而无需手动安装。

    以下是拉取指定的交叉编译工具链(例如 muslcc)来编译项目的示例代码:

    add_requires("muslcc")
    target("test")
        set_kind("binary")
        add_files("src/*.c")
        set_toolchains("@muslcc")

    muslcc 是 https://musl.cc 提供的一款交叉编译工具链,默认 xmake 会自动集成编译 x86_64-linux-musl- 目标平台。当然,也可以通过 xmake f -a arm64 切换到 aarch64-linux-musl- 目标平台进行交叉编译。

    使用指定的 muslcc 交叉编译工具链去编译和集成所有的依赖包的示例代码如下:

    add_requires("muslcc")
    add_requires("zlib", "libogg", {system = false})
    set_toolchains("@muslcc")
    target("test")
        set_kind("binary")
        add_files("src/*.c")
        add_packages("zlib", "libogg")

    此时,工程中配置的 zlib、libogg 等依赖包会切换使用 muslcc 工具链,自动下载编译然后集成进来。也可以通过 set_plat/set_arch 固定平台,只需一个 xmake 命令即可完成整个交叉编译环境的集成以及架构切换。

    拉取并集成特定版本的 zig 工具链的示例代码如下:

    add_rules("mode.debug", "mode.release")
    add_requires("zig 0.7.x")
    target("test")
        set_kind("binary")
        add_files("src/*.zig")
        set_toolchains("@zig")

    xmake 会先下载特定版本的 zig 工具链,然后使用此工具链编译 zig 项目。如果用户已经自行安装了 zig 工具链,xmake 会自动检测对应版本是否满足需求,如果满足则直接使用,无需重复下载安装。

    zig cc 是 zig 内置的 C/C++ 编译器,可以独立进行 C/C++ 代码的编译和链接,完全不依赖 gcc/clang/msvc,非常强大。使用 zig cc 编译 C/C++ 项目的示例如下:

    $ xmake f --toolchain=zig
    $ xmake
    [ 25%]: compiling.release src/main.c
    "zig cc" -c -arch x86_64 -fvisibility=hidden -O3 -DNDEBUG -o build/.objs/xmake_test/macosx/x86_64/release/src/main.c.o src/main.c
    [ 50%]: linking.release test
    "zig c++" -o build/macosx/x86_64/release/test build/.objs/xmake_test/macosx/x86_64/release/src/main.c.o -arch x86_64 -stdlib=libc++ -Wl,-x -lz
    [100%]: build ok!

    zig cc 还支持不同架构的交叉编译,例如在 macOS 上交叉编译 windows/x64 目标程序,替代了 mingw 的功能:

    $ xmake f -p windows -a x64 --toolchain=zig
    $ xmake

    xmake 还提供了类似于 cmake 中 WINDOWS_EXPORT_ALL_SYMBOLS 的特性,可以快速全量导出 windows/dll 中的符号,简化对第三方项目移植过程中对符号导出的处理。配置 utils.symbols.export_all 规则即可实现这一功能:

    target("foo")
        set_kind("shared")
        add_files("src/foo.c")
        add_rules("utils.symbols.export_all")
    target("test")
        set_kind("binary")
        add_deps("foo")
        add_files("src/main.c")

    xmake 还提供了将 MinGW 生成的动态库(xxx.dll & xxx.dll.a)转换成 Visual Studio 可以识别的格式(xxx.dll & xxx.lib)的功能,参考自 CMAKE_GNUtoMS 功能。这一功能对 Fortran & C++ 混合项目特别有帮助,可以使用如下辅助模块接口:

    import("utils.platform.gnu2mslib")
    gnu2mslib("xxx.lib", "xxx.dll.a")
    gnu2mslib("xxx.lib", "xxx.def")
    gnu2mslib("xxx.lib", "xxx.dll.a", {dllname = "xxx.dll", arch = "x64"})

    为了简化用户自定义 rule 的配置,xmake 新提供了 on_buildcmd_file 和 on_buildcmd_files 等自定义脚本入口,可以通过 batchcmds 对象构造一个批处理命令行任务,xmake 在实际执行构建时一次性执行这些命令。这对于 xmake project 此类工程生成器插件非常有用,因为生成器生成的第三方工程文件不支持 on_build_files 此类内置脚本的执行支持。

    以下是使用 on_buildcmd_file 构造批处理命令的示例:

    rule("foo")
        set_extensions(".xxx")
        on_buildcmd_file(function (target, batchcmds, sourcefile, opt)
            batchcmds:vrunv("gcc", {"-o", objectfile, "-c", sourcefile})
        end)

    除了 batchcmds:vrunv,还支持其他批处理命令,例如:

    batchcmds:show("hello %s", "xmake")
    batchcmds:vrunv("gcc", {"-o", objectfile, "-c", sourcefile}, {envs = {LD_LIBRARY_PATH="/xxx"}})
    batchcmds:mkdir("/xxx") -- and cp, mv, rm, ln ..
    batchcmds:compile(sourcefile_cx, objectfile, {configs = {includedirs = sourcefile_dir, languages = (sourcekind == "cxx" and "c++11")}})
    batchcmds:link(objectfiles, targetfile, {configs = {linkdirs = ""}})

    以下是一个完整的示例,展示了如何使用 on_buildcmd_file 实现 lex 规则:

    rule("lex")
        set_extensions(".l", ".ll")
        on_buildcmd_file(function (target, batchcmds, sourcefile_lex, opt)
            -- imports
            import("lib.detect.find_tool")
            -- get lex
            local lex = assert(find_tool("flex") or find_tool("lex"), "lex not found!")
            -- get c/c++ source file for lex
            local extension = path.extension(sourcefile_lex)
            local sourcefile_cx = path.join(target:autogendir(), "rules", "lex_yacc", path.basename(sourcefile_lex) .. (extension == ".ll" and ".cpp" or ".c"))
            -- add objectfile
            local objectfile = target:objectfile(sourcefile_cx)
            table.insert(target:objectfiles(), objectfile)
            -- add commands
            batchcmds:show_progress(opt.progress, "${color.build.object}compiling.lex %s", sourcefile_lex)
            batchcmds:mkdir(path.directory(sourcefile_cx))
            batchcmds:vrunv(lex.program, {"-o", sourcefile_cx, sourcefile_lex})
            batchcmds:compile(sourcefile_cx, objectfile)
            -- add deps
            batchcmds:add_depfiles(sourcefile_lex)
            batchcmds:set_depmtime(os.mtime(objectfile))
            batchcmds:set_depcache(target:dependfile(objectfile))
        end)

    关于依赖包配置的改进,xmake 新增了 add_extsources 和 on_fetch 两个配置接口,可以更好的配置 xmake 在安装 C/C++ 包的过程中,对系统库的查找过程。例如,通过 add_extsources("pkgconfig::libusb-1.0") 改进查找逻辑,使 xmake 能够找到通过 apt install libusb-1.0 安装的系统库:

    package("libusb")
        add_extsources("pkgconfig::libusb-1.0")
        on_install(function (package)
            -- ...
        end)

    如果需要更复杂的查找逻辑,可以使用 on_fetch 完全定制化查找系统库逻辑,例如:

    package("libusb")
        on_fetch("linux", function(package, opt)
            if opt.system then
                return find_package("pkgconfig::libusb-1.0")
            end
        end)

    在新版本中,xmake 还新增了对 windows .manifest 文件的支持,只需通过 add_files 添加即可:

    add_rules("mode.debug", "mode.release")
    target("test")
        set_kind("binary")
        add_files("src/*.cpp")
        add_files("src/*.manifest")

    关于 xrepo 命令的改进,现在可以通过 xrepo remove --all 命令批量卸载删除已经安装的包,支持模式匹配:

    $ xrepo remove --all
    $ xrepo remove --all zlib pcr*

    最后,xmake 改进了 add_packages,使其支持 {public = true} 来导出包配置给父 target。例如:

    add_rules("mode.debug", "mode.release")
    add_requires("pcre2")
    target("test")
        set_kind("shared")
        add_packages("pcre2", {public = true})
        add_files("src/test.cpp")
    target("demo")
        add_deps("test")
        set_kind("binary")
        add_files("src/main.cpp")
        -- 我们可以在这里使用被 test 目标导出的 pcre2 库

    具体导出的配置如下:

    -- 默认私有,但是 links/linkdirs 还是会自动导出
    add_packages("pcre2")
    -- 全部导出,包括 includedirs, defines
    add_packages("pcre2", {public = true})

    更新内容包括以下新特性:

    • 支持 zig cc 和 zig c++ 作为 C/C++ 编译器
    • 支持使用 zig 进行交叉编译
    • 改进终端和 color codes 探测
    • 传递自定义 includes 脚本给 xrepo
    • 添加 linuxos 内置模块获取 linux 系统信息
    • 支持在编译项目时自动拉取工具链
    • 添加 rule("utils.symbols.export_all") 自动导出所有 windows/dll 中的符号
    • 添加 utils.platform.gnu2mslib(mslib, gnulib) 模块接口去转换 mingw/xxx.dll.a 到 msvc xxx.lib
    • 改进规则支持新的批处理命令去简化自定义规则实现
    • 添加 add_extsources 去改进外部包的查找
    • 支持为 windows 程序添加 .manifest 文件参与链接
    • 支持使用 xrepo remove --all 命令去移除所有的包,并且支持模式匹配
    • 支持导出包配置给父 target,实现包配置的依赖继承

    改进包括:

    • 添加缺失的 Qt 头文件搜索路径
    • 改进 C++ 语言标准,以便支持 Qt6
    • 为 vsxmake 插件添加 qt.ui 文件
    • 改进 vs/vsxmake 插件去支持预编译头文件和智能提示
    • 简化自定义规则
    • 改进 protobuf 规则,支持 compile_commands 生成器
    • 改进 vs/vsxmake 生成器去支持启动工程设置
    • 改进 add_deps 和 add_packages 直接的导出 links 顺序
    • 移除废弃的 add_defines_h_if_ok 和 add_defines_h 接口

    Bugs 修复包括:

    • 修复版本检测和更新
    • 修复 includes 搜索路径中带有空格编译不过问题

    关注公众号 TBOOX 开源工程,专注于 C 跨平台开发解决方案。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    软件教程
    相关文章 更多
    让 VS 编译 MonoTouch 项目不再出错
    让 VS 编译 MonoTouch 项目不再出错

    让VS编译MonoTouch项目源文件不再出错在使用MonoTouch进行iOS开发时,由于MonoDevelop相较于VS2010功能有限,通常会创建两个项目:一个在OSX下使用的MonoDevelop项目,一个在Windows下使用的VS项目。通常在Windows上进行编码,然后在OSX上调试。然而,默认的VS项目在添加MonoTouch项目的CS源文件后,常常会出现编译错误。如果安装了Resharper等插件,还会收到大量错误提示,这

    手写第一个 Java 程序执行过程解析
    手写第一个 Java 程序执行过程解析

    在上一篇详细介绍JDK8下载、安装和环境配置(适用于macOS和Windows)的文章之后,我们已经准备好Java开发环境了。现在让我们实践一下,通过编写一个简单的Java程序来输出“HelloWorld”。我们将分析从编码到运行的整个过程,了解究竟发生了什么。手动编写HelloWorld程序我们将使用最原始的方式——手写代码,直接在记事本中输入。对于Windows用户,可以直接使用记事本;macOS用户可以通过在终端中输入以下命令来打开文本编辑器:open-aTextEdit以下是输出“

    Windows下编译libjpeg库教程
    Windows下编译libjpeg库教程

    要在Windows上编译libjpeg库,我们可以按照以下步骤进行操作。这些步骤包括下载源代码、了解编译配置方法以及实际编译过程。1.下载源码您可以从以下两个地址下载jpegsrc9c.zip源码包:官方网站:http://www.ijg.org/files/jpegsr9c.zip备用地址(如果官方地址失效):https://github.com/aeagean/LibjpegForWindows/blob/master/jpeg-9c/jpegsr9c.zip2.编译配置方法下载的源码中包含一个名

    Android 9.0源码快速整编方法分享
    Android 9.0源码快速整编方法分享

    前言有时候我们顺利地下载了AOSP源码,很多时候我们不仅仅需要查看源码,还有一些其他需求:动态调试Android系统源码定制Android系统将最新版本的Android系统刷入到自己的Android设备中为了实现这些需求,我们需要编译系统源码。1.编译系统概述了解以下一些概念,会对Android编译系统有一个大致的了解。MakefileAndroid平台的编译系统,实际上是一个用Makefile编写的独立项目。它定义了编译规则,实现了“自动化编译”,不仅将数百个Git库中的代码整合起来、统一编译,还将产物

    你真的会用Github吗?Electron自动打包攻略
    你真的会用Github吗?Electron自动打包攻略

    前言相信很多web前端开发的小伙伴和我一样,在想到要开发桌面端应用的时候会第一时间想到用Electron来开发。它可以让我们使用熟悉的HTML+JS+CSS来开发桌面应用。只需要一套代码,你的应用就可以轻松的运行在Windows,macOS,Linux三大操作系统上。但是过去开发Electron应用的时候想要编译出三大系统的应用程序安装包就有点麻烦了,你需要分别在三个操作系统上执行编译命令才能编译出对应系统的安装包。在不知道本文的方法之前,开发的过程是很开心的,但编译的过程提前运行你的Windows系统虚

    编程语言:解释型与编译型的区别详解
    编程语言:解释型与编译型的区别详解

    解释性语言和编译型语言的区别和不同解释性语言编译型语言概念计算机无法直接理解高级语言,只能理解机器语言,因此需要将高级语言转换为机器语言才能运行程序。这种转换有两种方式:编译和解释,区别在于转换的时间点不同。特征解释性语言的程序无需编译,省去了一道工序。解释性语言在运行时才进行翻译,例如Java语言有一个专门的解释器可以直接执行Java程序,每个语句在执行时才被翻译。因此,解释性语言每次执行都需要翻译,效率相对较低。区别解释性语言的程序运行时,控制权在解释器(如JRE、.NET)而非用户程序。区别一些网页

    免费地址也会导致崩溃?
    免费地址也会导致崩溃?

    在Windows平台上使用C++开发服务时,涉及到不同组件之间的内存管理确实是一个需要谨慎处理的问题。让我们详细分析一下你描述的场景和问题。场景分析你描述了一个应用程序(APP.exe)和一个动态链接库(lib.dll)之间的内存管理问题。APP.exe使用malloc申请了一段内存,然后lib.dll调用free来释放这块内存。由于APP.exe和lib.dll使用了不同的CRT库链接方式,导致了内存管理的不一致性,从而引发了程序崩溃(crash)。链接方式与CRT库你提到了四种CRT库的链接方式:/M

    Win10 UWP应用启动失败解决方法
    Win10 UWP应用启动失败解决方法

    本文告诉大家如果在使用release编译时,无法启动应用,出现EntryPointNotFound如何让应用运行。代码语言:javascript代码运行次数:0运行复制程序“[30760]xx.exe”已退出,返回值为-1073741511(0xc0000139)'EntryPointNotFound'。激活Windows应用商店应用“43179.1161685EE70AE_ajj8jc175maf4!App”失败,错误为“应用未启动”。如果在DEBUG可以运行,但是在

    笨鸟手册6:远程访问Jetson NANO教程
    笨鸟手册6:远程访问Jetson NANO教程

    感谢热心用户[七月]提供的详细指南。本指南基于《NvidiaJetsonNano远程登录(Vino-VNC)中文版》,感谢原作者的贡献。本指南要求在nano端点击接受才能连接到远程控制。首先,启动JetsonNano,并在终端中使用apt-get安装VinoVNC,命令如下:sudoapt-getinstallvino如果没有错误提示,请继续下一步:安装[dconf-editor]工具,sudoapt-getinstalldconf-editor运行[dconf-editor]dc

    VSCode功能详解:它如何帮助你提高工作效率?
    VSCode功能详解:它如何帮助你提高工作效率?

    VSCode功能详解:它如何帮助你提高工作效率?随着软件开发行业的不断发展,开发人员们追求工作效率和代码质量成为了他们工作中的重要目标。在这个过程中,代码编辑器的选择成为了一项关键的决策。而在众多的编辑器中,VisualStudioCode(简称VSCode)凭借其强大的功能和灵活的扩展性受到了广大开发者的喜爱。本文将详细介绍VSCode的一些功能,探讨

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。