[轉]:xmake工程描述編寫之選擇性編譯

xmake 提供了一些內置的條件判斷api,用於在選擇性編譯時,獲取到一些工程狀態的相關信息,來調整編譯邏輯。。linux

例如:is_os, is_plat, is_arch, is_kind, is_mode, is_optionandroid

is_mode

咱們先拿最經常使用的is_mode來說講如何使用,這個api主要用來判斷當前的編譯模式,例如日常編譯配置的時候,會執行:ios

$ xmake f -m debug
$ xmake

來編譯debug版本,那麼模式就是debug,那麼release版本,也就是releasegit

$ xmake f -m release
$ xmake

可是若是僅僅只是這麼配置,xmake仍是不知道若是爲debug進行編譯,如何編譯release版本,由於這些模式的值不是內置的github

咱們能夠隨便設置,例如:profile, checking等等,用來編譯性能模式,檢測模式,這些就看我們項目實際的需求了。。macos

通常狀況下只須要debugrelease就好了,那如何區分呢,這就須要在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

相關文章
相關標籤/搜索