xmake還能夠支持一些自定義選項開關,使得工程支持可選編譯,方便工程的模塊化管理。c++
咱們拿一個實際的例子來講:git
咱們想在本身的工程中增長一個新開關選項:hello, 若是這個開關被啓用,會在target中添加特定的一些源碼文件,可是這個開掛默認是不被啓用的,須要經過配置xmake f --hello=true
纔會被連接和使用github
而且使用的時候,須要定義一些特殊的宏定義:-DHELLO_TEST -DHELLO_ENABLE
api
那麼咱們開始進行xmake.lua修改,過程並不複雜:bash
--定義一個名叫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")
-- 添加一個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的鏈接選項。
針對自動檢測,除了能夠檢測連接庫,還能夠增長一些其餘的檢測規則:
例如:
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開關。
而且在檢測ok或者被手動啓用後,能夠自動添加一些特殊的編譯選項、宏定義,這些接口以下:
option不只能夠在編譯的時候,自動添加編譯選項,還能夠在啓用後,自動生成各類宏開關到config.h文件中,方便咱們在代碼裏面控制編譯邏輯
具體的使用說明,見:依賴包的添加和自動檢測機制