XMake是一個(gè)基于Lua的輕量級(jí)跨平臺(tái)自動(dòng)構(gòu)建工具,支持在各種主流平臺(tái)上構(gòu)建項(xiàng)目
xmake的目標(biāo)是開發(fā)者更加關(guān)注于項(xiàng)目本身開發(fā),簡(jiǎn)化項(xiàng)目的描述和構(gòu)建,并且提供平臺(tái)無(wú)關(guān)性,使得一次編寫,隨處構(gòu)建
它跟cmake、automake、premake有點(diǎn)類似,但是機(jī)制不同,它默認(rèn)不會(huì)去生成IDE相關(guān)的工程文件,采用直接編譯,并且更加的方便易用 采用lua的工程描述語(yǔ)法更簡(jiǎn)潔直觀,支持在大部分常用平臺(tái)上進(jìn)行構(gòu)建,以及交叉編譯
并且xmake提供了創(chuàng)建、配置、編譯、打包、安裝、卸載、運(yùn)行等一些actions,使得開發(fā)和構(gòu)建更加的方便和流程化。
不僅如此,它還提供了許多更加高級(jí)的特性,例如插件擴(kuò)展、腳本宏記錄、批量打包、自動(dòng)文檔生成等等。。
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
或者手動(dòng)添加包源:
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包來(lái)安裝:
dpkg -i xmake-xxxx.deb
在redhat/centos
上安裝:
yum install xmake-xxx.rpm --nogpgcheck
通過(guò)腳本編譯安裝:
$ 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__
通過(guò)make進(jìn)行編譯安裝:
$ make build; sudo make install
安裝到其他指定目錄:
$ sudo make install prefix=/usr/local
卸載:
$ sudo make uninstall
創(chuàng)建一個(gè)名叫hello
的c
控制臺(tái)工程:
$ xmake create -l c -P ./hello
執(zhí)行完后,將會(huì)生成一個(gè)簡(jiǎn)單工程結(jié)構(gòu):
hello
├── src
│?? └── main.c
└── xmake.lua
其中xmake.lua
是工程描述文件,內(nèi)容非常簡(jiǎn)單,告訴xmake添加src
目錄下的所有.c
源文件:
target("hello")
set_kind("binary")
add_files("src/*.c")
目前支持的語(yǔ)言如下:
<p class="tip">
如果你想了解更多參數(shù)選項(xiàng),請(qǐng)運(yùn)行: xmake create --help
</p>
$ xmake
$ xmake run hello
$ xmake run -d hello
xmake將會(huì)使用系統(tǒng)自帶的調(diào)試器去加載程序運(yùn)行,目前支持: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">
你也可以使用簡(jiǎn)寫的命令行選項(xiàng),例如: xmake r
或者 xmake run
</p>
通過(guò)xmake f|config
配置命令,設(shè)置構(gòu)建前的相關(guān)配置信息,詳細(xì)參數(shù)選項(xiàng),請(qǐng)運(yùn)行: xmake f --help
。
<p class="tip">
你可以使用命令行縮寫來(lái)簡(jiǎn)化輸入,也可以使用全名,例如: <br>
xmake f
或者 xmake config
.<br>
xmake f -p linux
或者 xmake config --plat=linux
.
</p>
$ xmake
<p class="tip"> xmake將會(huì)自動(dòng)探測(cè)當(dāng)前主機(jī)平臺(tái),默認(rèn)自動(dòng)生成對(duì)應(yīng)的目標(biāo)程序。 </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
如果要手動(dòng)指定ndk中具體某個(gè)工具鏈,而不是使用默認(rèn)檢測(cè)的配置,可以通過(guò)--toolchains來(lái)設(shè)置,例如:
$ 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主要用于設(shè)置選擇編譯工具的具體bin目錄,這個(gè)的使用跟交叉編譯中的--toolchains的行為是一致的。
<p class="tip">
如果手動(dòng)設(shè)置了toolchains
的bin目錄,沒(méi)有通過(guò)檢測(cè),可以看下是否--arch=
參數(shù)沒(méi)有匹配對(duì)。
</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平臺(tái)的交叉編譯:
$ xmake f -p linux --sdk=/usr/local/arm-linux-gcc/ [--toolchains=/sdk/bin] [--cross=arm-linux-]
$ xmake
其他平臺(tái)的交叉編譯:
$ xmake f -p cross --sdk=/usr/local/arm-xxx-gcc/ [--toolchains=/sdk/bin] [--cross=arm-linux-]
$ xmake
如果不關(guān)心實(shí)際的平臺(tái)名,只想交叉編譯,可以直接用上面的命令,如果需要通過(guò)is_plat("myplat")
判斷自己的平臺(tái)邏輯,則:
$ xmake f -p myplat --sdk=/usr/local/arm-xxx-gcc/ [--toolchains=/sdk/bin] [--cross=arm-linux-]
$ xmake
其中:
參數(shù)名 | 描述 |
---|---|
--sdk | 設(shè)置交叉工具鏈的sdk根目錄 |
--toolchains | 設(shè)置工具鏈bin目錄 |
--cross | 設(shè)置交叉工具鏈工具前綴 |
--as | 設(shè)置asm 匯編器 |
--cc | 設(shè)置c 編譯器 |
--cxx | 設(shè)置c++ 編譯器 |
--mm | 設(shè)置objc 編譯器 |
--mxx | 設(shè)置objc++ 編譯器 |
--sc | 設(shè)置swift 編譯器 |
--gc | 設(shè)置golang 編譯器 |
--dc | 設(shè)置dlang 編譯器 |
--rc | 設(shè)置rust 編譯器 |
--ld | 設(shè)置c/c++/objc/asm 鏈接器 |
--sh | 設(shè)置c/c++/objc/asm 共享庫(kù)鏈接器 |
--ar | 設(shè)置c/c++/objc/asm 靜態(tài)庫(kù)歸檔器 |
--sc-ld | 設(shè)置swift 鏈接器 |
--sc-sh | 設(shè)置swift 共享庫(kù)鏈接器 |
--gc-ld | 設(shè)置golang 鏈接器 |
--gc-ar | 設(shè)置golang 靜態(tài)庫(kù)歸檔器 |
--dc-ld | 設(shè)置dlang 鏈接器 |
--dc-sh | 設(shè)置dlang 共享庫(kù)鏈接器 |
--dc-ar | 設(shè)置dlang 靜態(tài)庫(kù)歸檔器 |
--rc-ld | 設(shè)置rust 鏈接器 |
--rc-sh | 設(shè)置rust 共享庫(kù)鏈接器 |
--rc-ar | 設(shè)置rust 靜態(tài)庫(kù)歸檔器 |
--asflags | 設(shè)置asm 匯編編譯選項(xiàng) |
--cflags | 設(shè)置c 編譯選項(xiàng) |
--cxflags | 設(shè)置c/c++ 編譯選項(xiàng) |
--cxxflags | 設(shè)置c++ 編譯選項(xiàng) |
--mflags | 設(shè)置objc 編譯選項(xiàng) |
--mxflags | 設(shè)置objc/c++ 編譯選項(xiàng) |
--mxxflags | 設(shè)置objc++ 編譯選項(xiàng) |
--scflags | 設(shè)置swift 編譯選項(xiàng) |
--gcflags | 設(shè)置golang 編譯選項(xiàng) |
--dcflags | 設(shè)置dlang 編譯選項(xiàng) |
--rcflags | 設(shè)置rust 編譯選項(xiàng) |
--ldflags | 設(shè)置鏈接選項(xiàng) |
--shflags | 設(shè)置共享庫(kù)鏈接選項(xiàng) |
--arflags | 設(shè)置靜態(tài)庫(kù)歸檔選項(xiàng) |
<p class="tip">
如果你想要了解更多參數(shù)選項(xiàng),請(qǐng)運(yùn)行: xmake f --help
。
</p>
大部分情況下,都不需要配置很復(fù)雜的toolchains前綴,例如:arm-linux-
什么的
只要這個(gè)工具鏈的sdk目錄滿足如下結(jié)構(gòu)(大部分的交叉工具鏈都是這個(gè)結(jié)構(gòu)):
/home/toolchains_sdkdir
- bin
- arm-linux-gcc
- arm-linux-ld
- ...
- lib
- libxxx.a
- include
- xxx.h
那么,使用xmake進(jìn)行交叉編譯的時(shí)候,只需要進(jìn)行如下配置和編譯:
$ xmake f -p linux --sdk=/home/toolchains_sdkdir
$ xmake
這個(gè)時(shí)候,xmake會(huì)去自動(dòng)探測(cè),gcc等編譯器的前綴名:arm-linux-
,并且編譯的時(shí)候,也會(huì)自動(dòng)加上鏈接庫(kù)
和頭文件
的搜索選項(xiàng),例如:
-I/home/toolchains_sdkdir/include -L/home/toolchains_sdkdir/lib
這些都是xmake自動(dòng)處理的,不需要手動(dòng)配置他們。。
對(duì)于不規(guī)則工具鏈目錄結(jié)構(gòu),靠單純地--sdk選項(xiàng)設(shè)置,沒(méi)法完全檢測(cè)通過(guò)的情況下,可以通過(guò)這個(gè)選項(xiàng)繼續(xù)附加設(shè)置工具鏈的bin目錄位置。
例如:一些特殊的交叉工具鏈的,編譯器bin目錄,并不在 /home/toolchains_sdkdir/bin
這個(gè)位置,而是獨(dú)立到了 /usr/opt/bin
$ xmake f -p linux --sdk=/home/toolchains_sdkdir --toolchains=/usr/opt/bin
$ xmake
像aarch64-linux-android-
這種,通常如果你配置了--sdk或者--toolchains的情況下,xmake會(huì)去自動(dòng)檢測(cè)的,不需要自己手動(dòng)設(shè)置。
但是對(duì)于一些極特殊的工具鏈,一個(gè)目錄下同時(shí)有多個(gè)cross前綴的工具bin混在一起的情況,你需要手動(dòng)設(shè)置這個(gè)配置,來(lái)區(qū)分到底需要選用哪個(gè)bin。
例如,toolchains的bin目錄下同時(shí)存在兩個(gè)不同的編譯器:
/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ì)分選擇編譯器,則繼續(xù)追加相關(guān)編譯器選項(xiàng),例如:
$ xmake f -p linux --sdk=/user/toolsdk --as=armv7-linux-as
如果存在AS
環(huán)境變量的話,會(huì)優(yōu)先使用當(dāng)前環(huán)境變量中指定的值。
如果還要繼續(xù)細(xì)分選擇編譯器,則繼續(xù)追加相關(guān)編譯器選項(xiàng),例如:
$ xmake f -p linux --sdk=/user/toolsdk --cc=armv7-linux-clang
如果存在CC
環(huán)境變量的話,會(huì)優(yōu)先使用當(dāng)前環(huán)境變量中指定的值。
c++
編譯器如果還要繼續(xù)細(xì)分選擇編譯器,則繼續(xù)追加相關(guān)編譯器選項(xiàng),例如:
$ xmake f -p linux --sdk=/user/toolsdk --cxx=armv7-linux-clang++
如果存在CXX
環(huán)境變量的話,會(huì)優(yōu)先使用當(dāng)前環(huán)境變量中指定的值。
c/c++/objc/asm
鏈接器如果還要繼續(xù)細(xì)分選擇鏈接器,則繼續(xù)追加相關(guān)編譯器選項(xiàng),例如:
$ xmake f -p linux --sdk=/user/toolsdk --ld=armv7-linux-clang++
如果存在LD
環(huán)境變量的話,會(huì)優(yōu)先使用當(dāng)前環(huán)境變量中指定的值。
c/c++/objc/asm
共享庫(kù)鏈接器$ xmake f -p linux --sdk=/user/toolsdk --sh=armv7-linux-clang++
如果存在SH
環(huán)境變量的話,會(huì)優(yōu)先使用當(dāng)前環(huán)境變量中指定的值。
c/c++/objc/asm
靜態(tài)庫(kù)歸檔器$ xmake f -p linux --sdk=/user/toolsdk --ar=armv7-linux-ar
如果存在AR
環(huán)境變量的話,會(huì)優(yōu)先使用當(dāng)前環(huán)境變量中指定的值。
我們也可以將一些常用配置保存到全局配置中,來(lái)簡(jiǎn)化頻繁地輸入:
例如:
$ xmake g --ndk=~/files/android-ndk-r10e/
現(xiàn)在,我們重新配置和編譯android
程序:
$ xmake f -p android
$ xmake
以后,就不需要每次重復(fù)配置--ndk=
參數(shù)了。
<p class="tip">
每個(gè)命令都有其簡(jiǎn)寫,例如: xmake g
或者 xmake global
.<br>
</p>
有時(shí)候,配置出了問(wèn)題編譯不過(guò),或者需要重新檢測(cè)各種依賴庫(kù)和接口,可以加上-c
參數(shù),清除緩存的配置,強(qiáng)制重新檢測(cè)和配置
$ xmake f -c
$ xmake
或者:
$ xmake f -p iphoneos -c
$ xmake
獲取主菜單的幫助信息,里面有所有action和plugin的列表描述。
$ xmake [-h|--help]
獲取配置菜單的幫助信息,里面有所有配置選項(xiàng)的描述信息,以及支持平臺(tái)、架構(gòu)列表。
$ xmake f [-h|--help]
獲取action和plugin命令菜單的幫助信息,里面有所有內(nèi)置命令和插件任務(wù)的參數(shù)使用信息。
$ xmake [action|plugin] [-h|--help]
例如,獲取run
命令的參數(shù)信息:
$ xmake run --help
$ xmake [-q|--quiet]
可以先嘗試清除下配置,重新構(gòu)建下:
$ xmake f -c
$ xmake
如果還是失敗了,請(qǐng)加上 -v
或者 --verbose
選項(xiàng)重新執(zhí)行xmake后,獲取更加詳細(xì)的輸出信息
例如:
$ xmake -v
$ xmake --verbose
并且可以加上 --backtrace
選項(xiàng)獲取出錯(cuò)時(shí)的xmake的調(diào)試棧信息, 然后你可以提交這些信息到issues.
$ xmake -v --backtrace
更多建議: