Xmake v2.8.2 发布,官方包仓库数量突破 1k

news2025/1/12 13:25:19

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。

它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时。

它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。

我们能够使用它像 Make/Ninja 那样可以直接编译项目,也可以像 CMake/Meson 那样生成工程文件,另外它还有内置的包管理系统来帮助用户解决 C/C++ 依赖库的集成使用问题。

目前,Xmake 主要用于 C/C++ 项目的构建,但是同时也支持其他 native 语言的构建,可以实现跟 C/C++ 进行混合编译,同时编译速度也是非常的快,可以跟 Ninja 持平。

Xmake = Build backend + Project Generator + Package Manager + [Remote|Distributed] Build + Cache

尽管不是很准确,但我们还是可以把 Xmake 按下面的方式来理解:

Xmake ≈ Make/Ninja + CMake/Meson + Vcpkg/Conan + distcc + ccache/sccache
  • 项目源码
  • 官方文档
  • 入门课程

新特性介绍

这个版本,我们新增了不少实用的 API,并且移除了一些几年前就被标记为废弃的接口,另外改进了动态库对 soname 的支持。

同时,在这期间,我们迎来了一些喜人的数据,我们的 xmake-repo 官方仓库包的数量也突破了 1k,非常感谢 Xmake 的每位贡献者,我们的包仓库基本上都是社区贡献者贡献进来的。

尤其是 @xq114, @star-hengxing, @SirLynix 帮忙贡献了大量的包,非常感谢~

还有,Xmake 仓库 Commits 也突破到了 12k,一直在持续快速迭代中。下面我们简单介绍下,新版本中的一些主要更新内容。

增加 soname 支持

新版本中,我们对 set_version 接口新增了 soname 版本支持,用于控制 so/dylib 动态库的版本兼容性控制。

我们可以配置 soname 的版本后缀名称,xmake 会在编译、安装动态库的时候,自动生成符号链接,执行指定版本的动态库。

例如,如果我们配置:

set_version("1.0.1", {soname = true})

xmake 会自动解析版本号的 major 版本作为 soname 版本,生成的结构如下:

└── lib
    ├── libfoo.1.0.1.dylib
    ├── libfoo.1.dylib -> libfoo.1.0.1.dylib
    └── libfoo.dylib -> libfoo.1.dylib

当然,我们也可以指定 soname 到特定的版本命名:

set_version("1.0.1", {soname = "1.0"}) -> libfoo.so.1.0, libfoo.1.0.dylib
set_version("1.0.1", {soname = "1"}) -> libfoo.so.1, libfoo.1.dylib
set_version("1.0.1", {soname = "A"}) -> libfoo.so.A, libfoo.A.dylib
set_version("1.0.1", {soname = ""}) -> libfoo.so, libfoo.dylib

而如果没设置 soname,那么默认不开启 soname 版本兼容控制:

set_version("1.0.1") -> libfoo.so, libfoo.dylib

改进 add_vectorexts 接口

add_vectorexts 接口主要用于添加扩展指令优化选项,目前支持以下几种扩展指令集:

add_vectorexts("mmx")
add_vectorexts("neon")
add_vectorexts("avx", "avx2", "avx512")
add_vectorexts("sse", "sse2", "sse3", "ssse3", "sse4.2")

其中,avx512, sse4.2 是我们新版本新增的指令配置,另外我们还新增了一个 all 配置项,可以用于尽可能的开启所有扩展指令优化。

add_vectorexts("all")

新增 set_encodings 接口

这个新接口主要用于设置源文件、目标执行文件的编码。

默认情况下,我们仅仅指定编码,是会同时对源文件,目标文件生效。

-- for all source/target encodings
set_encodings("utf-8") -- msvc: /utf-8

它等价于:

set_encodings("source:utf-8", "target:utf-8")

并且,目前仅仅支持设置成 utf-8 编码,将来会不断扩展。

如果,我们仅仅想单独设置源文件编码,或者目标文件编码,也是可以的。

设置源文件编码

通常指的是编译的代码源文件的编码,我们可以这么设置。

-- gcc/clang: -finput-charset=UTF-8, msvc: -source-charset=utf-8
set_encodings("source:utf-8")

设置目标文件编码

它通常指的是目标可执行文件的运行输出编码。

-- gcc/clang: -fexec-charset=UTF-8, msvc: -target-charset=utf-8
set_encodings("target:utf-8")

新增 add_forceincludes 接口

我们还新增了 add_forceincludes 接口,用于在配置文件中直接强制添加 includes 头文件。

add_forceincludes("config.h")

它的效果类似于 #include <config.h>,但是不需要在源码中显式添加它了。

另外,它的搜索路径也是需要通过 add_includedirs 来控制,而不是直接配置文件路径。

add_forceincludes("config.h")
add_includedirs("src")

默认 add_forceincludes 匹配 c/c++/objc。如果仅仅只想匹配 c++ 可以这么配置:

add_forceincludes("config.h", {sourcekinds = "cxx"})

如果想同时匹配多个源文件类型,也是可以的:

add_forceincludes("config.h", {sourcekinds = {"cxx", "mxx"}})

对于 gcc,它会设置 -include config.h 标志,对于 msvc,它会设置 -FI config.h 标志。

新增 add_extrafiles 接口

在之前的版本中,如果我们要在 vs/vsxmake 工程生成器中添加一些额外的文件到工程列表中去,只能通过 add_headerfiles 来添加,但是这有一点 Hack。

因此,我们新增了 add_extrafiles 接口,专门用于配置一些额外的文件到工程中,这样,用户也可以快速点击编辑它们。

这些被添加文件不是代码文件,不会参与编译,也不会被安装,仅仅只是能够让用户方便的在生成的工程 IDE 中,快速编辑访问它们。

将来,我们也可能用此接口做更多其他的事情。

add_extrafiles("assets/other.txt")

sdasstm8 汇编器支持

@lanjackg2003 帮忙贡献了 sdcc/sdasstm8 汇编器的支持,非常感谢。

相关 patch, #4071

改进 Rust 交叉编译支持

新版本中,我们还对 Rust 项目构建做了改进,新增了交叉编译支持,包括对依赖包的交叉编译。

set_arch("aarch64-unknown-none")
add_rules("mode.release", "mode.debug")
add_requires("cargo::test", {configs = {
    std = false,
    main = false,
    cargo_toml = path.join(os.projectdir(), "Cargo.toml")}})

target("test")
    set_kind("binary")
    add_files("src/main.rs")
    add_packages("cargo::test")

例如上面的项目配置,我们通过 set_arch("aarch64-unknown-none") 全局修改编译架构,就能对依赖包,以及自身项目进行交叉编译。

如果没有配置 set_arch,我们也可以通过命令 xmake f -a aarch64-unknown-none; xmake 来动态切换编译架构。

当然,别忘了先得执行 rustup target add aarch64-unknown-none 安装对应的 target 才行。

更多上下文,见:#4049

更新日志

新特性

  • #4002: 增加 soname 支持
  • #1613: 为 add_vectorexts 增加 avx512 和 sse4.2 支持
  • #2471: 添加 set_encodings API 去设置源文件和目标文件的编码
  • #4071: 支持 sdcc 的 stm8 汇编器
  • #4101: 为 c/c++ 添加 force includes
  • #2384: 为 vs/vsxmake 生成器添加 add_extrafiles 接口

改进

  • #3960: 改进 msys2/crt64 支持
  • #4032: 移除一些非常老的废弃接口
  • 改进 tools.msbuild 升级 vcproj 文件
  • 支持 add_requires(“xmake::xxx”) 包
  • #4049: 改进 Rust 支持交叉编译
  • 改进 clang 下 c++ modules 支持

Bugs 修复

  • 修复 macOS/Linux 上子子进程无法快速退出问题

https://tboox.org/cn/2023/08/22/xmake-update-v2.8.2/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT只是玩具:生成式人工智能在不同行业的应用

源自&#xff1a;IT经理网 生成式人工智能的十一个行业用例 打开生成式 AI的正确姿势 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff0c;如转载稿涉及版权等问题&…

ssm在线云音乐系统的设计与实现

ssm在线云音乐系统的设计与实现042 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着移动互联网时代的发展&#xff0c;网络的使用越来越普及&#xff0c;用户在获取和存储信息方面也会有激动人心的…

代码随想录算法训练营(回溯总结篇)

回溯也可以说是暴力搜索&#xff08;最多剪枝一下&#xff09;。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 一.分类 1.组合问题 &#xff08;1&#xff09;按组合元素的个数 &#xff08;2&#xff09;按组合元素的总和 有重复元素 同一元素可以重复选&#x…

【C语言】喝汽水问题

大家好&#xff01;今天我们来学习C语言中的喝汽水问题&#xff01; 目录 1. 题目内容&#xff1a; 2. 思路分析 2.1 方法一 2.2 方法二 2.3 方法三 3. 代码实现 3.1 方法一 3.2 方法二 3.3 方法三 1. 题目内容 喝汽水&#xff0c;1瓶汽水1元&#xff0c;2个空瓶可以…

Java学习笔记37

Java笔记37 TCP案例 TCP实现发送消息 下面我们来分别编写一个客户端程序和一个服务端程序&#xff0c;使用用户端给服务端发送一句消息&#xff0c;然后使用服务端接收用户端发送过来的这句消息并打印输出。 客户端&#xff1a; 创建一个与服务端Socket类的实例对象&#xf…

基于java+mysql+控件台学生信息管理系统

基于javamysql控件台学生信息管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java SE项目&#xff08;控制台打印&#xff09; 项目名称&#xff1a;基于Java学生信息管理系统&#xff08;student_sys) 当前版本&#xf…

寻找重复数-快慢指针

给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 nums 且只用常…

使用 MATLAB 和 Simulink 对雷达系统进行建模和仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ClickHouse(二十五):ClickHouse 可视化工具操作

​​​​​​​ 进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证…

vite创建项目命令

1.第一步运行创建命令&#xff08;npm&#xff09; npm create vitelatest也可以使用yarn yarn create vite还可以 pnpm create vite注意的地方&#xff1a;首次创建的时候会出现这个 Need to install the following packages:create-vitelatest Ok to proceed? (y) 直接y就…

如何设计一个订单号生成服务?

一、数据量的大小二、有意义的ID三、高可用四、高性能五、唯一性六、包含分库分表的业务字段七、实战 1) Redis2) Leaf-segment 数据库生成3)Leaf-snowflake方案4) UUID 如何设计要给订单号生成服务 一、数据量的大小 在设计订单号的生成服务时候&#xff0c;我们首先要考虑的…

【深度学习 | ResNet核心思想】残差连接 跳跃连接:让信息自由流动的神奇之道

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

ms-tpm-20-ref 在linux下编译

1、代码地址&#xff0c; GitHub - microsoft/ms-tpm-20-ref: Reference implementation of the TCG Trusted Platform Module 2.0 specification.Reference implementation of the TCG Trusted Platform Module 2.0 specification. - GitHub - microsoft/ms-tpm-20-ref: Refe…

企业/公司电脑图纸加密软件系统——「天锐绿盾加密软件」

天锐绿盾是一款企业级透明加密软件&#xff0c;旨在保护企业或设计院的图纸文件和电子文档&#xff0c;防止信息泄露和数据安全问题。 ​ 天锐绿盾采用了核心驱动层的透明加密 技术&#xff0c;可以在操作系统层自动对所有需要加密的文档进行加密和解密&#xff0c;用户在使用加…

交换机的基本原理与配置(二)

目录 2. 以太网交换机 2.1 交换机设备简介 2.2交换机的工作原理 2.3交换机接口的双工模式 2. 以太网交换机 下面通过交换机设备简介&#xff0c;交换机的工作原理及交换机接口模式来了解以太网交换机。 2.1 交换机设备简介 交换机的品牌众多&#xff0c;像Cisco公司&#xf…

自动设置服务器全教程

亲爱的爬虫探险家&#xff01;在网络爬虫的世界里&#xff0c;自动设置代理服务器是一个非常有用的技巧。今天&#xff0c;作为一家代理服务器供应商&#xff0c;我将为你呈上一份轻松实用的教程&#xff0c;帮助你轻松搞定爬虫自动设置代理服务器。 一、为什么需要自动设置代…

华为OD-第K长的连续字母字符串长度

题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 代码实现 # coding:utf-8 # 第K长的连续字母字符串长度 # https://www.nowcoder.com/discuss/353150…

差分走线的要求

1 等长&#xff1a;等长是指两条线的长度要尽量一样长&#xff0c;是为了保证两个差分信号时刻保持相反极性。减少共模分量。 2等宽等距&#xff1a;等宽是指两条信号的走线宽度需要保持一致&#xff0c;等距是指两条线之间的间距要保持不变&#xff0c;保持平行。 对走线要求最…

pytorch下的scatter、sparse安装

知道自己下载的torch配置 import torch print(torch.__version__) print(torch.version.cuda)进入网站&#xff0c;选择自己配置 https://pytorch-geometric.com/whl/下载相应的包 安装 pip install ******.whl