xmake入門,構建項目原來能夠如此簡單

前言

在開發xmake以前,我一直在使用gnumake/makefile來維護我的C/C++項目,一開始還好,然而等項目愈來愈龐大後,維護起來就很是吃力了,後續也用過一陣子automake系列工具,並非很好用。html

因爲C/C++程序的構建過程比較繁瑣,若是不借助IDE工具,很難快速構建一個新的C/C++程序,想要跨平臺構建就更加麻煩了。python

雖然IDE很好用,也很強大,可是仍是有不少不足的地方,例如:linux

  • 跨平臺開發支持不完善
  • 自身環境不必定跨平臺
  • 過於臃腫
  • 不利於服務端自動化部署構建
  • 不夠靈活,定製化配置構建過程有侷限性

固然若是你熟悉makefile的話,也能夠手敲makefile,不過不一樣平臺用的make也不相同,好比: gnumake, nmake等,致使makefile語法存在差別性,沒法作到一致性編譯,並且對開發者有必定的使用門檻。c++

在win上使用gnumake還得裝cygwin,mingw-msys等環境,也很是麻煩,折騰完環境就得半天時間。git

目前已經有了不少現代化的構建工具,方便開發者構建和維護C/C++項目,例如:cmake, scons, premake, bazel, gn, gyp等等。github

其中不少只能生成對應的IDE工程,而後再經過對應IDE來維護和構建,這種只是解決了C/C++項目的一致性維護問題,可是構建方式不一致,所以仍是沒解決以前列舉的大部分不足點,也沒法直接快速構建。macos

而cmake, scons雖然很強大,可是cmake語法怪異不直觀,本人實在是不習慣,scons使用還須要依賴python,py2/py3的問題折騰起來也比較蛋疼。swift

鑑於此,我採用了lua來描述工程,利用lua的輕量,簡潔,靈活,跨平臺等特性,來解決上述遇到的各類問題,使用xmake將會帶來不同的構建體驗:vim

  • 輕量,跨平臺,無依賴,無需額外安裝python等第三方環境,直接內置lua運行時,一個安裝包(或者命令)直接搞定
  • 工程描述直觀簡潔,更符合用戶正常的思惟習慣
  • 支持直接構建,強大的命令行工具,終端用戶的福音,裝逼用戶必備
  • vscode, idea, clion, sublime, vim等編輯器插件支持
  • 智能檢測支持,簡化用戶編譯配置過程
  • 插件支持,靈活的用戶可擴展性
  • vcproj等IDE項目文件生成也支持的哦
  • 更多隱藏特性等你來體驗

xmake-compilation

快速上手

不會寫makefile?不要緊,直接在源碼目錄運行如下命令便可直接編譯:windows

xmake
複製代碼

xmake會自動掃描在當前目錄下的源碼結構,生成一個xmake.lua工程描述文件,而後嘗試直接編譯。

想要直接運行編譯後的可執行程序,簡單,直接敲:

$ xmake run
複製代碼

更多相關信息,請參考文章: xmake新增智能代碼掃描編譯模式,無需手寫任何make文件

快速入門

若是想要更進一步描述工程,調整源碼結構,添加一些編譯選項什麼的,仍是須要維護一個名叫xmake.lua的工程描述文件,相似makefile, cmakelist.txt,可是其語法和api通過不斷地改進簡化,已經至關易用。

最簡單的描述例子只須要三行:

target("test")
    set_kind("binary")
    add_files("src/*.c")
複製代碼

就能夠構建一個可執行程序,編譯全部在src目錄下的c源文件。

而後直接執行xmake便可編譯。

add_files()支持通配符文件模式匹配,而且支持.c, .cpp, .go, .d, .m, .mm, .S, .swift, .rc, .rs等各類native語言的代碼文件,大部分都能支持混編。

咱們甚至能夠添加.a和.o, .obj文件到add_files(),例如:

target("test")
    set_kind("static")
    add_files("src/*.c")
    add_files("lib/libxxx.a", "obj/bbb.o")
複製代碼

上述描述會編譯生成一個libtest.a庫,在編譯歸檔的時候,會自動將libxxx.a庫反解出來,合併到libtest.a中去,而且同時將bbb.o也加進去。

xmake提供的add_files是很是強大的,咱們還能夠再添加一批文件的同時,指定排除某些文件,例如:

add_files("src/**.cpp|test.cpp|arm/*.cpp")
複製代碼

上述描述,在遞歸添加源文件的同時,排除掉了test.cpp以及arm目錄下的源文件。

更多add_files用法,請參考文檔:add_files接口使用文檔

使用演示

命令行下的使用過程,你們能夠經過一個視頻直觀的體驗下:

建立工程

更加省事的方式就是經過上節所說傻瓜式操做方式,自動生成一個xmake.lua,而後在這基礎下修修改改就好了。

固然若是沒有現成源碼,想重新工程建立開始編譯,那麼可使用xmake提供的工程模板進行建立:

$ xmake create test
複製代碼

默認建立一個名爲test的c可執行項目,源碼結構以下:

.
├── src
│   └── main.c
└── xmake.lua
複製代碼

固然你也能夠選擇語言和模板類型:

$ xmake create -l c++ -t shared test
複製代碼

上述命令建立了一個c++動態庫項目,就這麼簡單。

運行和調試

編譯完的可執行程序,直接敲xmake run就能運行,xmake會自動找到對應的target目標文件,你也能夠傳遞參數給程序。

若是有多個target目標,你能夠指定須要運行的target名,例如:

$ xmake run test
複製代碼

想要快速調試程序?加上-d參數便可

$ xmake run -d test
複製代碼

xmake默認會去找系統自帶的調試器,而後加載運行,windows上使用vsjitdebugger,linux上gdb,macos上lldb,固然你也能夠隨意切換到其餘調試器。

配合debug模式編譯,就能作到使用xmake進行源碼調試。

可視化配置和構建

xmake提倡使用命令行的方式來操做,用習慣後效率很是高,並且在windows上,即便沒有cygwin,也能夠直接在cmd下正常運行。

固然,並非全部用戶習慣命令行,所以xmake也提供了編輯器插件,與各大編輯器進行集成,例如:

xmake-vscode插件

xmake-idea插件

xmake-sublime插件

xmake-tui界面

除了編輯器插件,xmake甚至本身封裝實現了一整套跨平臺tui字符界面庫,而後仿kconfig/menuconf的界面風格,實現了一個相似的可視化字符界面菜單配置。

這個不須要額外的插件,只須要在終端下執行:

$ xmake f --menu
複製代碼

就能夠顯示菜單配置界面進行編譯配置,配置完便可根據當前配置進行編譯,效果以下:

定製化編譯

想要更加靈活的編譯配置?那就得要修改xmake.lua啦,不過仍是很簡單的。

添加編譯選項

target("test")
    set_kind("binary")
    add_files("src/*.c")
    if is_mode("debug") then
       add_cxflags("-DDEBUG")
    end
複製代碼

上面代碼中,add_cxflags接口就是同時配置C/C++代碼的編譯選項,而且只在debug模式下生效,也就是執行下面命令的時候:

$ xmake f -m debug
$ xmake
複製代碼

使用內置選項

像添加宏定義,設置警告級別,優化級別,頭文件搜索目錄什麼的,徹底不必使用原始的add_cxflags接口,xmake有提供更加方便的接口,更加智能化的處理來簡化配置,也更加通用跨平臺,例如:

add_defines("DEBUG")
set_optimize("fast")
set_warnings("all", "error")

target("test")
    set_kind("binary")
    add_files("src/*.c")

target("test2")
    set_kind("binary")
    add_files("src2/*.c")
複製代碼

跟剛纔的配置不一樣的是,此處設置放在了target的上面,此處不屬於target域,是root全局設置,會影響下面的全部target目標程序的編譯設置,這樣能夠簡化配置,避免冗餘。

靈活的腳本控制

對於高端用戶,構建需求複雜多變,xmake也提供了對應解決方案,各個構建階段均可以靈活定製:

target("test")
    set_kind("binary")
    add_files("src/*.c")

    after_build(function (target)
        os.exec("file %s", target:targetfile())
    end)
複製代碼

上述代碼在編譯程序結束後,執行file命令查看目標程序相關信息,目前xmake能夠在build, clean, run, install, uninstall等各個階段的先後插入自定義的腳本,也能夠直接內置action,例如: on_install會覆蓋內置的安裝邏輯,提供給用戶足夠的靈活性。

方便的多目標依賴

不少時候,一個項目會有多個target目標程序,之間存在依賴關係,例如: 一個可執行程序hello,依賴一個靜態庫libtest.a,咱們只須要經過add_deps將兩個target作個關聯就好了,libtest.a的搜索目錄,頭文件目錄設置什麼的都不須要關心,xmake會自動處理:

target("test")
    set_kind("static")
    add_files("src/test/*.c")

target("hello")
    add_deps("test")  --添加依賴
    set_kind("binary")
    add_files("src/hello/*.c")
複製代碼

預編譯頭文件支持

xmake支持經過預編譯頭文件去加速c/c++程序編譯,目前支持的編譯器有:gcc, clang和msvc。

target("test")
    -- ...
    set_pcxxheader("header.h")
複製代碼

各大編譯器對預編譯頭的處理方式存在很大差別,而xmake將其差別性隱藏了起來,提供一致性的描述設置,簡化用戶在跨平臺編譯時候的處理, 具體關於編譯器對預編譯頭文件的處理,可參考相關文章:不一樣編譯器對預編譯頭文件的處理

自定義編譯規則

xmake不只原生內置支持多種語言文件的構建,並且還能夠經過自定義構建規則,讓用戶本身來實現複雜的未知文件構建。

咱們能夠經過預先設置規則支持的文件後綴,來擴展其餘文件的構建支持:

-- 定義一個markdown文件的構建規則
rule("markdown")
    set_extensions(".md", ".markdown")
    on_build(function (target, sourcefile)
        os.cp(sourcefile, path.join(target:targetdir(), path.basename(sourcefile) .. ".html"))
    end)

target("test")
    set_kind("binary")
    
    -- 使test目標支持markdown文件的構建規則
    add_rules("markdown")

    -- 添加markdown文件的構建
    add_files("src/*.md")
    add_files("src/*.markdown")
複製代碼

咱們也能夠指定某些零散的其餘文件做爲markdown規則來處理:

target("test")
    -- ...
    add_files("src/test/*.md.in", {rule = "markdown"})
複製代碼

注:經過add_files("*.md", {rule = "markdown"})方式指定的規則,優先級高於add_rules("markdown")設置的規則。

IDE工程文件生成

xmake提供了豐富的插件擴展,其中vcproj, makefile等工程文件的生成就是做爲插件提供,使用起來也很是簡單:

$ xmake project -k vs2017 -m "debug,release"
複製代碼

便可生成帶有debug, release兩種編譯模式的vc工程,同時支持x86和x64。

生成的工程目錄結構會根據添加的全部源文件的目錄結構,自動分析生成直觀的文件樹,方便vs去瀏覽查看。

makefile的生成以下:

$ xmake project -k makefile
複製代碼

後續會陸續更多其餘工程文件,也歡迎你們來貢獻哦。

靈活簡單的插件擴展

上節的IDE工程文件生成,在xmake中就是做爲插件來提供,這樣更加方便擴展,也能讓用戶快速定製本身的插件,只須要定義個task插件任務就好了:

-- 定義一個名叫hello的插件任務
task("hello")

    -- 設置類型爲插件
    set_category("plugin")

    -- 插件運行的入口
    on_run(function ()
        print("hello xmake!")
    end)

    -- 設置插件的命令行選項,這裏沒有任何參數選項,僅僅顯示插件描述
    set_menu {
                -- usage
                usage = "xmake hello [options]"

                -- description
            ,   description = "Hello xmake!"

                -- options
            ,   options = {}
            } 
複製代碼

上述代碼就是一個最爲簡單的hello xmake!插件,運行$xmake hello就可看到執行輸出,set_menu用於配置插件命令行選項,這個不設置就是內部task,沒法在命令行下調用。

更加詳細的插件說明以及內置插件列表可參考文檔:插件手冊

查找依賴包

xmake參考了cmake對於find_*系列接口的設計,實如今項目中動態的查找和添加包依賴。

target("test")
    set_kind("binary")
    add_files("*.c")
    on_load(function (target)
        import("lib.detect.find_package")
        target:add(find_package("zlib"))
    end)
複製代碼

上述描述代碼,經過lib.detect.find_package來查找包,若是找到zlib包,則將links, includedirs和linkdirs等信息添加到target中去。

交互式命令執行(REPL)

有時候在交互模式下,運行命令更加的方便測試和驗證一些模塊和api,也更加的靈活,不須要再去額外寫一個腳本文件來加載,不過我通常用來作計算器用用(好吧。。)

# 不帶任何參數執行,就能夠進入
$ xmake lua
>

# 進行表達式計算
> 1 + 2
3

# 賦值和打印變量值
> a = 1
> a
1

# 多行輸入和執行
> for _, v in pairs({1, 2, 3}) do
>> print(v)
>> end
1
2
3
複製代碼

咱們也可以經過 import 來導入擴展模塊:

> task = import("core.project.task")
> task.run("hello")
hello xmake!
複製代碼

編譯環境支持

當前xmake的最新版本已經支持不少sdk環境的集成編譯,例如:

  • [x] Visual Studio編譯環境
  • [x] mingw編譯環境
  • [x] cygwin編譯環境
  • [x] Android NDK編譯環境
  • [x] Xcode編譯環境(支持iPhoneos/Macosx構建)
  • [x] 系統gcc/clang編譯環境
  • [x] 交叉工具鏈編譯環境
  • [x] Cuda編譯環境
  • [ ] Qt編譯環境(正在支持中)
  • [ ] Windows WDK編譯環境(正在支持中)

FAQ

xmake有哪些用途?

  1. 跨平臺維護和編譯C/C++項目
  2. CI上部署自動化構建
  3. 開源代碼的快速移植
  4. 臨時的測試代碼編寫和快速運行
  5. 與本身喜歡的編輯器集成,打造屬於本身的C/C++開發環境
  6. 與其餘native語言的混合編譯
  7. 嵌入式開發下的交叉編譯
  8. 提高逼格

對於第三點的用途,我日常用的最多,由於我常常須要移植第三方的開源項目,它們使用的構建工具各不相同,有automake,cmake等等,其支持的構建平臺力度也都不相同,常常會遇到須要的平臺不支持的問題。

沒辦法,只好本身敲makefile來移植代碼,而後適配本身須要支持的那些平臺,還有交叉工具鏈,很蛋疼,自從寫了xmake後,我如今日常移植代碼方便了不少,效率提高很是明顯。

怎樣看實時編譯警告信息?

爲了不刷屏,在構建時候,默認是不實時輸出警告信息的,若是想要看的話能夠加上-w選項啓用編譯警告輸出就好了。

$ xmake [-w|--warning] 
複製代碼

怎樣看詳細的編譯參數信息?

請加上 -v 或者 --verbose 選項從新執行xmake後,獲取更加詳細的輸出信息

例如:

$ xmake [-v|--verbose] 
複製代碼

若是加上 --backtrace 選項也能夠獲取出錯時的xmake的調試棧信息

$ xmake -v --backtrace
複製代碼

xmake-verbose

快速安裝

最後咱們講下,如何安裝xmake,一般只須要一個腳本命令就能搞定。

一鍵安裝腳本

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

windows安裝包

對於windows用戶,提供了安裝包來快速安裝,可到Github Releases上下載對應版本。

更加詳細的安裝過程,見相關文檔: 安裝說明

結語

xmake還有不少很是有用的特性,例如:編譯器特性檢測、豐富的模塊庫、依賴包管理、自定義選項等等,一篇文章講不完這麼多,你們有興趣的話,能夠去官方文檔裏面看看,還有不少隱藏特性等着你哦。

原文出處:tboox.org/cn/2018/03/…

相關文章
相關標籤/搜索