xmake高級特性之自定義選項

xmake還能夠支持一些自定義選項開關,使得工程支持可選編譯,方便工程的模塊化管理。c++

增長自定義編譯開關

咱們拿一個實際的例子來講:git

咱們想在本身的工程中增長一個新開關選項:hello, 若是這個開關被啓用,會在target中添加特定的一些源碼文件,可是這個開掛默認是不被啓用的,須要經過配置xmake f --hello=true纔會被連接和使用github

而且使用的時候,須要定義一些特殊的宏定義:-DHELLO_TEST -DHELLO_ENABLEapi

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

  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")

這個時候,你再敲下:lua

xmake f --help

會顯示以下菜單信息:.net

此處省略...

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

此處省略...

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

自動檢測機制

接下來,咱們整的稍微複雜些,讓這個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文件中,方便咱們在代碼裏面控制編譯邏輯

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


相關文章
相關標籤/搜索