Xmake v2.8.1 发布,大量细节特性改进 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
waruqi

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

  •  
  •   waruqi
    waruqi 2023 年 7 月 11 日 1823 次点击
    这是一个创建于 1016 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 设置
    4 条回复    2023-07-24 15:29:31 +08:00
    asuraa
        1
    asuraa  
       2023 年 7 月 11 日
    跟 premake 有啥区别?
    waruqi
        2
    waruqi  
    OP
       2023 年 7 月 12 日
    @luodaoyi premake 只是个工程生成器。而 xmake 不仅提供工程生成,还自带构建,包管理,分布式编译,缓存。。

    你可以把 Xmake 理解问 Make/Ninja + CMake/Meson/Premake + Vcpkg/Conan + distcc + ccache/sccache 的综合体,他们的大部分特性,xmake 内置都有实现
    Approximate
        3
    Approximate  
       2023 年 7 月 18 日
    最近装了下,在 win10 版本下在 vscode 插件没有作用,打开一个空文件目录时,无论是用面板的 xmake:create project 或者是 xmake:newfiles 都弹不出提示新建 xmake.lua 的提示,xmake 命令行是能用的,请问是插件不兼容吗?是否要回退 2.7.2 版本
    waruqi
        4
    waruqi  
    OP
       2023 年 7 月 24 日
    @Approximate vscode 插件跟 xmake 命令行没有任何关系,xmake 不管是哪个版本,都不会影响 xmake vscode 插件 。。你可以试试最新插件,不行就到插件那边提 issues
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5589 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 07:03 PVG 15:03 LAX 00:03 JFK 03:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86