xmake是一個基於Lua的輕量級現代化C/C++跨平台構建系統,理念是:簡單,高效,跨平台。
最近對xmake內部做了不少的重構來改進,並且新增了不少實用的新特性,歡迎來體驗。
一些新特性:
xmake project -k ninja
工程生成插件,支持對build.ninja構建系統文件的生成一些改進點:
一些看不見的改進點:
還有一些零散的bug修復,見下文更新內容。
xmake現已支持對ninja構建文件的生成,讓用戶可以使用ninja來快速構建xmake維護的項目。不得不承認,目前就構建速度來講,ninja確實比xmake快不少,後續版本我會嘗試優化下xmake的構建速度。
$ xmake project -k ninja
然後調用ninja來構建:
$ ninja
或者直接使用xmake命令來調用ninja構建,見下文。
xmake v2.3.1以上版本直接對接了其他第三方構建系統,即使其他項目中沒有使用xmake.lua來維護,xmake也可以直接調用其他構建工具來完成編譯。
那用戶直接調用使用第三方構建工具來編譯不就行了,為啥還要用xmake去調用呢?主要有以下好處:
xmake config
的配置環境,復用xmake的平台探測和sdk環境檢測,簡化平台配置目前已支持的構建系統:
例如,對於一個使用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 clean
, xmake --rebuild
和xmake 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
目前的輸入規範參考自:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
也非常感謝@OpportunityLiu的貢獻,現在的輸入方式,可以支持採用如下寫法:
$ xmake -j8 -rvD
之前只能這麼寫:
$ xmake -j 8 -r -v -D
之前的版本,只能對參數名進行補全,現在可以對參數值進行補全和值列表提示,比如敲如下命令后:
$ xmake f --plat=and
按tab鍵就可以補全platform參數,變成
$ xmake f --plat=android
xmake新增一個配置參數,可以指定源文件的類型,強製作為對應的源文件來編譯,比如將c代碼作為c++來編譯。
target("test")
set_kind("binary")
add_files("src/*.c", {sourcekind = "cxx"})
*.c
作為c++代碼編譯, add_files("*.c", {sourcekind = "cxx"})
。xmake project -k ninja
,增加對build.ninja生成支持
[admin
]