Xmake v2.8.1 发布,大量细节特性改进

news2024/11/25 9:40:20

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

新特性介绍

Windows 长路径问题改进

windows 的长路径限制一直是一个大问题,嵌套层级太深的工程,在读写文件的时候,都有可能失败,这会影响 xmake 的可用性和体验。

尽管,xmake 已经提供各种措施也避免这个问题,但是偶尔还是会受到一些限制。而在这个版本中,我们改进了安装器,提供一个安装选项,让用户选择性开启长路径支持。

这需要管理员权限,因为它需要写注册表。

WriteRegDWORD ${HKLM} "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" 1

用户可以自己决定,是否需要开启它。

感谢 @A2va 的贡献。

zypper 包管理器支持

新增 OpenSUSE 的 zypper 包管理器支持,可以直接通过 zypper 自动下载安装,并集成它提供的包。

感谢 @iphelf 的贡献。

add_requires("zypper::libsfml2 2.5")

改进 msbuild 包安装

一些第三方包,没有使用 cmake 维护,仅仅提供了 vcproj 的工程文件,如果我们把它做成包,需要使用 tools.msbuild 模块去编译安装它。

但是 vcproj 的 vs 版本如果很老,就需要升级它,否则编译会失败。

因此我们改进了 tools.msbuild 模块,提供自动升级 vcproj 的功能,只需要指定下需要升级的 vcproj/sln 文件即可。

package("test")
    on_install(function (package)
        import("package.tools.msbuild").build(package, configs, {upgrade={"wolfssl64.sln", "wolfssl.vcxproj"}})
    end)

改进 protobuf 支持 grpc

我们改进了对 protobuf 的支持,可以同时支持上 grpc_cpp_plugin。

add_rules("mode.debug", "mode.release")
add_requires("protobuf-cpp")
add_requires("grpc", {system = false})

target("test")
    set_kind("binary")
    set_languages("c++17")
    add_packages("protobuf-cpp")
    add_packages("grpc")
    add_rules("protobuf.cpp")
    add_files("src/*.cpp")
    add_files("src/test.proto", {proto_rootdir = "src", proto_grpc_cpp_plugin = true})
    add_files("src/subdir/test2.proto", {proto_rootdir = "src"})

完整例子见:protobuf_grpc_cpp_plugin

add_links 支持库路径

通常 add_links 需要配合 add_linkdirs 使用,才能让链接器找到指定目录下的库文件。

但是有时候配置不对,或者不同路径下库重名,就容易找错库文件。而现在 add_links 可以支持直接设置库文件路径,避免隐式搜索。

也可以用于显式指定链接 so/a 库。

下面的几种写法都是支持的:

add_links("foo")
add_links("libfoo.a")
add_links("libfoo.so")
add_links("/tmp/libfoo.a")
add_links("/tmp/libfoo.so")
add_links("foo.lib")

Objc/Objc++ 头文件预编译支持

之前的版本,我们如果使用 set_pcxxheader 设置 c++ 头文件预编译,会同时影响 objc 代码。

因此如果 C++/ObjC++ 代码混合编译,用了预编译头,就会遇到编译问题。

Objective-C was disabled in PCH file but is currently enabled

这是因为,预编译头的编译,也是需要指定语言的 -x c++-header, -x objective-c++-header,pch 文件不能混用。

因此,我们新增了 set_pmheaderset_pmxxheader 接口,单独设置 objc/objc++ 的预编译头文件,跟 C/C++ 预编译头互不冲突。

但用法完全一样。

target("test")
    set_pmxxheader("header.h")

完整例子见:Objc Precompiled Header Example

改进 Conan 2.0 支持

上个版本,我们初步支持了 Conan 2.0,但是还遇到了一些细节问题,这个版本我们持续做了改进,比如改进对 vs_runtime 设置问题。

更新 lua 运行时

最近 Lua 已经发布了 5.4.6 版本,我们对 xmake 中内置的 Lua 运行时也做了升级,跟上游保持同步。

更新日志

新特性

  • #3821: windows 安装器添加长路径支持选项
  • #3828: 添加 zypper 包管理器支持
  • #3871: 改进 tools.msbuild 支持对 vsproj 进行自动升级
  • #3148: 改进 protobuf 支持 grpc
  • #3889: add_links 支持库路径添加
  • #3912: 添加 set_pmxxheader 去支持 objc 预编译头
  • add_links 支持库文件路径

改进

  • #3752: 改进 windows 上 os.getenvs 的获取
  • #3371: 改进 tools.cmake 支持使用 ninja 去构建 wasm 包
  • #3777: 改进从 pkg-config 中查找包
  • #3815: 改进 tools.xmake 支持为 windows 平台传递工具链
  • #3857: 改进生成 compile_commands.json
  • #3892: 改进包搜索,支持从描述中找包
  • #3916: 改进构建 swift 程序,支持模块间符号调用
  • 更新 lua 运行时到 5.4.6

Bugs 修复

  • #3755: 修复 find_tool 从 xmake/packages 中查找程序
  • #3787: 修复从 conan 2.x 中使用包
  • #3839: 修复 conan 2.x 包的 vs_runtime 设置

https://tboox.org/cn/2023/07/11/xmake-update-v2.8.1/

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

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

相关文章

hbuilderX 的使用

1 创建nui-app 点击左上角的文件点击新建-》项目,将信息填写完整点击确定 2 uni-modules 插件管理 通过 uni-app 插件市场 实现 uni-modules的插件安装,在插件市场搜索对应的插件名称,点击进去,点使用Hbuild’erX导入插件。详细…

Java 动态规划 64. 最小路径和

代码展示: dp[i][j]Math.min(dp[i-1][j],dp[i][j-1])grid[i-1][j-1]; 该题可以通过动态规划解决,动态规划的题根据以下的5大步骤便可轻松解决 1.状态表示 题目要求我们计算从起点到最后一个位置的最小路径和,我们可以创建一个dp表&#xff0c…

算法笔记: 相似性度量

1 欧氏距离 1.1 标准化欧氏距离 先将数据标准化 (减去的均值两两抵消) 2 曼哈顿距离 又称为城市街区距离 3 切比雪夫距离 等价形式 4 闵可夫斯基距离 minkowski 当p1时,就是曼哈顿距离 当p2时,就是欧氏距离 当p→∞时&#xf…

WSL安装与使用(Ubuntu22.04)

文章目录 概要WSL介绍WSL安装安装环境安装方式一:命令行安装(不推荐,可能出现奇怪的问题)安装方式二:通过控制面板安装 WSL 安装Ubuntu22.04(通过Microsoft Store)Ubuntu更换镜像源进入Ubuntu更换镜像源 Ubuntu安装Doc…

Spark-用IDEA编写wordcount demo

配置 Spark版本&#xff1a;3.2.0 Scala版本&#xff1a;2.12.12 JDK&#xff1a;1.8 Maven&#xff1a;3.6.3 pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&quo…

小红书笔记为什么没有流量,归纳总结

我们都知道小红书是一个内容分享类平台。小红书笔记是平台的主要内容形式。但有时候&#xff0c;我们撰写了一篇笔记&#xff0c;却无法搜索到&#xff0c;今天为大家分享下小红书笔记为什么没有流量&#xff0c;归纳总结&#xff01; 一、小红书笔记不被收录的原因 当我们精心…

Java 递归和非递归方式实现二叉树的前、中、后序遍历

文章目录 Node结点定义前序遍历递归方式实现非递归方式实现图文解读 最终结果 中序遍历递归方式实现非递归方式实现图文解读 最终结果 后序遍历递归方式实现非递归方式实现图文解读 最终结果 结语 Node结点定义 private static class Node {public int value;public Node left;…

Vue子组件向父组件传递消息

父子组件之间的通信&#xff1a;props与emit 通常提到props&#xff0c;都会想到的是父组件给子组件传值&#xff1b;提到emit为子组件向父组件发送消息&#xff0c;但其实&#xff0c;props也可以使子组件向父组件传递消息 方式为在父组件中通过为子组件绑定属性&#xff0c…

Docker之centos7环境离线安装

一、docker简介 Docker是一个开源的应用容器引擎&#xff0c;可以让开发者将应用及其依赖打包在一个虚拟的容器中&#xff0c;方便地部署、移植、升级和管理。Docker可以运行在Linux、Windows和MacOS等操作系统上&#xff0c;并且可以在不同的平台之间进行交互和迁移。Docker的…

ES 性能调优,这可能是全网最详细的 Elasticsearch 性能调优指南

文章目录 1、通用优化策略1.1 通用最小化法则1.2 职责单一原则1.3 其他 2、写性能调优2.1 基本原则2.2 优化手段2.2.1 增加 flush 时间间隔&#xff0c;2.2.2 增加refresh_interval的参数值2.2.3 增加Buffer大小&#xff0c;2.2.4 关闭副本2.2.5 禁用swap2.2.6 使用多个工作线程…

小奇猫物语之产品经理篇(1)

小奇猫物语之产品经理篇&#xff08;1&#xff09; 喵喵提示&#xff1a;看到标题后面的&#xff08;1&#xff09;了嘛&#xff1f;没错&#xff01;关于产品经理这方面&#xff0c;小奇会出一个系列哟&#xff0c;感谢各位铲屎官们的观看&#xff0c;欢迎提出指正和批评哦&a…

Springboot设置并访问静态资源目录

目录​​​​​​​ 静态文件 application设置方法 配置详解 编写配置 优缺点 设置配置类方法 配置详解 编写配置 优缺点 总结 静态文件 静态资源&#xff0c;一般是网页端的&#xff1a;HTML文件、JavaScript文件和图片。尤其是设置图片的静态资源&#xff0c;尤其重…

浅谈消防应急照明和疏散指示系统在建筑物中的设计与应用

安科瑞 华楠 摘 要&#xff1a;在消防安全意识逐渐提高的背景下&#xff0c;安全疏散技术也取得了不断发展。基于这种认识&#xff0c;本文对建筑物消防应急照明和疏散指示系统进行了介绍&#xff0c;然后对系统设计与应用方法展开了探讨&#xff0c;为关注这一话题的人们提供…

Linux--查看常驻进程:ps

进程分为瞬时进程和常驻进程 瞬时进程&#xff1a;瞬间完成从加载到内存、显示在输出设备、退出过程 int main() {printf("hello world!\n");return 0; } 常驻进程&#xff1a;一直在内存中 int main() {while (1){printf("hello world!\n");sleep(1);…

Java 动态规划 Leetcode 931. 下降路径最小和

代码展示: class Solution {public int minFallingPathSum(int[][] matrix) {int nmatrix.length;//创建dp数组int[][]dpnew int[n1][n2];//初始化for(int i1;i<n;i){dp[i][0]dp[i][n1]Integer.MAX_VALUE;}//填充数组for(int i1;i<n;i){for(int j1;j<n;j){dp[i][j]Ma…

【网络安全】Burpsuite v2021.12.1安装激活配置快捷启动

Burpsuite v2021.12.1安装&激活&配置&快捷启动 一、下载激活包二、配置JDK11三、启动激活 一、下载激活包 需要下载的内容&#xff1a; Burp Suite jar包JDK11激活jar包汉化jar包 下面是已经下载好的&#xff0c;可以直接使用 BurpSuite网盘下载链接 提取码&#…

单键触摸开关/双键触摸式照明灯/触摸式延时照明灯电路设计

单键触摸开关 触摸式照明开关是一种非常实用的电子开关&#xff0c;用手触摸一下导电片&#xff0c;就能实现开关动作 &#xff0c;使用方便可靠、电路简单、性能稳定、寿命长、节电效果明显。适合于爱好者自制。 一、电路工作原理 电路原理如图 21 所示。 接通电源后&#…

RabbitMQ ---- Hello World

RabbitMQ ---- Hello World 1. 依赖2. 消息生产者3. 信息消费者 本节使用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者。 1. 依赖 <!--指定 jdk 编译版本--><build><plugins><plugin><groupId>org.apache.maven.plu…

Scratch 随机平台跳跃

Scratch 随机平台跳跃 本程序转换为HTML后运行。程序在随机位置生成红、蓝平台各13个&#xff0c;通过W、A、S、D键控制角色移动&#xff0c;移动时把标记下落的变量设为1。该变量为1时角色下落&#xff0c;碰到边缘或平台时结束下落&#xff0c;变量设为0。这种方案的缺陷是角…

Databricks推出AI模型SDK,能自动生成SQL代码

近日一款AI模型的发布&#xff0c;或将有助于提高开发效率。据悉&#xff0c;最近Databricks发布大数据分析平台Spark所用的 AI 模型 SDK&#xff0c;开发者写代码时&#xff0c;可用英文下指令&#xff0c;编译器就会将英文指令转换为 PySpark 或 SQL 语言代码&#xff0c;以提…