XMake是一個基于Lua的輕量級跨平臺自動構(gòu)建工具,支持在各種主流平臺上構(gòu)建項目
xmake的目標是開發(fā)者更加關(guān)注于項目本身開發(fā),簡化項目的描述和構(gòu)建,并且提供平臺無關(guān)性,使得一次編寫,隨處構(gòu)建
它跟cmake、automake、premake有點類似,但是機制不同,它默認不會去生成IDE相關(guān)的工程文件,采用直接編譯,并且更加的方便易用 采用lua的工程描述語法更簡潔直觀,支持在大部分常用平臺上進行構(gòu)建,以及交叉編譯
并且xmake提供了創(chuàng)建、配置、編譯、打包、安裝、卸載、運行等一些actions,使得開發(fā)和構(gòu)建更加的方便和流程化。
不僅如此,它還提供了許多更加高級的特性,例如插件擴展、腳本宏記錄、批量打包、自動文檔生成等等。。
bash <(curl -fsSL https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh)
bash <(wget https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh -O -)
Invoke-Expression (Invoke-Webrequest 'https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.ps1' -UseBasicParsing).Content
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew install xmake
或者:
或者安裝master版本:
## 使用homebrew安裝master版本
$ brew install xmake --HEAD
## 或者直接調(diào)用shell下載安裝
$ bash <(curl -fsSL https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh)
在archlinux上安裝:
$ yaourt xmake
在ubuntu上安裝:
$ sudo add-apt-repository ppa:tboox/xmake
$ sudo apt-get update
$ sudo apt-get install xmake
或者手動添加包源:
deb http://ppa.launchpad.net/tboox/xmake/ubuntu yakkety main
deb-src http://ppa.launchpad.net/tboox/xmake/ubuntu yakkety main
然后執(zhí)行:
$ sudo apt-get update
$ sudo apt-get install xmake
或者下載deb包來安裝:
dpkg -i xmake-xxxx.deb
在redhat/centos
上安裝:
yum install xmake-xxx.rpm --nogpgcheck
通過腳本編譯安裝:
$ git clone git@github.com:waruqi/xmake.git
$ cd ./xmake
$ ./scripts/get.sh __local__
僅僅安裝和更新xmake的lua腳本:
$ ./scripts/get.sh __local__ __install_only__
卸載:
$ ./scripts/get.sh __uninstall__
通過make進行編譯安裝:
$ make build; sudo make install
安裝到其他指定目錄:
$ sudo make install prefix=/usr/local
卸載:
$ sudo make uninstall
創(chuàng)建一個名叫hello
的c
控制臺工程:
$ xmake create -l c -P ./hello
執(zhí)行完后,將會生成一個簡單工程結(jié)構(gòu):
hello
├── src
│?? └── main.c
└── xmake.lua
其中xmake.lua
是工程描述文件,內(nèi)容非常簡單,告訴xmake添加src
目錄下的所有.c
源文件:
target("hello")
set_kind("binary")
add_files("src/*.c")
目前支持的語言如下:
<p class="tip">
如果你想了解更多參數(shù)選項,請運行: xmake create --help
</p>
$ xmake
$ xmake run hello
$ xmake run -d hello
xmake將會使用系統(tǒng)自帶的調(diào)試器去加載程序運行,目前支持:lldb, gdb, windbg, vsjitdebugger, ollydbg 等各種調(diào)試器。
[lldb]$target create "build/hello"
Current executable set to 'build/hello' (x86_64).
[lldb]$b main
Breakpoint 1: where = hello`main, address = 0x0000000100000f50
[lldb]$r
Process 7509 launched: '/private/tmp/hello/build/hello' (x86_64)
Process 7509 stopped
* thread #1: tid = 0x435a2, 0x0000000100000f50 hello`main, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100000f50 hello`main
hello`main:
-> 0x100000f50 <+0>: pushq %rbp
0x100000f51 <+1>: movq %rsp, %rbp
0x100000f54 <+4>: leaq 0x2b(%rip), %rdi ; "hello world!"
0x100000f5b <+11>: callq 0x100000f64 ; symbol stub for: puts
[lldb]$
<p class="tip">
你也可以使用簡寫的命令行選項,例如: xmake r
或者 xmake run
</p>
通過xmake f|config
配置命令,設置構(gòu)建前的相關(guān)配置信息,詳細參數(shù)選項,請運行: xmake f --help
。
<p class="tip">
你可以使用命令行縮寫來簡化輸入,也可以使用全名,例如: <br>
xmake f
或者 xmake config
.<br>
xmake f -p linux
或者 xmake config --plat=linux
.
</p>
$ xmake
<p class="tip"> xmake將會自動探測當前主機平臺,默認自動生成對應的目標程序。 </p>
$ xmake f -p linux [-a i386|x86_64]
$ xmake
$ xmake f -p android --ndk=~/files/android-ndk-r10e/ [-a armv5te|armv6|armv7-a|armv8-a|arm64-v8a]
$ xmake
如果要手動指定ndk中具體某個工具鏈,而不是使用默認檢測的配置,可以通過--toolchains來設置,例如:
$ xmake f -p android --ndk=~/files/android-ndk-r10e/ -a arm64-v8a --toolchains=~/files/android-ndk-r10e/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin
--toolchains主要用于設置選擇編譯工具的具體bin目錄,這個的使用跟交叉編譯中的--toolchains的行為是一致的。
<p class="tip">
如果手動設置了toolchains
的bin目錄,沒有通過檢測,可以看下是否--arch=
參數(shù)沒有匹配對。
</p>
$ xmake f -p iphoneos [-a armv7|armv7s|arm64|i386|x86_64]
$ xmake
$ xmake f -p windows [-a x86|x64]
$ xmake
$ xmake f -p mingw --sdk=/usr/local/i386-mingw32-4.3.0/ [-a i386|x86_64]
$ xmake
$ xmake f -p watchos [-a i386|armv7k]
$ xmake
linux平臺的交叉編譯:
$ xmake f -p linux --sdk=/usr/local/arm-linux-gcc/ [--toolchains=/sdk/bin] [--cross=arm-linux-]
$ xmake
其他平臺的交叉編譯:
$ xmake f -p cross --sdk=/usr/local/arm-xxx-gcc/ [--toolchains=/sdk/bin] [--cross=arm-linux-]
$ xmake
如果不關(guān)心實際的平臺名,只想交叉編譯,可以直接用上面的命令,如果需要通過is_plat("myplat")
判斷自己的平臺邏輯,則:
$ xmake f -p myplat --sdk=/usr/local/arm-xxx-gcc/ [--toolchains=/sdk/bin] [--cross=arm-linux-]
$ xmake
其中:
參數(shù)名 | 描述 |
---|---|
--sdk | 設置交叉工具鏈的sdk根目錄 |
--toolchains | 設置工具鏈bin目錄 |
--cross | 設置交叉工具鏈工具前綴 |
--as | 設置asm 匯編器 |
--cc | 設置c 編譯器 |
--cxx | 設置c++ 編譯器 |
--mm | 設置objc 編譯器 |
--mxx | 設置objc++ 編譯器 |
--sc | 設置swift 編譯器 |
--gc | 設置golang 編譯器 |
--dc | 設置dlang 編譯器 |
--rc | 設置rust 編譯器 |
--ld | 設置c/c++/objc/asm 鏈接器 |
--sh | 設置c/c++/objc/asm 共享庫鏈接器 |
--ar | 設置c/c++/objc/asm 靜態(tài)庫歸檔器 |
--sc-ld | 設置swift 鏈接器 |
--sc-sh | 設置swift 共享庫鏈接器 |
--gc-ld | 設置golang 鏈接器 |
--gc-ar | 設置golang 靜態(tài)庫歸檔器 |
--dc-ld | 設置dlang 鏈接器 |
--dc-sh | 設置dlang 共享庫鏈接器 |
--dc-ar | 設置dlang 靜態(tài)庫歸檔器 |
--rc-ld | 設置rust 鏈接器 |
--rc-sh | 設置rust 共享庫鏈接器 |
--rc-ar | 設置rust 靜態(tài)庫歸檔器 |
--asflags | 設置asm 匯編編譯選項 |
--cflags | 設置c 編譯選項 |
--cxflags | 設置c/c++ 編譯選項 |
--cxxflags | 設置c++ 編譯選項 |
--mflags | 設置objc 編譯選項 |
--mxflags | 設置objc/c++ 編譯選項 |
--mxxflags | 設置objc++ 編譯選項 |
--scflags | 設置swift 編譯選項 |
--gcflags | 設置golang 編譯選項 |
--dcflags | 設置dlang 編譯選項 |
--rcflags | 設置rust 編譯選項 |
--ldflags | 設置鏈接選項 |
--shflags | 設置共享庫鏈接選項 |
--arflags | 設置靜態(tài)庫歸檔選項 |
<p class="tip">
如果你想要了解更多參數(shù)選項,請運行: xmake f --help
。
</p>
大部分情況下,都不需要配置很復雜的toolchains前綴,例如:arm-linux-
什么的
只要這個工具鏈的sdk目錄滿足如下結(jié)構(gòu)(大部分的交叉工具鏈都是這個結(jié)構(gòu)):
/home/toolchains_sdkdir
- bin
- arm-linux-gcc
- arm-linux-ld
- ...
- lib
- libxxx.a
- include
- xxx.h
那么,使用xmake進行交叉編譯的時候,只需要進行如下配置和編譯:
$ xmake f -p linux --sdk=/home/toolchains_sdkdir
$ xmake
這個時候,xmake會去自動探測,gcc等編譯器的前綴名:arm-linux-
,并且編譯的時候,也會自動加上鏈接庫
和頭文件
的搜索選項,例如:
-I/home/toolchains_sdkdir/include -L/home/toolchains_sdkdir/lib
這些都是xmake自動處理的,不需要手動配置他們。。
對于不規(guī)則工具鏈目錄結(jié)構(gòu),靠單純地--sdk選項設置,沒法完全檢測通過的情況下,可以通過這個選項繼續(xù)附加設置工具鏈的bin目錄位置。
例如:一些特殊的交叉工具鏈的,編譯器bin目錄,并不在 /home/toolchains_sdkdir/bin
這個位置,而是獨立到了 /usr/opt/bin
$ xmake f -p linux --sdk=/home/toolchains_sdkdir --toolchains=/usr/opt/bin
$ xmake
像aarch64-linux-android-
這種,通常如果你配置了--sdk或者--toolchains的情況下,xmake會去自動檢測的,不需要自己手動設置。
但是對于一些極特殊的工具鏈,一個目錄下同時有多個cross前綴的工具bin混在一起的情況,你需要手動設置這個配置,來區(qū)分到底需要選用哪個bin。
例如,toolchains的bin目錄下同時存在兩個不同的編譯器:
/opt/bin
- armv7-linux-gcc
- aarch64-linux-gcc
我們現(xiàn)在想要選用armv7的版本,則配置如下:
$ xmake f -p linux --sdk=/usr/toolsdk --toolchains=/opt/bin --cross=armv7-linux-
asm
匯編器如果還要繼續(xù)細分選擇編譯器,則繼續(xù)追加相關(guān)編譯器選項,例如:
$ xmake f -p linux --sdk=/user/toolsdk --as=armv7-linux-as
如果存在AS
環(huán)境變量的話,會優(yōu)先使用當前環(huán)境變量中指定的值。
如果還要繼續(xù)細分選擇編譯器,則繼續(xù)追加相關(guān)編譯器選項,例如:
$ xmake f -p linux --sdk=/user/toolsdk --cc=armv7-linux-clang
如果存在CC
環(huán)境變量的話,會優(yōu)先使用當前環(huán)境變量中指定的值。
c++
編譯器如果還要繼續(xù)細分選擇編譯器,則繼續(xù)追加相關(guān)編譯器選項,例如:
$ xmake f -p linux --sdk=/user/toolsdk --cxx=armv7-linux-clang++
如果存在CXX
環(huán)境變量的話,會優(yōu)先使用當前環(huán)境變量中指定的值。
c/c++/objc/asm
鏈接器如果還要繼續(xù)細分選擇鏈接器,則繼續(xù)追加相關(guān)編譯器選項,例如:
$ xmake f -p linux --sdk=/user/toolsdk --ld=armv7-linux-clang++
如果存在LD
環(huán)境變量的話,會優(yōu)先使用當前環(huán)境變量中指定的值。
c/c++/objc/asm
共享庫鏈接器$ xmake f -p linux --sdk=/user/toolsdk --sh=armv7-linux-clang++
如果存在SH
環(huán)境變量的話,會優(yōu)先使用當前環(huán)境變量中指定的值。
c/c++/objc/asm
靜態(tài)庫歸檔器$ xmake f -p linux --sdk=/user/toolsdk --ar=armv7-linux-ar
如果存在AR
環(huán)境變量的話,會優(yōu)先使用當前環(huán)境變量中指定的值。
我們也可以將一些常用配置保存到全局配置中,來簡化頻繁地輸入:
例如:
$ xmake g --ndk=~/files/android-ndk-r10e/
現(xiàn)在,我們重新配置和編譯android
程序:
$ xmake f -p android
$ xmake
以后,就不需要每次重復配置--ndk=
參數(shù)了。
<p class="tip">
每個命令都有其簡寫,例如: xmake g
或者 xmake global
.<br>
</p>
有時候,配置出了問題編譯不過,或者需要重新檢測各種依賴庫和接口,可以加上-c
參數(shù),清除緩存的配置,強制重新檢測和配置
$ xmake f -c
$ xmake
或者:
$ xmake f -p iphoneos -c
$ xmake
獲取主菜單的幫助信息,里面有所有action和plugin的列表描述。
$ xmake [-h|--help]
獲取配置菜單的幫助信息,里面有所有配置選項的描述信息,以及支持平臺、架構(gòu)列表。
$ xmake f [-h|--help]
獲取action和plugin命令菜單的幫助信息,里面有所有內(nèi)置命令和插件任務的參數(shù)使用信息。
$ xmake [action|plugin] [-h|--help]
例如,獲取run
命令的參數(shù)信息:
$ xmake run --help
$ xmake [-q|--quiet]
可以先嘗試清除下配置,重新構(gòu)建下:
$ xmake f -c
$ xmake
如果還是失敗了,請加上 -v
或者 --verbose
選項重新執(zhí)行xmake后,獲取更加詳細的輸出信息
例如:
$ xmake -v
$ xmake --verbose
并且可以加上 --backtrace
選項獲取出錯時的xmake的調(diào)試棧信息, 然后你可以提交這些信息到issues.
$ xmake -v --backtrace
更多建議: