依赖包的添加和自动检测机制
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
xmake將依賴庫、依賴頭文件、依賴類型、依賴接口統(tǒng)一用 option 選項(xiàng)機(jī)制進(jìn)行了封裝,更在上一層引入package包的機(jī)制,使得添加和檢測(cè)依賴更加的模塊化,簡(jiǎn)單化。。。
下面通過一個(gè)具體實(shí)例,來看下xmake的包機(jī)制怎么使用。。
假如你現(xiàn)在的工程已經(jīng)有了兩個(gè)包:zlib.pkg,polarssl.pkg(如何構(gòu)建包,后續(xù)會(huì)詳細(xì)說明,現(xiàn)在可以參考TBOX依賴包下已有包的例子),你的工程目錄結(jié)構(gòu)如下:
demo- xmake.lua- srcmain.c- pkgzlib.pkgpolarssl.pkg那么你可以修改xmake.lua來使用上述的兩個(gè)依賴包:
-- 添加依賴包目錄,之后添加需要的包,都會(huì)從這個(gè)目錄里面查找 add_pkgdirs("pkg")-- 添加目標(biāo) add_target("demo")-- 設(shè)置程序類型為二進(jìn)制可執(zhí)行程序set_kind("binary")-- 添加源代碼文件add_files("src/*.c") -- 通過option機(jī)制添加polarssl、zlib包,如果檢測(cè)通過,會(huì)去自動(dòng)鏈接它-- 第一次執(zhí)行xmake config或者xmake編譯的時(shí)候會(huì)去自動(dòng)檢測(cè)它,然后緩存配置-- 如果要重新檢測(cè),則可以執(zhí)行 xmake config -c清除原有配置,重新配置所有。。。add_options("polarssl", "zlib")-- 設(shè)置自動(dòng)生成的配置頭文件,如果mysql檢測(cè)通過,會(huì)生成CONFIG_PACKAGE_HAVE_MYSQL開關(guān)set_config_h("$(buildir)/config.h")-- 設(shè)置config.h宏開關(guān)的前綴: CONFIG_xxxxset_config_h_prefix("CONFIG")-- 添加頭文件搜索目錄,這里為了搜索到config.hadd_includedirs("$(buildir)")接下來是代碼里面怎么去使用它:
#include <stdio.h>// 包含自動(dòng)生成的config.h頭文件 // 搜索路徑設(shè)置在./build下面 #include "config.h"// 如果當(dāng)前平臺(tái)存在zlib,那么使用它 #ifdef CONFIG_PACKAGE_HAVE_ZLIB # include "zlib/zlib.h" #endif// 如果當(dāng)前平臺(tái)存在polarssl,那么使用它 #ifdef CONFIG_PACKAGE_HAVE_POLARSSL # include "polarssl/polarssl.h" #endifint main(int argc, char** argv) {printf("hello world!\n");return 0; }上面就是一個(gè)包使用的最簡(jiǎn)單的例子,下面我們來看下具體這個(gè)zlib.pkg是怎么生成的:
如果這個(gè)包是你自己的項(xiàng)目xxx開發(fā)的,那么你只需要執(zhí)行xmake p進(jìn)行打包,自動(dòng)會(huì)在./build目錄下生成一個(gè)xxx.pkg的包,你直接在其他項(xiàng)目中使用就行了。。。
如果是第三方的庫,那么你需要自己去構(gòu)建它,但是也很方便,實(shí)在不行你可以參考已有的TBOX依賴包中一些包,做修改就行了。。。
一個(gè)pkg包的目錄結(jié)構(gòu):
zlib.pkg- inc(頭文件目錄,可選)- zlib/zlib.h- lib(鏈接庫目錄,可選)- linux/i386/libz.a- windows/i386/zlib.lib- xmake.lua(包描述文件)其中 inc、lib是可選的,具體邏輯還是在xmake.lua進(jìn)行描述,xmake默認(rèn)生成的包邏輯,是會(huì)優(yōu)先去檢測(cè)zlib.pkg目錄有沒有當(dāng)前可用的庫和頭文件,如果檢測(cè)不通過,才會(huì)去檢測(cè)系統(tǒng)平臺(tái)的。。。
當(dāng)然你也可以自己修改檢測(cè)邏輯,不一定非得這么來,你只需要根據(jù)自己的需求描述xxx.pkg/xmake.lua文件就行了。。。
下面看下我這里提供的zlib.pkg/xmake.lua描述邏輯:
-- 添加一個(gè)zlib包自動(dòng)配置選項(xiàng) add_option("zlib")-- 設(shè)置是否在xmake f -h配置菜單中顯示-- 如果你想讓你的包在工程項(xiàng)目中,可以提示用戶手動(dòng)禁用,那么就啟用他吧set_option_showmenu(true)-- 在xmake f -h中顯示相關(guān)描述信息set_option_description("The mysql package")-- 如果檢測(cè)通過,定義宏開關(guān)到config.hadd_option_defines_h_if_ok("$(prefix)_PACKAGE_HAVE_ZLIB")-- 檢測(cè)鏈接add_option_links("z")-- 添加檢測(cè)的鏈接庫目錄,這里設(shè)置優(yōu)先檢測(cè)zlib.pkg/lib/下相關(guān)平臺(tái)是否存在鏈接庫,然后再去檢測(cè)系統(tǒng)的-- 如果這個(gè)不去設(shè)置,xmake只能檢測(cè)一些系統(tǒng)目錄下的鏈接庫,例如:/usr/lib, /usr/local/lib-- 如果常用系統(tǒng)目錄下檢測(cè)不到,但是你又裝了這個(gè)庫,你可以自己設(shè)定檢測(cè)的搜索目錄add_option_linkdirs("lib/$(plat)/$(arch)")-- 檢測(cè) #include "zlib/zlib.h" 是否能編譯通過add_option_cincludes("zlib/zlib.h")-- 添加一些檢測(cè)的頭文件目錄,默認(rèn)會(huì)在zlib.pkg/inc進(jìn)行搜索,當(dāng)然你也可以指定其他目錄add_option_includedirs("inc/$(plat)", "inc")只要描述好xxx.pkg/xmake.lua, 一個(gè)包就能被xmake使用,并進(jìn)行自動(dòng)檢測(cè),其中利用的就是xmake的option機(jī)制,當(dāng)然在包里面不僅僅可以檢測(cè)依賴庫和頭文件,你也可以檢測(cè)是否存在某些需要的接口、類型定義等等。。
而且檢測(cè)機(jī)制完全采用lua語法,支持if條件邏輯,你可以針對(duì)一些特定的平臺(tái),做一些特別處理,使得你的包更加的通用。
例如下面這個(gè)基礎(chǔ)包base.pkg的描述:
-- 基礎(chǔ)包base.pkg add_option("base")-- 如果當(dāng)前為windows平臺(tái),檢測(cè)ws2_32鏈接庫依賴if os("windows") then add_option_links("ws2_32") -- 如果是其他平臺(tái),檢測(cè)-lm,-ldl,-lpthread依賴(由于都是些系統(tǒng)庫,這里就沒有設(shè)置搜索目錄)else add_option_links("m", "dl", "pthread") end如果你的包只是通過xmake.lua來描述,沒有其他文件目錄,那么你也可以把你的包xmake.lua的描述內(nèi)容,直接嵌入到工程描述文件xmake.lua中, 這兩者原本都是通用的,說白了 add_pkgdirs("pkg") 的機(jī)制,就是調(diào)用工程描述api:add_subdirs("pkg/*")進(jìn)行添加子工程的過程。。而xxx.pkg說白了就是一個(gè)子工程描述文件而已。。。
如果你想在你的包檢測(cè)中增加對(duì)接口的檢測(cè),那么只需要用:
- add_option_cfuncs
- add_option_cxxfuncs
- add_option_ctypes
- add_option_cxxtypes
就行了
所以利用包的機(jī)制,可以讓你的不同項(xiàng)目最大化重用你的依賴環(huán)境。。是個(gè)非常有用的功能。。
- XMake項(xiàng)目詳情
- XMake項(xiàng)目源碼
- XMake項(xiàng)目文檔
轉(zhuǎn)載于:https://my.oschina.net/tboox/blog/480675
總結(jié)
以上是生活随笔為你收集整理的依赖包的添加和自动检测机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 15 sql base line 工作机
- 下一篇: 方案猿身高project联赛,艺术家,相