关于c++:xmake-v264-发布大量包管理特性改进

7次阅读

共计 4303 个字符,预计需要花费 11 分钟才能阅读完成。

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

新个性介绍

更灵便的包扩大

当初,咱们能够通过 set_base 接口去继承一个已有的包的全副配置,而后在此基础上重写局部配置。

这通常在用户本人的我的项目中,批改 xmake-repo 官网仓库的内置包比拟有用,比方:修复改 urls,批改版本列表,装置逻辑等等。

例如,批改内置 zlib 包的 url,切到本人的 zlib 源码地址。

package("myzlib")
    set_base("zlib")
    set_urls("https://github.com/madler/zlib.git")
package_end()

add_requires("myzlib", {system = false, alias = "zlib"})

target("test")
    set_kind("binary")
    add_files("src/*.c")
    add_packages("zlib")

咱们也能够用来单纯增加一个别名包。

package("onetbb")
    set_base("tbb")

咱们能够通过 add_requires("onetbb") 集成装置 tbb 包,只是包名不同而已。

包治理反对工具链切换

之前,咱们限度了只能在 cross 平台下切换包装置的工具链,新版本中,咱们能够反对更多平台下,对工具链的切换。

例如:

$ xrepo install --toolchains=clang zlib

咱们能够在 linux 等平台上,疾速切换到 clang 工具链编译装置 zlib 库。

咱们也能够在 xmake.lua 的配置文件中去切换他们。

add_requires("zlib", {configs = {toolchains = "gcc-11"}})

不同的工具链装置的 zlib 包,会被别离存储在不同目录,互不烦扰,不会存在编译器差别导致的链接兼容问题。

内置的包虚拟环境

Xrepo 命令之前曾经很好的反对了包虚拟环境治理,xrepo env shell,然而对于简单的包环境,还是须要用户本人配置一个 xmake.lua 文件,用于治理本人的包环境。

例如,咱们须要一个罕用的开发环境 shell,默认带有 cmake, python 和 vs/autoconf 等罕用的开发工具链,咱们须要本人起一个配置文件 devel.lua。

add_requires("cmake")
add_requires("python")
if is_host("linux", "bsd", "macosx") then
    add_requires("pkg-config", "autoconf", "automake", "libtool")
elseif is_host("windows") then
    set_toolchains("msvc")
end

而后,执行上面的命令去导入到全局配置。

$ xrepo env --add devel.lua

这样,咱们能够通过上面的命令,去加载 shell 绑定这个环境:

$ xrepo env -b devel shell
> cmake --version
cmake version 3.19.3

而在新版本中,咱们内置了一些罕用的环境,能够通过 xrepo env -l 查看:

$ xrepo env -l
  - msvc
  - llvm-mingw
  - llvm
  - mingw-w64
  - devel
  - python3
  - depot_tools
  - python2

其中 devel 也在外面,所以,咱们只须要执行 xrepo env -b devel shell 就能够带起一个 devel 开发环境,而不须要本人配置它们。

像 python, msvc 等也都是一些比拟罕用的环境,都能够间接应用。

当然,咱们也反对长期在本地创立一个 xmake.lua 来配置加载包环境,而不搁置到全局配置中去。

自定义安装包下载

咱们能够通过新增的 on_download 接口,自定义包的下载逻辑,通常用不到,应用 Xmake 的内置下载就足够了。

如果用户自建公有仓库,对包的下载有更简单的鉴权机制,非凡解决逻辑,那么能够重写外部的下载逻辑来实现。

on_download(function (package, opt)
    -- download packages:urls() to opt.sourcedir
end)

opt 参数外面,能够获取到下载包的目标源码目录 opt.sourcedir,咱们只须要从 package:urls() 获取到包地址,下载下来就能够了。

而后,依据须要,增加一些自定义的解决逻辑。另外,本人能够增加下载缓存解决等等。

ASN.1 程序构建反对

ASN.1 程序,须要借助 ASN.1 Compiler 去生成相干的 .c 文件参加我的项目编译。

而 Xmake 内置提供了 add_rules("asn1c") 规定去解决 .c 文件生成,add_requires("asn1c") 主动拉取集成 ASN.1 编译器工具。

上面是一个根底的配置例子:

add_rules("mode.debug", "mode.release")
add_requires("asn1c")

target("test")
    set_kind("binary")
    add_files("src/*.c")
    add_files("src/*.asn1")
    add_rules("asn1c")
    add_packages("asn1c")

具体见 残缺例子工程。

反对全平台构建 Swift 程序

之前,Xmake 仅反对 macOS 下借助 Xcode 工具链实现对 Swift 程序的构建,新版本中,咱们也进行了改良,能够独立应用 swift 工具链,反对在 linux/windows 上构架 swift 程序,用法跟之前雷同。

反对指定符号列表导出

在之前的版本中,咱们提供了 utils.symbols.export_all 对 windows 的 dll 库实现主动的残缺符号导出。

这只管很不便,但只能反对 windows 程序,并且全量导出对生成的 dll 大小不好管制,有可能会存在不少基本不须要的外部符号被导出。

而,咱们新版本提供的 utils.symbols.export_list 规定,能够在 xmake.lua 外面间接定义导出的符号列表,例如:

target("foo")
    set_kind("shared")
    add_files("src/foo.c")
    add_rules("utils.symbols.export_list", {symbols = {
        "add",
        "sub"}})

或者,在 *.export.txt 文件中增加导出的符号列表。

target("foo2")
    set_kind("shared")
    add_files("src/foo.c")
    add_files("src/foo.export.txt")
    add_rules("utils.symbols.export_list")

残缺的工程例子见:导出符号例子

通过指定符号导出,咱们能够使得生成的动静库尽可能的小,无关的外部符号齐全不去导出它们,另外这个规定反对 linux, macOS 和 windows,更加的通用。

它外部会主动应用 .def, version scripts 和 --exported_symbols_list 去解决符号导出。

内置反对 linker scripts

新版中,咱们也内置了 对 linker scripts 和 version scripts 文件的反对,咱们能够应用 add_files 间接增加它们,而不须要配置 add_ldflags("-Txxx.lds")

以后反对 .ld.lds 作为 linker scripts 配置文件来增加:

add_rules("mode.debug", "mode.release")

target("test")
    add_deps("foo")
    set_kind("binary")
    add_files("src/main.c")
    add_files("src/main.lds")

咱们也反对 .ver, .map 后缀文件作为 version script 来增加。

target("foo")
    set_kind("shared")
    add_files("src/foo.c")
    add_files("src/foo.map")

foo.map 文件内容如下:

{
    global:
        foo;

    local:
        *;
};

更新内容

新个性

  • #2011: 反对继承和部分批改官网包,例如对现有的包更换 urls 和 versions
  • 反对在 sparc, alpha, powerpc, s390x 和 sh4 上编译运行 xmake
  • 为 package() 增加 on_download 自定义下载
  • #2021: 反对 Linux/Windows 下构建 Swift 程序
  • #2024: 增加 asn1c 反对
  • #2031: 为 add_files 减少 linker scripts 和 version scripts 反对
  • #2033: 捕捉 ctrl-c 去打印以后运行栈,用于调试剖析卡死问题
  • #2059: 增加 xmake update --integrate 命令去整合 shell
  • #2070: 增加一些内置的 xrepo env 环境配置
  • #2117: 反对为任意平台传递工具链到包
  • #2121: 反对导出指定的符号列表,可用于缩小动静库的大小

改良

  • #2036: 改良 xrepo 反对从配置文件批量安装包,例如:xrepo install xxx.lua
  • #2039: 改良 vs generator 的 filter 目录展现
  • #2025: 反对为 phony 和 headeronly 指标生成 vs 工程
  • 优化 vs 和 codesign 的探测速度
  • #2077: 改良 vs 工程生成器去反对 cuda

Bugs 修复

  • #2005: 修复 path.extension
  • #2008: 修复 windows manifest 文件编译
  • #2016: 修复 vs project generator 里,对象文件名抵触导致的编译失败
正文完
 0