XMake 快速開(kāi)始

2018-10-12 19:52 更新

簡(jiǎn)介

XMake是一個(gè)基于Lua的輕量級(jí)跨平臺(tái)自動(dòng)構(gòu)建工具,支持在各種主流平臺(tái)上構(gòu)建項(xiàng)目

xmake的目標(biāo)是開(kāi)發(fā)者更加關(guān)注于項(xiàng)目本身開(kāi)發(fā),簡(jiǎn)化項(xiàng)目的描述和構(gòu)建,并且提供平臺(tái)無(wú)關(guān)性,使得一次編寫(xiě),隨處構(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,使得開(kāi)發(fā)和構(gòu)建更加的方便和流程化。

不僅如此,它還提供了許多更加高級(jí)的特性,例如插件擴(kuò)展、腳本宏記錄、批量打包、自動(dòng)文檔生成等等。。

安裝

Master版本

使用curl

bash <(curl -fsSL https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh)

使用wget

bash <(wget https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh -O -)

使用powershell

Invoke-Expression (Invoke-Webrequest 'https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.ps1' -UseBasicParsing).Content

Windows

  1. Releases 上下載windows安裝包
  2. 運(yùn)行安裝程序 xmake-[version].exe

MacOS

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew install xmake

或者:

  1. Releases 上下載pkg安裝包
  2. 雙擊運(yùn)行

或者安裝master版本:

## 使用homebrew安裝master版本
$ brew install xmake --HEAD


## 或者直接調(diào)用shell下載安裝
$ bash <(curl -fsSL https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh)

Linux

在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)安裝:

  1. Releases 上下載deb安裝包
  2. 運(yùn)行: dpkg -i xmake-xxxx.deb

redhat/centos上安裝:

  1. Releases 上下載rpm安裝包
  2. 運(yùn)行: 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

快速開(kāi)始

asciicast

創(chuàng)建工程

創(chuàng)建一個(gè)名叫helloc控制臺(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ǔ)言如下:

  • c/c++
  • objc/c++
  • asm
  • swift
  • dlang
  • golang
  • rust

<p class="tip"> 如果你想了解更多參數(shù)選項(xiàng),請(qǐng)運(yùn)行: xmake create --help </p>

構(gòu)建工程

$ xmake

運(yùn)行程序

$ xmake run hello

調(diào)試程序

$ 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ě)的命令行選項(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"> 你可以使用命令行縮寫(xiě)來(lái)簡(jiǎn)化輸入,也可以使用全名,例如: <br> xmake f 或者 xmake config.<br> xmake f -p linux 或者 xmake config --plat=linux. </p>

目標(biāo)平臺(tái)

主機(jī)平臺(tái)

$ xmake

<p class="tip"> xmake將會(huì)自動(dòng)探測(cè)當(dāng)前主機(jī)平臺(tái),默認(rèn)自動(dòng)生成對(duì)應(yīng)的目標(biāo)程序。 </p>

Linux

$ xmake f -p linux [-a i386|x86_64]
$ xmake

Android

$ 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>

iPhoneOS

$ xmake f -p iphoneos [-a armv7|armv7s|arm64|i386|x86_64]
$ xmake

Windows

$ xmake f -p windows [-a x86|x64]
$ xmake

Mingw

$ xmake f -p mingw --sdk=/usr/local/i386-mingw32-4.3.0/ [-a i386|x86_64]
$ xmake

Apple WatchOS

$ 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>

--sdk

  • 設(shè)置交叉工具鏈的sdk根目錄

大部分情況下,都不需要配置很復(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)配置他們。。

--toolchains

  • 設(shè)置工具鏈bin目錄

對(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

--cross

  • 設(shè)置交叉工具鏈工具前綴

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-

--as

  • 設(shè)置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)境變量中指定的值。

--cc

  • 設(shè)置c編譯器

如果還要繼續(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)境變量中指定的值。

--cxx

  • 設(shè)置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)境變量中指定的值。

--ld

  • 設(shè)置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)境變量中指定的值。

--sh

  • 設(shè)置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)境變量中指定的值。

--ar

  • 設(shè)置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)寫(xiě),例如: 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

問(wèn)答

怎樣獲取更多參數(shù)選項(xiàng)信息?

獲取主菜單的幫助信息,里面有所有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

怎樣實(shí)現(xiàn)靜默構(gòu)建,不輸出任何信息?

$ xmake [-q|--quiet]

如果xmake運(yùn)行失敗了怎么辦?

可以先嘗試清除下配置,重新構(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
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)