xmake還可以支援一些自定義選項開關,使得工程支援可選編譯,方便工程的模組化管理。
增加自定義編譯開關
我們拿一個實際的例子來說:
我們想在自己的工程中增加一個新開關選項:hello, 如果這個開關被啟用,會在target中新增特定的一些原始碼檔案,但是這個開掛預設是不被啟用的,需要通過配置xmake f --hello=true
才會被連結和使用
並且使用的時候,需要定義一些特殊的巨集定義:-DHELLO_TEST -DHELLO_ENABLE
那麼我們開始進行xmake.lua修改,過程並不複雜:
-
在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")
-
將定義好的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檔案中,方便我們在程式碼裡面控制編譯邏輯
具體的使用說明,見:依賴包的新增和自動檢測機制