爲了讓xmake更好得支持交叉編譯,這個版本我重構了整個工具鏈,使得工具鏈的切換更加的方便快捷,而且如今用戶能夠很方便地在xmake.lua中擴展本身的工具鏈。mysql
關於平臺的支持上,咱們新增了對*BSD系統的支持,另外,此版本還新增了一個ninja主題風格,實現相似ninja的編譯進度顯示,例如:linux
以前的版本,平臺和工具鏈綁定的過於緊密,例如xmake f -p windows
平臺,默認只能使用msvc的編譯,想要切到clang或者其餘編譯器,就只能走交叉編譯平臺:xmake f -p cross
。git
可是這樣的話,一些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單獨切換設置不一樣的工具鏈,和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,採用單行進度條,再也不回滾進度,用戶能夠根據本身的喜愛設置。
除了進度展現不一樣外,其餘都跟默認主題的配置相同。
$ 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
}
}
複製代碼
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不會去自動檢測和忽略他們了。
這是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)
複製代碼
這個策略也是默認開啓的,主要用於跨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)
複製代碼
爲當前工程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
來切換到此編譯模式。
爲當前工程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 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
...
複製代碼
$ 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
複製代碼
set_policy()
去設置修改一些內置的策略,好比:禁用自動flags檢測和映射xmake show
插件去顯示xmake內置的各類信息xmake g --theme=ninja
xmake f --menu
可視化配置菜單支持窗口大小Resize調整