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

新特性介绍

Verilog 仿真程序支撑

iVerilog 仿真器

经过 add_requires("iverilog") 装备,咱们能够主动拉取 iverilog 东西链包,然后运用 set_toolchains("@iverilog") 主动绑定东西链来编译工程。

add_requires("iverilog")
target("hello")
    add_rules("iverilog.binary")
    set_toolchains("@iverilog")
    add_files("src/*.v")
设置笼统装备
add_requires("iverilog")
target("hello")
    add_rules("iverilog.binary")
    set_toolchains("@iverilog")
    add_files("src/*.v")
    add_defines("TEST")
    add_includedirs("inc")
    set_languages("v1800-2009")

咱们能够经过 set_languages("v1800-2009") 来设置切换 Verilog 的言语规范。

现在支撑的一些取值和映射关系如下:

["v1364-1995"] = "-g1995"
["v1364-2001"] = "-g2001"
["v1364-2005"] = "-g2005"
["v1800-2005"] = "-g2005-sv"
["v1800-2009"] = "-g2009"
["v1800-2012"] = "-g2012"
设置自界说 flags
add_requires("iverilog")
target("hello")
    add_rules("iverilog.binary")
    set_toolchains("@iverilog")
    add_files("src/*.v")
    add_values("iverilogs.flags", "-DTEST")
构建工程
$ xmake
checking for iverilog ... iverilog
checking for vvp ... vvp
[ 50%]: linking.iverilog hello.vvp
[100%]: build ok!
运转程序
$ xmake run
hello world!
LXT2 info: dumpfile hello.vcd opened for output.
src/main.v:6: $finish called at 0 (1s)

更多完好比如:iVerilog Examples

Verilator 仿真器

经过 add_requires("verilator") 装备,咱们能够主动拉取 verilator 东西链包,然后运用 set_toolchains("@verilator") 主动绑定到东西链来编译工程。

add_requires("verilator")
target("hello")
    add_rules("verilator.binary")
    set_toolchains("@verilator")
    add_files("src/*.v")
    add_files("src/*.cpp")

verilator 工程,咱们需求一个额定的 sim_main.cpp 文件参加编译,作为程序的入口代码。

#include "hello.h"
#include "verilated.h"
int main(int argc, char** argv) {
    VerilatedContext* contextp = new VerilatedContext;
    contextp->commandArgs(argc, argv);
    hello* top = new hello{contextp};
    while (!contextp->gotFinish()) { top->eval(); }
    delete top;
    delete contextp;
    return 0;
}
设置笼统装备
add_requires("verilator")
target("hello")
    add_rules("verilator.binary")
    set_toolchains("@verilator")
    add_files("src/*.v")
    add_defines("TEST")
    add_includedirs("inc")
    set_languages("v1800-2009")

咱们能够经过 set_languages("v1800-2009") 来设置切换 Verilog 的言语规范。

现在支撑的一些取值和映射关系如下:

-- Verilog
["v1364-1995"] = "+1364-1995ext+v",
["v1364-2001"] = "+1364-2001ext+v",
["v1364-2005"] = "+1364-2005ext+v",
-- SystemVerilog
["v1800-2005"] = "+1800-2005ext+v",
["v1800-2009"] = "+1800-2009ext+v",
["v1800-2012"] = "+1800-2012ext+v",
["v1800-2017"] = "+1800-2017ext+v",
设置自界说 flags
add_requires("verilator")
target("hello")
    add_rules("verilator.binary")
    set_toolchains("@verilator")
    add_files("src/*.v")
    add_files("src/*.cpp")
    add_values("verilator.flags", "--trace", "--timing")
构建工程
$ xmake
[  0%]: compiling.verilog src/main.v
[ 15%]: cache compiling.release /Users/ruki/.xmake/packages/v/verilator/2023.1.10/cd2268409c1d44799288c7759b3cbd56/share/verilator/include/verilated.cpp
[ 15%]: cache compiling.release build/.gens/hello/macosx/x86_64/release/rules/verilator/hello___024root__Slow.cpp
[ 15%]: cache compiling.release build/.gens/hello/macosx/x86_64/release/rules/verilator/hello___024root__DepSet_h9053a130__0__Slow.cpp
[ 15%]: cache compiling.release build/.gens/hello/macosx/x86_64/release/rules/verilator/hello.cpp
[ 15%]: cache compiling.release /Users/ruki/.xmake/packages/v/verilator/2023.1.10/cd2268409c1d44799288c7759b3cbd56/share/verilator/include/verilated_threads.cpp
[ 15%]: cache compiling.release build/.gens/hello/macosx/x86_64/release/rules/verilator/hello__Syms.cpp
[ 15%]: cache compiling.release build/.gens/hello/macosx/x86_64/release/rules/verilator/hello___024root__DepSet_h07139e86__0.cpp
[ 15%]: cache compiling.release src/sim_main.cpp
[ 15%]: cache compiling.release build/.gens/hello/macosx/x86_64/release/rules/verilator/hello___024root__DepSet_h9053a130__0.cpp
[ 84%]: linking.release hello
[100%]: build ok!
运转程序
$ xmake run
ruki-2:hello ruki$ xmake run
hello world!
- src/main.v:4: Verilog $finish

更多完好比如:Verilator

支撑 C++ Module 分发

非常感谢 Arthapz 在新版本中继续帮助改善了 xmake 对 C++ Modules 的支撑。

现在,咱们能够将 C++ Modules 做成包进行分发,然后在其他项目中进行快速集成和复用。

它是基于 p2473r1 中对模块分发的设计草案做的一个原型完成。

制造分发 C++ Modules 包

咱们先运用 xmake.lua 保护模块的构建,并经过指定 {install = true},来告诉 xmake 哪些模块文件需求装置对外分发。

add_rules("mode.release", "mode.debug")
set_languages("c++20")
target("foo")
    set_kind("static")
    add_files("*.cpp")
    add_files("*.mpp", { install = true })

然后,咱们把它做成包,能够提交到 xmake-repo 库房,当然也能够直接做成本地包,或者私有库房包。

这儿,为了便利测验验证,咱们只是经过 set_sourcedir 将它做成本地包。

package("foo")
    set_sourcedir(path.join(os.scriptdir(), "src"))
    on_install(function(package)
        import("package.tools.xmake").install(package, {})
    end)

集成 C++ Modules 包

然后,咱们经过 add_requires("foo") 的包集成接口,对 C++ Modules 包进行快速集成运用。

因为 foo 的模块包,咱们放在私有库房中界说,所以咱们经过 add_repositories("my-repo my-repo") 引进自己的包库房。

假如,包现已提交到 xmake-repo 官方库房,就不需求额定装备它。

add_rules("mode.release", "mode.debug")
set_languages("c++20")
add_repositories("my-repo my-repo")
add_requires("foo", "bar")
target("packages")
    set_kind("binary")
    add_files("src/*.cpp")
    add_packages("foo", "bar")
    set_policy("build.c++.modules", true)

集成好包后,咱们就能够履行 xmake 指令,一键下载、编译、集成 C++ Modules 包来运用。

$ xmake
checking for platform ... linux
checking for architecture ... x86_64
note: install or modify (m) these packages (pass -y to skip confirm)?
in my-repo:
  -> foo latest
  -> bar latest
please input: y (y/n/m)
  => install bar latest .. ok
  => install foo latest .. ok
[  0%]: generating.module.deps src/main.cpp
[  0%]: generating.module.deps /mnt/xmake/tests/projects/c++/modules/packages/build/.packages/b/bar/latest/4e0143c97b65425b855ad5fd03038b6a/modules/bar/bar.mpp
[  0%]: generating.module.deps /mnt/xmake/tests/projects/c++/modules/packages/build/.packages/f/foo/latest/4e0143c97b65425b855ad5fd03038b6a/modules/foo/foo.mpp
[ 14%]: compiling.module.release bar
[ 14%]: compiling.module.release foo
[ 57%]: compiling.release src/main.cpp
[ 71%]: linking.release packages
[100%]: build ok!

注:每个包装置后,会在包途径下,存储保护模块的 meta-info 文件,这是 p2473r1.pdf 中约好的一种格局规范,或许它不是最终的规范,但这并不影响咱们现在去运用模块的分发。

$ cat ./build/.packages/f/foo/latest/4e0143c97b65425b855ad5fd03038b6a/modules/foo/foo.mpp.meta-info
{"_VENDOR_extension":{"xmake":{"name":"foo","file":"foo.mpp"}},"definitions":{},"include_paths":{}}

完好的比如工程见:C++ Modules 包分发比如工程

支撑 C++23 Std Modules

Arthapz 也帮助改善了对 C++23 Std Modules 的支撑。

现在三个编译器对它的支撑发展:

Msvc

最新 Visual Studio 17.5 preview 现已支撑,而且非规范的 ifc std modules 将被抛弃。

关于规范的 C++23 std modules,咱们是这么引进的。

import std;

而关于 ifc std modules,咱们需求这么写:

import std.core;

它不是 C++23 规范,只是 msvc 供给,对其他编译器并不兼容,以后新版本 msvc 中也会逐步抛弃。
因而新版本 Xmake 将只是 C++23 std modules,不再支撑抛弃的 ifc std modules。

Clang

现在最新的 clang 似乎也还没彻底支撑 C++23 std modules,当时仍是 draft patch 状况,#D135507。

但是,Xmake 也对它进行了支撑,假如咱们想要尝鲜,能够自行合入这个 patch,然后运用 xmake 来测验。

别的,低版本的 clang 也有对非规范的 std modules 做了实验性支撑。

咱们仍是能够在低版本 clang 中尝试性运用 xmake 来构建 std modules,虽然它或许还只是个玩具(会遇到很多问题)。

相关评论见:#3255

Gcc

现在还不支撑。

Xrepo 主动补全支撑

之前,咱们只是支撑 xmake 指令的不全,新版本中,咱们还支撑了 xrepo install 指令的不全,
能够主动查找 xmake-repo 库房的包,来不全咱们的装置指令。

非常感谢 @glcraft 的奉献。

$ xrepo install libp
libpaper          libpfm            libpng            libpqxx           libpthread-stubs
libpcap           libplist          libpq             libpsl

更新内容

新特性

  • #3228: C++ modules 的装置发布,以及从包中导入 C++ modules 支撑
  • #3257: 增加对 iverilog 和 verilator 的支撑
  • 支撑 xp 和 vc6.0
  • #3214: xrepo install 的主动补全支撑

改善

  • #3255: 改善 clang libc++ 模块支撑
  • 支撑运用 mingw 编译 xmake
  • 改善 xmake 在 win xp 上的兼容性
  • 假如外部依靠被启用,切换 json 模块到纯 lua 完成,移除对 lua-cjson 的依靠

Bugs 修正

  • #3229: 修正 vs2015 下找不到 rc.exe 问题
  • #3271: 修正支撑带有空格的宏界说
  • #3273: 修正 nim 链接错误
  • #3286: 修正 compile_commands 对 clangd 的支撑

tboox.org/cn/2023/01/…