V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
waruqi
V2EX  ›  程序员

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

  •  
  •   waruqi ·
    waruqi · 291 天前 · 776 次点击
    这是一个创建于 291 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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  
       291 天前
    跟 premake 有啥区别?
    waruqi
        2
    waruqi  
    OP
       290 天前
    @luodaoyi premake 只是个工程生成器。而 xmake 不仅提供工程生成,还自带构建,包管理,分布式编译,缓存。。

    你可以把 Xmake 理解问 Make/Ninja + CMake/Meson/Premake + Vcpkg/Conan + distcc + ccache/sccache 的综合体,他们的大部分特性,xmake 内置都有实现
    Approximate
        3
    Approximate  
       284 天前
    最近装了下,在 win10 版本下在 vscode 插件没有作用,打开一个空文件目录时,无论是用面板的 xmake:create project 或者是 xmake:newfiles 都弹不出提示新建 xmake.lua 的提示,xmake 命令行是能用的,请问是插件不兼容吗?是否要回退 2.7.2 版本
    waruqi
        4
    waruqi  
    OP
       278 天前
    @Approximate vscode 插件跟 xmake 命令行没有任何关系,xmake 不管是哪个版本,都不会影响 xmake vscode 插件 。。你可以试试最新插件,不行就到插件那边提 issues
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   898 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:05 · PVG 04:05 · LAX 13:05 · JFK 16:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.