xmake v2.3.1 發佈, 無縫對接其餘構建系統

最近對xmake內部作了很多的重構來改進,而且新增了很多實用的新特性,歡迎來體驗。html

一些新特性:linux

  1. 一鍵編譯其餘構建系統維護的項目,實現無縫對接,而且支持交叉編譯(好比autotools的快速交叉編譯,見下文詳述)
  2. 新增xmake project -k ninja工程生成插件,支持對build.ninja構建系統文件的生成

一些改進點:android

  1. 改進命令行參數輸入,支持*nix style的參數輸入,感謝@OpportunityLiu的貢獻
  2. 改進tab命令補全,增長對參數values的命令補全支持
  3. 優化get.sh安裝和xmake update更新腳本,添加國內鏡像源,加速下載和安裝更新
  4. gcc/clang編譯錯誤輸出支持原生色彩高亮支持
  5. 新增msys/cygwin平臺,而且xmake源碼也支持msys/mingw平臺編譯

一些看不見的改進點:c++

  1. 添加socket, pipe模塊,改進process模塊
  2. 重構整個進程調度器,更好的調度並行構建
  3. 重構改進整個coroutine協程模塊,支持對socket/pipe/process三者的同時調度支持(爲後續遠程編譯和分佈式編譯作準備)

還有一些零散的bug修復,見下文更新內容。git

新特性介紹

生成build.ninja構建文件

xmake現已支持對ninja構建文件的生成,讓用戶可使用ninja來快速構建xmake維護的項目。不得不認可,目前就構建速度來說,ninja確實比xmake快很多,後續版本我會嘗試優化下xmake的構建速度。github

$ xmake project -k ninja
複製代碼

而後調用ninja來構建:windows

$ ninja
複製代碼

或者直接使用xmake命令來調用ninja構建,見下文。xcode

嘗試使用其餘構建系統構建

xmake v2.3.1以上版本直接對接了其餘第三方構建系統,即便其餘項目中沒有使用xmake.lua來維護,xmake也能夠直接調用其餘構建工具來完成編譯。bash

那用戶直接調用使用第三方構建工具來編譯不就好了,爲啥還要用xmake去調用呢?主要有如下好處:markdown

  1. 徹底的行爲一致,簡化編譯流程,無論用了哪一個其餘構建系統,都只須要執行xmake這個命令就能夠編譯,用戶再也不須要去研究其餘工具的不一樣的編譯流程
  2. 徹底對接xmake config的配置環境,複用xmake的平臺探測和sdk環境檢測,簡化平臺配置
  3. 對接交叉編譯環境,即便是用autotools維護的項目,也能經過xmake快速實現交叉編譯

目前已支持的構建系統:

  • autotools(已徹底對接xmake的交叉編譯環境)
  • xcodebuild
  • cmake
  • make
  • msbuild
  • scons
  • meson
  • bazel
  • ndkbuild
  • ninja

自動探測構建系統並編譯

例如,對於一個使用cmake維護的項目,直接在項目根目錄執行xmake,就會自動觸發探測機制,檢測到CMakeLists.txt,而後提示用戶是否須要使用cmake來繼續完成編譯。

$ xmake 
note: CMakeLists.txt found, try building it (pass -y or --confirm=y/n/d to skip confirm)?
please input: y (y/n)
-- Symbol prefix:
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/ruki/Downloads/libpng-1.6.35/build
[  7%] Built target png-fix-itxt
[ 21%] Built target genfiles
[ 81%] Built target png
[ 83%] Built target png_static
...
output to /Users/ruki/Downloads/libpng-1.6.35/build/artifacts
build ok!
複製代碼

無縫對接xmake命令

目前支持xmake clean, xmake --rebuildxmake config等經常使用命令與第三方系統的無縫對接。

咱們能夠直接清理cmake維護項目的編譯輸出文件

$ xmake clean
$ xmake clean --all
複製代碼

若是帶上--all執行清理,會清除autotools/cmake生成的全部文件,不只僅只清理對象文件。

默認xmake對接的是增量構建行爲,不過咱們也能夠強制快速重建:

$ xmake --rebuild
複製代碼

手動切換指定構建系統

若是一個項目下有多個構建系統同時在維護,好比libpng項目,自帶autotools/cmake/makefile等構建系統維護,xmake默認優先探測使用了autotools,若是想要強制切換其餘構建系統,能夠執行:

$ xmake f --trybuild=[autotools|cmake|make|msbuild| ..]
$ xmake
複製代碼

另外,配置了--trybuild=參數手動指定了默認的構建系統,後續的build過程就不會額外提示用戶選擇了。

實現快速交叉編譯

衆所周知,autotools維護的項目雖然不少都支持交叉編譯,可是交叉編譯的配置過程很複雜,不一樣的工具鏈處理方式還有不少的差別,中途會踩到不少的坑。

即便跑通了一個工具鏈的交叉編譯,若是切到另一個工具鏈環境,可能又要折騰很久,而若是使用xmake,一般只須要兩條簡單的命令便可:

!> 目前就autotools對接支持了xmake的交叉編譯,後期還會對cmake等其餘構建系統加上支持。

交叉編譯android平臺
$ xmake f -p android --trybuild=autotools [--ndk=xxx]
$ xmake
複製代碼

!> 其中,--ndk參數配置是可選的,若是用戶設置了ANDROID_NDK_HOME環境變量,或者ndk放置在~/Library/Android/sdk/ndk-bundle,xmake都能自動檢測到。

是否是很簡單?若是你以爲這沒啥,那麼能夠對比下直接操做./configure去配置交叉編譯,能夠看下這篇文檔對比下:將NDK 與其餘編譯系統配合使用

說白了,你大概得這樣,還不必定一次就能搞定:

$ export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
$ export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
$ export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
$ export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
$ export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
$ export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
$ export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
$ export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
$ ./configure --host aarch64-linux-android
$ make
複製代碼
交叉編譯iphoneos平臺
$ xmake f -p iphoneos --trybuild=autotools
$ xmake
複製代碼
交叉編譯mingw平臺
$ xmake f -p mingw --trybuild=autotools [--mingw=xxx]
$ xmake
複製代碼
使用其餘交叉編譯工具鏈
$ xmake f -p cross --trybuild=autotools --sdk=/xxxx
$ xmake
複製代碼

關於更多交叉編譯的配置細節,請參考文檔:交叉編譯,除了多了一個--trybuild=參數,其餘交叉編譯配置參數都是徹底通用的。

傳遞用戶配置參數

咱們能夠經過--tryconfigs=來傳遞用戶額外的配置參數到對應的第三方構建系統,好比:autotools會傳遞給./configure,cmake會傳遞給cmake命令。

$ xmake f --trybuild=autotools --tryconfigs="--enable-shared=no"
$ xmake
複製代碼

好比上述命令,傳遞--enable-shared=no./configure,來禁用動態庫編譯。

另外,對於--cflags, --includedirs--ldflags等參數,不須要經過--tryconfigs,經過xmake config --cflags=等內置參數就可透傳過去。

編譯其餘構建系統過程示例

通用編譯方式

大多數狀況下,每一個構建系統對接後的編譯方式都是一致的,除了--trybuild=配置參數除外。

$ xmake f --trybuild=[autotools|cmake|meson|ninja|bazel|make|msbuild|xcodebuild]
$ xmake
複製代碼

!> 咱們還須要確保--trybuild指定的構建工具已經安裝可以正常使用。

構建Android jni程序

若是當前項目下存在jni/Android.mk,那麼xmake能夠直接調用ndk-build來構建jni庫。

$ xmake f -p android --trybuild=ndkbuild [--ndk=]
$ xmake
複製代碼

*nix style命令參數輸入

目前的輸入規範參考自:pubs.opengroup.org/onlinepubs/…

也很是感謝@OpportunityLiu的貢獻,如今的輸入方式,能夠支持採用以下寫法:

$ xmake -j8 -rvD
複製代碼

以前只能這麼寫:

$ xmake -j 8 -r -v -D
複製代碼

tab命令自動補全

以前的版本,只能對參數名進行補全,如今能夠對參數值進行補全和值列表提示,好比敲以下命令後:

$ xmake f --plat=and
複製代碼

按tab鍵就能夠補全platform參數,變成

$ xmake f --plat=android
複製代碼

強制將c代碼做爲c++編譯

xmake新增一個配置參數,能夠指定源文件的類型,強制做爲對應的源文件來編譯,好比將c代碼做爲c++來編譯。

target("test")
    set_kind("binary")
    add_files("src/*.c", {sourcekind = "cxx"})
複製代碼

更新內容

新特性

  • #675: 支持經過設置強制將*.c做爲c++代碼編譯, add_files("*.c", {sourcekind = "cxx"})
  • #681: 支持在msys/cygwin上編譯xmake,以及添加msys/cygwin編譯平臺
  • 添加socket/pipe模塊,而且支持在協程中同時調度process/socket/pipe
  • #192: 嘗試構建帶有第三方構建系統的項目,還支持autotools項目的交叉編譯
  • 啓用gcc/clang的編譯錯誤色彩高亮輸出
  • #588: 改進工程生成插件xmake project -k ninja,增長對build.ninja生成支持

改進

  • #665: 支持 *nix style 的參數輸入,感謝@OpportunityLiu的貢獻
  • #673: 改進tab命令補全,增長對參數values的補全支持
  • #680: 優化get.sh安裝腳本,添加國內鏡像源,加速下載
  • 改進process調度器
  • #651: 改進os/io模塊系統操做錯誤提示

Bugs修復

  • 修復增量編譯檢測依賴文件的一些問題
  • 修復log輸出致使xmake-vscode插件解析編譯錯誤信息失敗問題
  • #684: 修復windows下android ndk的一些linker錯誤

我的主頁 我的項目

相關文章
相關標籤/搜索