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符號問題
相關文章
相關標籤/搜索