Xmake v2.8.6 发布,新的打包插件:XPack

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
  • 项目源码
  • 官方文档
  • 入门课程

新特性介绍

在介绍新特性之前,还有个好消息告诉大家,上个版本 Xmake 被收入到了 debian 仓库,而最近 Xmake 又进入了 Fedora 官方仓库,大家可以在 Fedora 39 上,直接通过下面的命令安装 Xmake。

$ sudo dnf install xmake

非常感谢 @topazus @mochaaP 对 Xmake 的贡献,相关信息见:#941。

接下来,我们来介绍下,新版本带来的重量级特性:XPack。

它类似于 CMake 的 CPack 命令,可以将用户工程快速打包生成各种格式的安装包。

目前 Xmake 的 XPack 已经支持以下格式的打包:

  • nsis: Windows 下的可执行安装包
  • runself: shell 自编译安装包
  • targz: 二进制文件 tar.gz 包(绿色版)
  • zip: 二进制文件 zip 包(绿色版)
  • srctargz:源文件 tar.gz 包
  • srczip: 源文件 zip 包
  • srpm: rpm 源码安装包
  • rpm: rpm 二进制安装包

除了上述已经支持的打包格式,还有 deb 等包格式也在陆续支持中,并且用户也可以配置生成自定义的包格式文件。

XPack 打包

下面是一个完整例子,我们可以先简单看下:

set_version("1.0.0")
add_rules("mode.debug", "mode.release")includes("@builtin/xpack")target("test")set_kind("binary")add_files("src/*.cpp")xpack("test")set_formats("nsis", "zip", "targz", "runself")set_title("hello")set_author("ruki")set_description("A test installer.")set_homepage("https://xmake.io")set_licensefile("LICENSE.md")add_targets("test")add_installfiles("src/(assets/*.png)", {prefixdir = "images"})add_sourcefiles("(src/**)")set_iconfile("src/assets/xmake.ico")after_installcmd(function (package, batchcmds)batchcmds:mkdir(package:installdir("resources"))batchcmds:cp("src/assets/*.txt", package:installdir("resources"), {rootdir = "src"})batchcmds:mkdir(package:installdir("stub"))end)after_uninstallcmd(function (package, batchcmds)batchcmds:rmdir(package:installdir("resources"))batchcmds:rmdir(package:installdir("stub"))end)

我们通过 includes("@builtin/xpack") 引入 xpack 的所有配置接口,包括 xpack 配置域,以及它的所有域接口。

然后我们执行:

$ xmake pack

即可生成所有安装包。

生成 NSIS 安装包

只要配置了 set_formats("nsis") 格式,然后执行 xmake pack 命令,就能生成 NSIS 格式的安装包。

另外,xmake 还会自动安装生成 NSIS 包所需的工具,实现真正的一键打包。

$ xmake pack
note: install or modify (m) these packages (pass -y to skip confirm)?
in xmake-repo:-> nsis 3.09
please input: y (y/n/m)=> install nsis 3.09 .. ok[ 25%]: compiling.release src\main.cpp
[ 37%]: compiling.release src\main.cpp
[ 50%]: linking.release foo.dll
[ 62%]: linking.release test.exe
packing build\xpack\test\test-windows-x64-v1.0.0.exe
pack ok

test-windows-x64-v1.0.0.exe 就是我们生成的安装包,双击运行它,就能安装我们的二进制文件到指定目录。



增加组件安装

我们还可以给 NSIS 增加组件安装命令,只有当用户选择指定组件的时候,它的安装命令才会被执行。

xpack("test")add_components("LongPath")xpack_component("LongPath")set_default(false)set_title("Enable Long Path")set_description("Increases the maximum path length limit, up to 32,767 characters (before 256).")on_installcmd(function (component, batchcmds)batchcmds:rawcmd("nsis", [[${If} $NoAdmin == "false"; Enable long pathWriteRegDWORD ${HKLM} "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" 1${EndIf}]])end)

这个例子中,我们在里面添加了一个 NSIS 特有的自定义命令,去实现对长路径的支持。

生成自安装包

我们也可以生成基于 shell 脚本的自编译安装包。我们需要配置 runself 打包格式,然后通过 add_sourcefiles 添加需要参与编译安装的源文件。

接着,我们需要自定义 on_installcmd 安装脚本,里面去配置如果编译源码包,我们可以简单的调用一个内置的编译安装脚本文件,也可以直接配置 make install 等编译安装命令。

例如:

xpack("test")set_formats("runself")add_sourcefiles("(src/**)")on_installcmd(function (package, batchcmds)batchcmds:runv("make", {"install"})end)

然后,我们执行 xmake pack 命令,就可以生成一个自安装的 xxx.gz.run 包,默认采用 gzip 压缩。

$ xmake pack
packing build/xpack/test/test-macosx-src-v1.0.0.gz.run
pack ok

我们可以使用 sh 去加载运行它来安装我们的程序。

$ sh ./build/xpack/test/test-macosx-src-v1.0.0.gz.run

我们也可以看一个比较完整的例子:

xpack("xmakesrc")set_formats("runself")set_basename("xmake-v$(version)")set_prefixdir("xmake-$(version)")before_package(function (package)import("devel.git")local rootdir = path.join(os.tmpfile(package:basename()) .. ".dir", "repo")if not os.isdir(rootdir) thenos.tryrm(rootdir)os.cp(path.directory(os.projectdir()), rootdir)git.clean({repodir = rootdir, force = true, all = true})git.reset({repodir = rootdir, hard = true})if os.isfile(path.join(rootdir, ".gitmodules")) thengit.submodule.clean({repodir = rootdir, force = true, all = true})git.submodule.reset({repodir = rootdir, hard = true})endendlocal extraconf = {rootdir = rootdir}package:add("sourcefiles", path.join(rootdir, "core/**|src/pdcurses/**|src/luajit/**|src/tbox/tbox/src/demo/**"), extraconf)package:add("sourcefiles", path.join(rootdir, "xmake/**"), extraconf)package:add("sourcefiles", path.join(rootdir, "*.md"), extraconf)package:add("sourcefiles", path.join(rootdir, "configure"), extraconf)package:add("sourcefiles", path.join(rootdir, "scripts/*.sh"), extraconf)package:add("sourcefiles", path.join(rootdir, "scripts/man/**"), extraconf)package:add("sourcefiles", path.join(rootdir, "scripts/debian/**"), extraconf)package:add("sourcefiles", path.join(rootdir, "scripts/msys/**"), extraconf)end)on_installcmd(function (package, batchcmds)batchcmds:runv("./scripts/get.sh", {"__local__"})end)

它是 xmake 自身源码的安装包配置脚本,更完整的配置可以参考:xpack.lua

这里,它通过调用源码包内置的 ./scripts/get.sh 安装脚本去执行编译安装。

生成源码归档包

另外,我们也可以配置 srczipsrctargz 格式,来生成源码压缩包,它不是完整的安装包,也没有安装命令,仅仅用于源码包分发。

xpack("test")set_formats("srczip", "srctargz")add_sourcefiles("(src/**)")
$ xmake pack
packing build/xpack/test/test-macosx-src-v1.0.0.zip ..
packing build/xpack/test/test-macosx-src-v1.0.0.tar.gz ..
pack ok

生成二进制归档包

我们也可以配置 ziptargz 来生成二进制的压缩包,它会先自动编译所有绑定的 target 目标程序,将所有需要的二进制程序,库文件打包到 zip/tar.gz 格式。

这通常用于制作绿色版的安装包,内部不太任何自动安装脚本,用户需要自己设置 PATH 等环境变量。

xpack("test")set_formats("zip", "targz")add_installfiles("(src/**)")
$ xmake pack
packing build/xpack/test/test-macosx-v1.0.0.zip ..
packing build/xpack/test/test-macosx-v1.0.0.tar.gz ..
pack ok

!> 需要注意的是,打二进制文件到包里,使用的是 add_installfiles 而不是 add_sourcefiles

我们也可以通过 add_targets 去绑定需要安装的 target 目标程序和库。更多详情见下面关于 add_targets 的接口描述。

生成 SRPM 源码安装包

它可以生成 .src.rpm 格式的源码安装包。

我们可以通过配置 add_targets 关联需要构建的目标,在生成的 srpm 包中,它会自动调用 xmake buildxmake install 去构建和安装包。

xpack("test")set_homepage("https://xmake.io")set_license("Apache-2.0")set_description("A cross-platform build utility based on Lua.")set_formats("srpm")add_sourcefiles("(src/**)")add_sourcefiles("./xmake.lua")add_targets("demo")

它会生成类似下面的 spec 文件,然后自动调用 rpmbuild 去生成 .src.rpm 包。

Name:       test
Version:    1.0.0
Release:    1%{?dist}
Summary:    helloLicense:    Apache-2.0
URL:        https://xmake.io
Source0:    test-linux-src-v1.0.0.tar.gzBuildRequires: xmake
BuildRequires: gcc
BuildRequires: gcc-c++%description
A test installer.%prep
%autosetup -n test-1.0.0 -p1%build
xmake build -y test%install
xmake install -o %{buildroot}/%{_exec_prefix} test
cd %{buildroot}
find . -type f | sed 's!^\./!/!' > %{_builddir}/_installedfiles.txt%check%files -f %{_builddir}/_installedfiles.txt%changelog
* Fri Dec 22 2023 ruki - 1.0.0-1
- Update to 1.0.0

我们也可以通过 on_buildcmdon_installcmd 自定义构建和安装脚本。

xpack("test")set_homepage("https://xmake.io")set_license("Apache-2.0")set_description("A cross-platform build utility based on Lua.")set_formats("srpm")add_sourcefiles("(src/**)")add_sourcefiles("./configure")on_buildcmd(function (package, batchcmds)batchcmds:runv("./configure")batchcmds:runv("make")end)on_installcmd(function (package, batchcmds)batchcmds:runv("make", {"install", "PREFIX=%{buildroot}"})end)

生成 RPM 二进制安装包

RPM 包将会直接生成编译好的二进制安装包。xmake 会自动调用 rpmbuild --rebuild 命令去构建 SRPM 包生成它。

而在 XPack 中,我们仅仅只需要配置 set_formats("rpm") 即可支持 rpm 包生成,其他配置与 srpm 包完全一致。

xpack("test")set_formats("rpm")-- TODO

打包命令参数

指定打包格式

如果我们在配置文件中已经使用 set_formats 配置了多个打包格式,那么默认情况下,xmake pack 会自动生成所有这些格式的包。

当然,我们也可以通过 xmake pack --formats=nsis,targz 来选择性指定当前需要打哪些格式的包。

修改打包文件名

我们可以在配置文件中,通过 set_basename() 来修改包名,也可以通过命令行去修改它。

$ xmake pack --basename="foo"
packing build/xpack/test/foo.zip ..
pack ok
指定输出目录

默认的输出目录是在 build 目录下,但我们也可以修改输出的路径。

$ xmake pack -o /tmp/output
禁用自动构建

如果是打 NSIS 等二进制包,xmake pack 会先自动编译所有被绑定的 target 目标文件,然后再去执行打包逻辑。

但是如果我们已经编译过了,不想每次都去编译它,而是直接去打包,可以通过下面的参数禁用自动构建。

$ xmake pack --autobuild=n

接口描述

更多 XPack 打包接口描述见:XPack 打包接口文档。

安装包到本地

默认情况先,通过 add_requires("xxx") 配置的包都会被安装到全局目录,不同项目共用这些包。

而新版本中,我们新增了一个 package.install_locally 策略,可以配置让 xmake 将包安装到当前本地项目目录。

set_policy("package.install_locally", true)

更新日志

新特性

  • 添加 network.mode 策略
  • #1433: 添加 xmake pack 命令去生成 NSIS/zip/tar.gz/srpm/rpm/runself 安装包
  • #4435: 为 UnityBuild 的组模式增加 batchsize 支持
  • #4485: 新增 package.install_locally 策略支持
  • 新增 NetBSD 支持

Changes

  • #4484: 改进 swig 规则
  • 改进 Haiku 支持

Bugs 修复

  • #4372: 修复 protobuf 规则
  • #4439: 修复 asn1c 规则

https://tboox.org/cn/2023/12/15/xmake-update-v2.8.6/

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

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

相关文章

手机软件APP下载类网站Pbootcms模板 游戏软件应用网站源码 模板自适应手机端

手机软件APP下载类网站pbootcms模板 游戏软件应用网站源码 模板自适应手机端 pbootcms内核开发的网站模板,该模板适用于手机APP网站、游戏软件网站等企业, 当然其他行业也可以做,只需要把文字图片换成其他行业的即可; 自适应,同一个后台,数据即时同步,简单适用!附带…

超维空间S2无人机使用说明书——52、使用PID算法进行基于yolo的目标跟踪

引言:在实际工程项目中,为了提高系统的响应速度和稳定性,往往需要采用一定的控制算法进行目标跟踪。这里抛砖引玉,仅采用简单的PID算法进行目标的跟随控制,目标的识别依然采用yolo。对系统要求更高的,可以对…

基于Java在线商城系统设计实现(源码+部署文档+讲解视频)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌🍅 文末获取源码联系 🍅👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

使用YT Config Tools工具导出引脚配置清单至Excel文件

使用YT Config Tool工具导出引脚配置清单至Excel文件 文章目录 使用YT Config Tool工具导出引脚配置清单至Excel文件IntroductionOperations在YTC中导入hello_world样例工程在Pinout Configuration标签页中配置引脚保存源码工程导出Excel文件 Conclusion Introduction YT Conf…

GC6208国产5V摄像机镜头驱动IC ,可用于摄像机,机器人等产品中可替代AN41908

GC6208是一个镜头电机驱动IC摄像机和安全摄像机。该设备集成了一个直流电机驱动器的Iris的PID控制系统,也有两个通道的STM电机驱动器的变焦和对焦控制。 芯片的特点: 内置用于Iris控制器的直流电机驱动器 内置2个STM驱动程序,用于缩放和…

【WPF】使用Behavior以及ValidationRule实现表单校验

文章目录 使用ValidationRule实现检测用户输入EmptyValidationRule 非空校验TextBox设置非空校验TextBox设置非空校验并显示校验提示 结语 使用ValidationRule实现检测用户输入 EmptyValidationRule是TextBox内容是否为空校验,TextBox的Binding属性设置ValidationRu…

华锐视点为广汽集团打造VR汽车在线展厅,打破地域限制,尽享购车乐趣

随着科技的飞速发展,我们正在进入一个全新的时代——元宇宙时代。元宇宙是一个虚拟的世界,它不仅能够模拟现实世界,还能够创造出现实世界无法实现的事物。而汽车行业作为人类生活的重要组成部分,也在积极探索与元宇宙的融合&#…

[数据结构]树与二叉树的性质

文章目录 0.二叉树的形态和基本性质1.完全二叉树的叶子节点个数2.树的叶子节点个数3.线索二叉树4.树和森林和二叉树5.平衡二叉树的最少结点数6.树/二叉树/森林的转换 0.二叉树的形态和基本性质 一棵二叉树具有5中基本形态n个结点可以构造的二叉树种数: C2n-n/n1 一棵树 n个结点…

SpringBoot3 整合Kafka

官网:https://kafka.apache.org/documentation/ 消息队列-场景 1. 异步 2. 解耦 3. 削峰 4. 缓冲 消息队列-Kafka 1. 消息模式 消息发布订阅模式,MessageQueue中的消息不删除,会记录消费者的偏移量 2. Kafka工作原理 同一个消费者组里的消…

Volume Control 2

为游戏添加音乐和音效总是需要一些编码来设置一个系统来控制、显示和保存应用程序的音量设置。 音量控制的设计是为了立即为您设置这些内容,让您有更多时间专注于最重要的事情——制作出色的游戏! 在版本2中,我们对系统进行了重新设计,使其更加模块化、灵活,甚至更易于使用…

工具系列:TimeGPT_(1)获取token方式和初步使用

文章目录 介绍获取Token用法数据的重要要求使用DateTime索引推断频率。 介绍 Nixtla的TimeGPT是一种用于时间序列数据的生成式预训练预测模型。TimeGPT可以在没有训练的情况下,仅使用历史值作为输入,为新的时间序列生成准确的预测。TimeGPT可以用于各种…

ubuntu磁盘管理常用命令

写的不全,后面随时修改。 Linux 磁盘管理常用三个命令为 df、du 和 fdisk。 df(英文全称:disk free):列出文件系统的整体磁盘未使用量du(英文全称:disk used):检查磁盘空…

Bytebase:统一数据库 CI/CD 解决方案 | 开源日报 No.128

bytebase/bytebase Stars: 7.9k License: NOASSERTION Bytebase 是一个数据库 CI/CD 解决方案,为开发人员和 DBA 提供统一的工具来管理不同数据库系统的开发生命周期。其主要功能包括标准化操作流程、SQL 代码审查、GitOps 集成以及数据访问控制等。关键特性和核心…

QT 输入框输入限制 正则表达式限制 整理

在使用 输入数值时,经常遇到限制其范围的需要,比如角太阳高度角范围为[-90,90],经度值范围[-180,180],方位角范围[0,360]。Qt提供了QIntValidator和QDoubleValidator可以限定数值输入范围,如使用QIntValidator限制整数…

TypeScript学习笔记归纳(先做基础梳理,后期不断丰满,持续更新ing)

文章目录 前言 二、TypeScript的优势体现在哪里? 1、执行时间上的区别 2、基础数据类型区别 3、TS优势 三、TypeScript的关键特性 四、TypeScript的类型系统 1、什么是类型注释? 2、类型系统核心 - 常用类型 1) 基本类型&#xff0…

计网03-数据的封装和解封装

数据封装和解封装的过程 实例:有两台电脑 PC1和PC2,PC1要给PC2发送一个文本文件 1、数据的封装过程: 应用层:将原始数据转换成计算机能识别的二进制数传输层:在传输层是有固定的传…

为什么说依赖抽象就变得更加灵活呢?举例

说依赖抽象变得更加灵活的主要原因在于它提供了更大的替换和扩展的空间。让我们通过一个简单的例子来说明: 考虑一个电商系统,其中有一个OrderProcessor类负责处理订单,它依赖于一个PaymentGateway用于处理支付。最初的设计可能如下所示&…

LabVIEW进行激光斑点图像处理与分析

LabVIEW进行激光斑点图像处理与分析 近年来,激光技术的应用日益繁荣。激光光斑的质量评估和分析技术决定了应用效果,对机器视觉、武器装备、光学测量和医疗设备产生深远影响。就具体用途和技术而言,激光光斑的采集和处理至关重要。即插即用的…

渗透测试 | php的webshell绕过方法总结

目录 1.php的异或运算 2.通过获取注释去绕过 3.利用字符的运算符​​​​​​​ 4.通过end函数代替[] 5.通过常量去绕过 6.字符串拼接双美元符 7.通过函数定义绕过 8.通过类定义,然后传参分割 9.多传参方式绕过​​​​​​​ 10.通过get_defined_function…

使用Maven Archetype插件制作项目脚手架(一)

Archetype是一个Maven项目模板工具包。通过Archetype我们可以快速搭建Maven项目。比如我们在ide里面创建项目时,可以选择很多maven内置的Archetype,我们最常用的可能是maven-archetype-quickstart 当然maven提供了能力,让我们自定义项目结构&…