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包