xmake v2.3.4 发布, 更加完善的工具链支持

为了让xmake更好得支持交叉编译,这个版本我重构了整个工具链,使得工具链的切换更加的方便快捷,而且如今用户能够很方便地在xmake.lua中扩展本身的工具链。mysql

关于平台的支持上,咱们新增了对*BSD系统的支持,另外,此版本还新增了一个ninja主题风格,实现相似ninja的编译进度显示,例如:linux

新特性介绍

工具链改进

工具链和平台彻底分离

以前的版本,平台和工具链绑定的过于紧密,例如xmake f -p windows 平台,默认只能使用msvc的编译,想要切到clang或者其余编译器,就只能走交叉编译平台:xmake f -p crossgit

可是这样的话,一些windows平台特有的设置就丢失了,并且用户也无法使用if is_plat("windows") then来判断windows平台作特定的设置。github

其实平台和工具链是彻底能够独立开来的,新版本通过重构后,即便是windows平台以及其余任何平台,也能够方便快速的切换到clang, llvm等其余工具链。sql

$ xmake f -p windows --toolchain=clang
复制代码

内置工具链

虽然xmake的交叉编译配置支持全部工具链,也提供必定程度的智能分析和工具链探测,但通用方案多少对特定工具链支持须要追加各类额外的配置,例如额外传递一些--ldflags=, --cxflags=参数什么的。macos

而新版本xmake内置了一些经常使用工具链,能够省去交叉编译工具链复杂的配置过程,只须要传递工具链名到--toolchain=xxx便可。windows

切换到llvm工具链:api

$ xmake f -p cross --toolchain=llvm --sdk="C:\Program Files\LLVM"
$ xmake
复制代码

切换到GNU-RM工具链:xcode

$ xmake f -p cross --toolchain=gnu-rm --sdk=/xxx/cc-arm-none-eabi-9-2019-q4-major
$ xmake
复制代码

就能够快速切换的指定的交叉编译工具链,对于内置的工具链,能够省去大部分配置,一般只须要--toolchain=--sdk=便可,其余的配置都会自动设置好,确保编译正常。bash

那xmake还支持哪些内置工具链呢?咱们能够经过下面的命令查看:

$ xmake show -l toolchains
xcode         Xcode IDE
vs            VisualStudio IDE
yasm          The Yasm Modular Assembler
clang         A C language family frontend for LLVM
go            Go Programming Language Compiler
dlang         D Programming Language Compiler
sdcc          Small Device C Compiler
cuda          CUDA Toolkit
ndk           Android NDK
rust          Rust Programming Language Compiler
llvm          A collection of modular and reusable compiler and toolchain technologies
cross         Common cross compilation toolchain
nasm          NASM Assembler
gcc           GNU Compiler Collection
mingw         Minimalist GNU for Windows
gnu-rm        GNU Arm Embedded Toolchain
envs          Environment variables toolchain
fasm          Flat Assembler
复制代码

工具链的同步切换

新版本xmake还支持工具链的完整同步切换,这个是什么意思呢?

好比,咱们要从默认的gcc切换到clang编译,可能须要切一些工具集,xmake f --cc=clang --cxx=clang --ld=clang++ --sh=clang++,由于编译器切了,对应的连接器,静态库归档器什么的都得同时切才行。

这么挨个切一边,确实很蛋疼,做者本人也是受不了了,因此重构工具链的时候,这块也重点改进了下,如今只须要:

$ xmake f --toolchain=clang
$ xmake
复制代码

就能够彻底把全部clang工具集总体切过去,那如何从新切回gcc呢,也很方便:

或者

$ xmake f --toolchain=gcc
$ xmake
复制代码

自定义工具链

另外,咱们如今也能够在xmake.lua中自定义toolchain,而后经过xmake f --toolchain=myclang指定切换,例如:

toolchain("myclang")
    set_kind("standalone")
    set_toolset("cc", "clang")
    set_toolset("cxx", "clang", "clang++")
    set_toolset("ld", "clang++", "clang")
    set_toolset("sh", "clang++", "clang")
    set_toolset("ar", "ar")
    set_toolset("ex", "ar")
    set_toolset("strip", "strip")
    set_toolset("mm", "clang")
    set_toolset("mxx", "clang", "clang++")
    set_toolset("as", "clang")

    -- ...
复制代码

其中set_toolset用于挨个设置不一样的工具集,好比编译器、连接器、汇编器等。

xmake默认会从xmake f --sdk=xx的sdk参数中去探测工具,固然咱们也能够在xmake.lua中对每一个自定义工具链调用set_sdk("/xxx/llvm")来写死工具链sdk地址。

关于这块的详情介绍,能够到自定义工具链章节查看

更多详情见:#780

针对特定target设置工具链

除了自定义工具链,咱们也能够对某个特定的target单独切换设置不一样的工具链,和set_toolset不一样的是,此接口是对完整工具链的总体切换,好比cc/ld/sh等一系列工具集。

这也是推荐作法,由于像gcc/clang等大部分编译工具链,编译器和连接器都是配套使用的,要切就得总体切,单独零散的切换设置会很繁琐。

好比咱们切换test目标到clang+yasm两个工具链:

target("test")
    set_kind("binary")
    add_files("src/*.c")
    set_toolchains("clang", "yasm")
复制代码

或者能够经过set_toolset来对每一个target的工具链中的特定工具单独设置。

target("test")
    set_kind("binary")
    set_toolset("cxx", "clang")
    set_toolset("ld", "clang++")
复制代码

ninja构建主题

构建进度风格相似ninja,采用单行进度条,再也不回滚进度,用户能够根据本身的喜爱设置。

除了进度展现不一样外,其余都跟默认主题的配置相同。

$ xmake g --theme=ninja
复制代码

设置构建行为策略

xmake有不少的默认行为,好比:自动检测和映射flags、跨target并行构建等,虽然提供了必定的智能化处理,但重口难调,不必定知足全部的用户的使用习惯和需求。

所以,从v2.3.4开始,xmake提供默认构建策略的修改设置,开放给用户必定程度上的可配置性。

使用方式以下:

set_policy("check.auto_ignore_flags", false)
复制代码

只须要在项目根域设置这个配置,就能够禁用flags的自动检测和忽略机制,另外set_policy也能够针对某个特定的target局部生效。

target("test")
    set_policy("check.auto_ignore_flags", false)
复制代码

!> 另外,若是设置的策略名是无效的,xmake也会有警告提示。

若是要获取当前xmake支持的全部策略配置列表和描述,能够执行下面的命令:

$ xmake l core.project.policy.policies
{ 
  "check.auto_map_flags" = { 
    type = "boolean",
    description = "Enable map gcc flags to the current compiler and linker automatically.",
    default = true 
  },
  "build.across_targets_in_parallel" = { 
    type = "boolean",
    description = "Enable compile the source files for each target in parallel.",
    default = true 
  },
  "check.auto_ignore_flags" = { 
    type = "boolean",
    description = "Enable check and ignore unsupported flags automatically.",
    default = true 
  } 
}
复制代码

check.auto_ignore_flags

xmake默认会对全部add_cxflags, add_ldflags接口设置的原始flags进行自动检测,若是检测当前编译器和连接器不支持它们,就会自动忽略。

这一般是颇有用的,像一些可选的编译flags,即便不支持也能正常编译,可是强行设置上去,其余用户在编译的时候,有可能会由于编译器的支持力度不一样,出现必定程度的编译失败。

但,因为自动检测并不保证100%可靠,有时候会有必定程度的误判,因此某些用户并不喜欢这个设定(尤为是针对交叉编译工具链,更容易出现失败)。

目前,v2.3.4版本若是检测失败,会有警告提示避免用户莫名躺坑,例如:

warning: add_ldflags("-static") is ignored, please pass `{force = true}` or call `set_policy("check.auto_ignore_flags", false)` if you want to set it.
复制代码

根据提示,咱们能够本身分析判断,是否须要强制设置这个flags,一种就是经过:

add_ldflags("-static", {force = true})
复制代码

来显示的强制设置上它,跳过自动检测,这对于偶尔的flags失败,是颇有效快捷的处理方式,可是对于交叉编译时候,一堆的flags设置检测不过的状况下,每一个都设置force太过于繁琐。

这个时候,咱们就能够经过set_policy来对某个target或者整个project直接禁用默认的自动检测行为:

set_policy("check.auto_ignore_flags", false)
target("test")
    add_ldflags("-static")
复制代码

而后咱们就能够随意设置各类原始flags,xmake不会去自动检测和忽略他们了。

check.auto_map_flags

这是xmake的另一个对flags的智能分析处理,一般像add_links, add_defines这种xmake内置的api去设置的配置,是具备跨平台特性的,不一样编译器平台会自动处理成对应的原始flags。

可是,有些状况,用户仍是须要本身经过add_cxflags, add_ldflags设置原始的编译连接flags,这些flags并不能很好的跨编译器

就拿-O0的编译优化flags来讲,虽然有set_optimize来实现跨编译器配置,但若是用户直接设置add_cxflags("-O0")呢?gcc/clang下能够正常处理,可是msvc下就不支持了

也许咱们能经过if is_plat() then来分平台处理,但很繁琐,所以xmake内置了flags的自动映射功能。

基于gcc flags的普及性,xmake采用gcc的flags命名规范,对其根据不一样的编译实现自动映射,例如:

add_cxflags("-O0")
复制代码

这一行设置,在gcc/clang下仍是-O0,但若是当前是msvc编译器,那边会自动映射为msvc对应-Od编译选项来禁用优化。

整个过程,用户是彻底无感知的,直接执行xmake就能够跨编译器完成编译。

!> 固然,目前的自动映射实现还不是很成熟,没有100%覆盖全部gcc的flags,因此仍是有很多flags是没去映射的。

也有部分用户并不喜欢这种自动映射行为,那么咱们能够经过下面的设置彻底禁用这个默认的行为:

set_policy("check.auto_map_flags", false)
复制代码

build.across_targets_in_parallel

这个策略也是默认开启的,主要用于跨target间执行并行构建,v2.3.3以前的版本,并行构建只能针对单个target内部的全部源文件, 跨target的编译,必需要要等先前的target彻底link成功,才能执行下一个target的编译,这在必定程度上会影响编译速度。

然而每一个target的源文件是能够彻底并行化处理的,最终在一块儿执行link过程,v2.3.3以后的版本经过这个优化,构建速度提高了30%。

固然,若是有些特殊的target里面的构建源文件要依赖先前的target(尤为是一些自定义rules的状况,虽然不多遇到),咱们也能够经过下面的设置禁用这个优化行为:

set_policy("build.across_targets_in_parallel", false)
复制代码

新增编译模式

mode.releasedbg

为当前工程xmake.lua添加releasedbg编译模式的配置规则,例如:

add_rules("mode.releasedbg")
复制代码

!> 与release模式相比,此模式还会额外开启调试符号,这一般是很是有用的。

至关于:

if is_mode("releasedbg") then
    set_symbols("debug")
    set_optimize("fastest")
    set_strip("all")
end
复制代码

咱们能够经过:xmake f -m releasedbg来切换到此编译模式。

mode.minsizerel

为当前工程xmake.lua添加minsizerel编译模式的配置规则,例如:

add_rules("mode.minsizerel")
复制代码

!> 与release模式相比,此模式更加倾向于最小代码编译优化,而不是速度优先。

至关于:

if is_mode("minsizerel") then
    set_symbols("hidden")
    set_optimize("smallest")
    set_strip("all")
end
复制代码

咱们能够经过:xmake f -m minsizerel来切换到此编译模式。

显示指定信息和列表

显示xmake自身和当前项目的基础信息

$ xmake show
The information of xmake:
    version: 2.3.3+202006011009
    host: macosx/x86_64
    programdir: /Users/ruki/.local/share/xmake
    programfile: /Users/ruki/.local/bin/xmake
    globaldir: /Users/ruki/.xmake
    tmpdir: /var/folders/32/w9cz0y_14hs19lkbs6v6_fm80000gn/T/.xmake501/200603
    workingdir: /Users/ruki/projects/personal/tbox
    packagedir: /Users/ruki/.xmake/packages
    packagedir(cache): /Users/ruki/.xmake/cache/packages/2006

The information of project: tbox
    version: 1.6.5
    plat: macosx
    arch: x86_64
    mode: release
    buildir: build
    configdir: /Users/ruki/projects/personal/tbox/.xmake/macosx/x86_64
    projectdir: /Users/ruki/projects/personal/tbox
    projectfile: /Users/ruki/projects/personal/tbox/xmake.lua
复制代码

显示工具链列表

$ xmake show -l toolchains
xcode         Xcode IDE
vs            VisualStudio IDE
yasm          The Yasm Modular Assembler
clang         A C language family frontend for LLVM
...
复制代码

显示指定target配置信息

$ xmake show --target=tbox
The information of target(tbox):
    kind: static
    targetfile: build/macosx/x86_64/release/libtbox.a
    rules: mode.release, mode.debug, mode.profile, mode.coverage
    options: info, float, wchar, exception, force-utf8, deprecated, xml, zip, hash, regex, coroutine, object, charset, database
    packages: mbedtls, polarssl, openssl, pcre2, pcre, zlib, mysql, sqlite3
    links: pthread
    syslinks: pthread, dl, m, c
    cxflags: -Wno-error=deprecated-declarations, -fno-strict-aliasing, -Wno-error=expansion-to-defined, -fno-stack-protector
    defines: __tb_small__, __tb_prefix__="tbox"
    mxflags: -Wno-error=deprecated-declarations, -fno-strict-aliasing, -Wno-error=expansion-to-defined
    headerfiles: src/(tbox/**.h)|**/impl/**.h, src/(tbox/prefix/**/prefix.S), src/(tbox/math/impl/*.h), src/(tbox/utils/impl/*.h), build/macosx/x86_64/release/tbox.config.h
    includedirs: src, build/macosx/x86_64/release
    at: /Users/ruki/projects/personal/tbox/src/tbox/xmake.lua
    sourcebatch(cc): with rule(c.build)
      -> src/tbox/string/static_string.c
         -> build/.objs/tbox/macosx/x86_64/release/src/tbox/string/static_string.c.o
         -> build/.deps/tbox/macosx/x86_64/release/src/tbox/string/static_string.c.o.d
      -> src/tbox/platform/sched.c
         -> build/.objs/tbox/macosx/x86_64/release/src/tbox/platform/sched.c.o
         -> build/.deps/tbox/macosx/x86_64/release/src/tbox/platform/sched.c.o.d
      -> src/tbox/stream/stream.c
         -> build/.objs/tbox/macosx/x86_64/release/src/tbox/stream/stream.c.o
         -> build/.deps/tbox/macosx/x86_64/release/src/tbox/stream/stream.c.o.d
      -> src/tbox/utils/base32.c
         -> build/.objs/tbox/macosx/x86_64/release/src/tbox/utils/base32.c.o
         -> build/.deps/tbox/macosx/x86_64/release/src/tbox/utils/base32.c.o.d
复制代码

显示内置编译模式列表

$ xmake show -l modes
复制代码

显示内置编译规则列表

$ xmake show -l rules
复制代码

显示其余信息

还在完善中,详情见:github.com/xmake-io/xm…

或者运行:

$ xmake show --help
复制代码

更新内容

新特性

  • #630: 支持*BSD系统,例如:FreeBSD, ..
  • 添加wprint接口去显示警告信息
  • #784: 添加set_policy()去设置修改一些内置的策略,好比:禁用自动flags检测和映射
  • #780: 针对target添加set_toolchains/set_toolsets实现更完善的工具链设置,而且实现platform和toolchains分离
  • #798: 添加xmake show插件去显示xmake内置的各类信息
  • #797: 添加ninja主题风格,显示ninja风格的构建进度条,xmake g --theme=ninja
  • #816: 添加mode.releasedbg和mode.minsizerel编译模式规则
  • #819: 支持ansi/vt100终端字符控制

改进

  • #771: 检测includedirs,linkdirs和frameworkdirs的输入有效性
  • #774: xmake f --menu可视化配置菜单支持窗口大小Resize调整
  • #782: 添加add_cxflags等配置flags自动检测失败提示
  • #808: 生成cmakelists插件增长对add_frameworks的支持
  • #820: 支持独立的工做目录和构建目录,保持项目目录彻底干净

Bugs修复

  • #786: 修复头文件依赖检测
  • #810: 修复linux下gcc strip debug符号问题
相关文章
相关标签/搜索