xmake高階特性之自定義選項

waruqi發表於2019-05-11

xmake還可以支援一些自定義選項開關,使得工程支援可選編譯,方便工程的模組化管理。

增加自定義編譯開關

我們拿一個實際的例子來說:

我們想在自己的工程中增加一個新開關選項:hello, 如果這個開關被啟用,會在target中新增特定的一些原始碼檔案,但是這個開掛預設是不被啟用的,需要通過配置xmake f --hello=true才會被連結和使用

並且使用的時候,需要定義一些特殊的巨集定義:-DHELLO_TEST -DHELLO_ENABLE

那麼我們開始進行xmake.lua修改,過程並不複雜:

  1. 在xmake.lua的頭部通過add_option介面定義一個名叫hello的開關選項


--定義一個名叫hello的開關選項,這個介面跟add_target是同級的,不要在add_target裡面使用(使用了也沒什麼問題,只是不大好看)
add_option("hello")

    -- 預設禁用這個開關,需要手動xmake f --hello=true才會啟用,當然你也可以預設啟用它
    set_option_enable(false)

    -- 定義一些巨集開關,這個只有在hello被啟用的時候才會被定義
    add_option_defines_if_ok("HELLO_ENABLE", "HELLO_TEST")
  1. 將定義好的hello開關選項,與你的target專案進行繫結


-- 新增一個test目標
add_target("test")
    
    -- 生成可執行程式
    set_kind("binary")

    -- 繫結hello開關選項
    add_options("hello")

    -- 新增一些hello才需要的原始碼檔案
    if options("hello") then
        add_files("hello/*.c")
    end

ok了,只要兩步,接下來就是編譯了:


-- 直接編譯,預設是禁用hello的,所以hello的相關程式碼,都沒有被編譯進去
xmake 

-- 接下來我們啟用它,重新編譯下,這個時候,hello/*.c的程式碼也被編譯進去了,同時-DHELLO_TEST -DHELLO_ENABLE也被新增到編譯選項中了
xmake f --hello=true
xmake -r

很方便吧。。只需兩步就行。。接下來,我們再稍微修飾下:


add_option("hello")

    -- 預設禁用這個開關,需要手動xmake f --hello=true才會啟用,當然你也可以預設啟用它
    set_option_enable(false)

    -- 定義一些巨集開關,這個只有在hello被啟用的時候才會被定義
    add_option_defines_if_ok("HELLO_ENABLE", "HELLO_TEST")

    -- 啟用顯示選單,這樣xmake f --help的時候,你這個新加的開關就會被顯示出來
    set_option_showmenu(true)

    -- 對選單中開關進行分類,這樣顯示的時候 佈局會更好看,這個不是必須的
    set_option_category("module_xxx")

    -- 在選單中,對這個開關進行詳細描述
    set_option_description("Enable or disable the hello module")

這個時候,你再敲下:

xmake f --help

會顯示如下選單資訊:

此處省略...

--hello=HELLO                        Enable or disable the hello module (default: false)

此處省略...

這樣給別人看的時候,也就更明瞭些。。。

自動檢測機制

接下來,我們整的稍微複雜些,讓這個hello被啟用的時候,自動連結上libhello.a庫,並且可以對libhello.a進行自動檢測,如果不存在,就禁用hello開關。。

修改如下:


add_option("hello")

    -- 預設禁用這個開關,需要手動xmake f --hello=true才會啟用,當然你也可以預設啟用它
    set_option_enable(false)

    -- 定義一些巨集開關,這個只有在hello被啟用的時候才會被定義
    add_option_defines_if_ok("HELLO_ENABLE", "HELLO_TEST")

    -- 啟用顯示選單,這樣xmake f --help的時候,你這個新加的開關就會被顯示出來
    set_option_showmenu(true)

    -- 在選單中,對這個開關進行詳細描述
    set_option_description("Enable or disable the hello module")

    -- 新增連結庫libhello.a,這個在xmake f 會去自動檢測,如果檢測連結不通過,那麼這個開關就會被禁用掉
    -- 如果ok,編譯的時候會自動加上-lhello
    add_option_links("hello")

    -- 新增連結庫檢測搜尋目錄,如果路徑不對,檢測就會連結不通過,如果ok,在編譯的時候,會自動加上-L./libs
    add_option_linkdirs("libs")

修改後,如果這個hello開關被手動啟用,或者自動檢測通過,會在編譯連線的時候,自動加上-L./libs -lhello的連線選項。

增加一些其他的檢測規則

針對自動檢測,除了可以檢測連結庫,還可以增加一些其他的檢測規則:

  • 檢測標頭檔案是否能夠正常包含

  • 型別定義是否存在

  • 介面api是否存在

  • 檢測連結庫是否能夠正常連結

例如:


add_option("hello")

    -- 預設禁用這個開關,需要手動xmake f --hello=true才會啟用,當然你也可以預設啟用它
    set_option_enable(false)

    -- 定義一些巨集開關,這個只有在hello被啟用的時候才會被定義
    add_option_defines_if_ok("HELLO_ENABLE", "HELLO_TEST")

    -- 啟用顯示選單,這樣xmake f --help的時候,你這個新加的開關就會被顯示出來
    set_option_showmenu(true)

    -- 在選單中,對這個開關進行詳細描述
    set_option_description("Enable or disable the hello module")

    -- 新增連結庫libhello.a,這個在xmake f 會去自動檢測,如果檢測連結不通過,那麼這個開關就會被禁用掉
    -- 如果ok,編譯的時候會自動加上-lhello
    add_option_links("hello")

    -- 新增連結庫檢測搜尋目錄,如果路徑不對,檢測就會連結不通過,如果ok,在編譯的時候,會自動加上-L./libs
    add_option_linkdirs("libs")

    -- 檢測在c程式碼中: include "hello/hello.h",是否成功,ok的話才啟用hello
    -- 檢測c++程式碼請使用:add_option_cxxincludes
    add_option_cincludes("hello/hello.h")

    -- 新增標頭檔案檢測路徑,ok的話,會自動加上:-Iinc/xxx -I./inc的 編譯選項
    add_option_includedirs("inc/$(plat)", "inc")

    -- 檢測對c程式碼型別wchar_t的支援,如果不存在這個型別,就檢測失敗
    -- 檢測會依賴add_option_cincludes中提供的標頭檔案,如果給定的標頭檔案中定義了這個型別,就能檢測通過
    -- 檢測c++程式碼請使用:add_option_cxxtypes
    add_option_ctypes("wchar_t")

    -- 檢測對c程式碼中是否存在介面api:hello_test()
    -- 檢測會依賴add_option_cincludes中提供的標頭檔案,如果給定的標頭檔案中定義了這個型別,就能檢測通過
    -- 檢測c++程式碼請使用:add_option_cxxfuncs
    add_option_cfuncs("hello_test")

需要注意的是,所有的檢測都是and關係,必須全部通過,才會自動啟用hello開關。

其他可以被自動新增的api

並且在檢測ok或者被手動啟用後,可以自動新增一些特殊的編譯選項、巨集定義,這些介面如下:

  • add_option_cflags:選項開關被啟用後,自動新增c編譯選項

  • add_option_cxflags:選項開關被啟用後,自動新增c/c++編譯選項

  • add_option_cxxflags:選項開關被啟用後,自動新增c++編譯選項

  • add_option_ldflags:選項開關被啟用後,自動新增連結選項

  • add_option_vectorexts:選項開關被啟用後,自動新增指令擴充套件選項,例如:mmx, sse …

自動生成config.h配置檔案

option不僅可以在編譯的時候,自動新增編譯選項,還可以在啟用後,自動生成各種巨集開關到config.h檔案中,方便我們在程式碼裡面控制編譯邏輯

具體的使用說明,見:依賴包的新增和自動檢測機制


相關文章