emqx v3.2.0 編譯流程
獲取emqx v3.2.0源碼
git clone -b v3.2.0 https://github.com/emqx/emqx-rel.git
編譯命令
cd emqx-rel; make
到底make如果執行,然後又調用哪個命令進行項目編譯的呢?下面一步步進行揭祕:
make
make基本語法:
目標:依賴1 依賴2 ……
命令
emqx Makefile文件執行關鍵流程:
PROFILE ?= emqx
PROFILES := emqx emqx_pkg emqx_edge emqx_edge_pkg
CT_APPS := emqx_auth_jwt emqx_auth_mysql emqx_auth_username \
>--->---emqx_delayed_publish emqx_management emqx_recon emqx_rule_enginex \
>--->---emqx_stomp emqx_auth_clientid emqx_auth_ldap emqx_auth_pgsql \
>--->---emqx_coap emqx_lua_hook emqx_passwd emqx_reloader emqx_sn \
>--->---emqx_web_hook emqx_auth_http emqx_auth_mongo emqx_auth_redis \
>--->---emqx_dashboard emqx_lwm2m emqx_psk_file emqx_retainer emqx_statsd
.PHONY: default
default: $(PROFILE)
.PHONY: all
all: $(PROFILES)
.PHONY: distclean
distclean:
>---@rm -rf _build
>---@rm -f data/app.*.config data/vm.*.args rebar.lock
>---@rm -rf _checkouts
.PHONY: $(PROFILES)
$(PROFILES:%=%):
ifneq ($(OS),Windows_NT)
>---ln -snf _build/$(@)/lib ./_checkouts
endif
>---$(REBAR) as $(@) release
最後執行的具體編譯命令爲: rebar3 as emqx release 可以看到emqx v3.2.0版本拋棄了之前的rebar 使用了更高級的rebar3。 並不是emqx拋棄了rebar 是官網拋棄了,哈哈…… 詳情:https://www.rebar3.org/
rebar3
這個東西到底怎麼用呢? 參見上述連接哈 雖然是英文文檔但是還算是能看懂,
關鍵點:
1.動態配置文件:https://www.rebar3.org/docs/dynamic-configuration
2.基本用法:https://www.rebar3.org/docs/basic-usage
可以看到emqx-rel目錄下存在兩個文件:rebar.config rebar.config.script 這兩個文件就是rebar3要執行的配置文件,所有的emqx控制點也就在這個配置文件中
由於在同一目錄下存在*.script文件 會優先加載改文件並進行解析, 該文件一個重要的變量CONFIG 及rebar.config的整體文件內容, 會對rebar.config文件進行定製化的修改。
LINXU系統下可以參見/tmp/emqx.rebar.config文件,該文件就是動態加載後的文件
rebar3 的第一個主要工作
將emqx的所有依賴關係從git上進行獲取,並保存在_bulid/emqx目錄下,此時該目錄下保存的全部爲emqx相關源碼
rebar3 的第二個重要工作
調用relx編譯工具對步驟一獲取的源碼進行編譯生成可執行的程序。
relx 是啥?
relx
relx爲erlang項目的一個編譯程序。
使用方法參見:https://github.com/erlware/relx
relx的編譯配置哪裏獲取的呢? 就是rebar3動態配置加載的時候會有一個relx的配置項,該配置項的最後使用者就是relx
將emqx打包成tar
一行命令: rebar3 as emqx tar
會在_build/emqx/rel/emqx下生成tar包