xmake 提供了一些內置的條件判斷api,用於在選擇性編譯時,獲取到一些工程狀態的相關信息,來調整編譯邏輯。。linux
例如:is_os
, is_plat
, is_arch
, is_kind
, is_mode
, is_option
android
is_mode
咱們先拿最經常使用的is_mode
來說講如何使用,這個api主要用來判斷當前的編譯模式,例如日常編譯配置的時候,會執行:ios
$ xmake f -m debug $ xmake
來編譯debug
版本,那麼模式就是debug
,那麼release
版本,也就是release
了git
$ xmake f -m release $ xmake
可是若是僅僅只是這麼配置,xmake仍是不知道若是爲debug進行編譯,如何編譯release版本,由於這些模式的值不是內置的github
咱們能夠隨便設置,例如:profile, checking等等,用來編譯性能模式,檢測模式,這些就看我們項目實際的需求了。。macos
通常狀況下只須要debug
和release
就好了,那如何區分呢,這就須要在xmake.lua
進行配置了,通常可參考以下配置:windows
-- 若是當前編譯模式是debug if is_mode("debug") then -- 添加DEBUG編譯宏 add_defines("DEBUG") -- 啓用調試符號 set_symbols("debug") -- 禁用優化 set_optimize("none") -- 若是是release模式 elseif is_mode("release") then -- 隱藏符號 set_symbols("hidden") -- strip全部符號 set_strip("all") -- 開啓優化爲:最快速度模式 set_optimize("fastest") -- 忽略幀指針 add_cxflags("-fomit-frame-pointer") add_mxflags("-fomit-frame-pointer") end
經過判斷是否在編譯debug版本,來啓用和禁用調試符號信息,而且判斷是否禁用和啓用優化。api
固然,若是咱們的項目還設置了其餘模式,例如性能分析模式:profile,那麼還能夠經過這個來判斷是否須要添加一些分析分析上的編譯選項。bash
is_plat
接下來咱們講講這個編譯平臺的判斷,這個也很是實用哦,雖然咱們的工具是爲了跨平臺開發,一般的配置確定都是通用的架構
可是畢竟項目成千上萬,需求各不相同,總歸會有些項目須要針對不一樣的平臺作些編譯上的特殊處理
這個時候,咱們就須要這個api了,例如:
-- 若是當前平臺是android if is_plat("android") then add_files("src/xxx/*.c") end --若是當前平臺是macosx或者iphoneos if is_plat("macosx", "iphoneos") then add_mxflags("-framework Foundation") add_ldflags("-framework Foundation") end
這裏針對android平臺,增長了一些特殊代碼的編譯,針對macosx和iphoneos平臺,增長了Foundation框架的連接。
這裏還有個比較實用的小技巧,is_xxx
系列接口,都是能夠同時傳遞多個參數的,邏輯上是or的關係
咱們能夠像上面那麼寫法:
if is_plat("macosx", "iphoneos", "android", "linux") then end
不然若是用lua的原生語法的話,雖然也能夠,可是會很臃腫,例如:
if is_plat("macosx") or is_plat("iphoneos") or is_plat("android") or is_plat("linux") then end
除了is_xxx
系列,像:add_xxxs
這種後綴有s
的複數api,都是能夠傳遞多個參數的哦,例如add_files
:
add_files("src/*.c", "test.c", "hello.cpp")
等等,這裏就不一一介紹了。。。
is_arch
這個跟is_plat
相似,不過是用來判斷當前編譯的目標架構的,也就是:
xmake f --arch=x86_64
而後,咱們在工程描述中,進行判斷:
-- 若是當前架構是x86_64或者i386 if is_arch("x86_64", "i386") then add_files("src/xxx/*.c") end --若是當前平臺是armv7, arm64, armv7s, armv7-a if is_arch("armv7", "arm64", "armv7s", "armv7-a") then -- ... end
若是像上面那樣一個個去判斷全部arm架構,也許會很繁瑣,畢竟每一個平臺的架構類型不少,xmake提供了相似add_files
中的通配符匹配模式,來更加簡潔的進行判斷:
--若是當前平臺是arm平臺 if is_arch("arm*") then -- ... end
用*就能夠匹配全部了。。
is_os
這個很簡單,用來判斷當前編譯目標,例如:
-- 若是當前操做系統是ios if is_os("ios") then add_files("src/xxx/*.m") end
目前支持的操做系統有:windows、linux、android、macosx、ios
is_kind
用來判斷當前是否編譯的是動態庫仍是靜態庫
通常用於以下場景:
target("test") -- 經過配置設置目標的kind set_kind("$(kind)") add_files("src/*c") -- 若是當前編譯的是靜態庫,那麼添加指定文件 if is_kind("static") then add_files("src/xxx.c") end
編譯配置的時候,可手動切換,編譯類型:
-- 編譯靜態庫 xmake f -k static xmake -- 編譯動態庫 xmake f -k shared xmake
is_option
若是某個自動檢測選項、手動設置選項被啓用,那麼能夠經過is_option
接口來判斷,例如:
-- 若是手動啓用了xmake f --demo=y 選項 if is_option("demo") then -- 編譯demo目錄下的代碼 add_subdirs("src/demo") end