1. 程式人生 > >xmake v2.3.1 釋出, 無縫對接其他構建系統

xmake v2.3.1 釋出, 無縫對接其他構建系統

最近對xmake內部做了不少的重構來改進,並且新增了不少實用的新特性,歡迎來體驗。

  • 專案原始碼
  • 官方文件

一些新特性:

  1. 一鍵編譯其他構建系統維護的專案,實現無縫對接,並且支援交叉編譯(比如autotools的快速交叉編譯,見下文詳述)
  2. 新增xmake project -k ninja工程生成外掛,支援對build.ninja構建系統檔案的生成

一些改進點:

  1. 改進命令列引數輸入,支援*nix style的引數輸入,感謝@OpportunityLiu的貢獻
  2. 改進tab命令補全,增加對引數values的命令補全支援
  3. 優化get.sh安裝和xmake update更新指令碼,新增國內映象源,加速下載和安裝更新
  4. gcc/clang編譯錯誤輸出支援原生色彩高亮支援
  5. 新增msys/cygwin平臺,並且xmake原始碼也支援msys/mingw平臺編譯

一些看不見的改進點:

  1. 新增socket, pipe模組,改進process模組
  2. 重構整個程序排程器,更好的排程並行構建
  3. 重構改進整個coroutine協程模組,支援對socket/pipe/process三者的同時排程支援(為後續遠端編譯和分散式編譯做準備)

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

新特性介紹

生成build.ninja構建檔案

xmake現已支援對ninja構建檔案的生成,讓使用者可以使用ninja來快速構建xmake維護的專案。不得不承認,目前就構建速度來講,ninja確實比xmake快不少,後續版本我會嘗試優化下xmake的構建速度。

$ xmake project -k ninja

然後呼叫ninja來構建:

$ ninja

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

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

xmake v2.3.1以上版本直接對接了其他第三方構建系統,即使其他專案中沒有使用xmake.lua來維護,xmake也可以直接呼叫其他構建工具來完成編譯。

那使用者直接呼叫使用第三方構建工具來編譯不就行了,為啥還要用xmake去呼叫呢?主要有以下好處:

  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命令引數輸入

目前的輸入規範參考自:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html

也非常感謝@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錯誤