From c54636b6c2606933bc48b7e3881d7e0927a33f6d Mon Sep 17 00:00:00 2001 From: Zaiming Shi Date: Fri, 26 Feb 2021 21:43:58 +0100 Subject: [PATCH] chore(build): inject emqx_vsn to all modules as attribute --- rebar.config | 3 ++- rebar.config.erl | 7 ++++--- src/emqx_mod_vsn.erl | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/emqx_mod_vsn.erl diff --git a/rebar.config b/rebar.config index e35ac8426..c37fa8070 100644 --- a/rebar.config +++ b/rebar.config @@ -11,7 +11,8 @@ {erl_opts, [warn_unused_vars,warn_shadow_vars,warn_unused_import, warn_obsolete_guard,compressed]}. -{overrides,[{add,[{extra_src_dirs, [{"etc", [{recursive,true}]}]}]} +{overrides,[{add,[ {extra_src_dirs, [{"etc", [{recursive,true}]}]} + , {erl_opts, [{parse_transform, emqx_mod_vsn}]}]} ]}. {extra_src_dirs, [{"etc", [{recursive,true}]}]}. diff --git a/rebar.config.erl b/rebar.config.erl index d8f0d74ec..2145fc212 100644 --- a/rebar.config.erl +++ b/rebar.config.erl @@ -52,7 +52,7 @@ test_deps() -> ]. default_compile_opts() -> - [compressed, deterministic, no_debug_info, warnings_as_errors, {parse_transform, mod_vsn}]. + [compressed, deterministic, no_debug_info, warnings_as_errors, {parse_transform, emqx_mod_vsn}]. profiles() -> [ {'emqx', [ {erl_opts, default_compile_opts()} @@ -67,11 +67,11 @@ profiles() -> , {'emqx-edge-pkg', [ {erl_opts, default_compile_opts()} , {relx, relx('emqx-edge-pkg')} ]} - , {check, [ {erl_opts, [debug_info, warnings_as_errors, {parse_transform, mod_vsn}]} + , {check, [ {erl_opts, [debug_info, warnings_as_errors, {parse_transform, emqx_mod_vsn}]} ]} , {test, [ {deps, test_deps()} , {plugins, test_plugins()} - , {erl_opts, [debug_info, {parse_transform, mod_vsn}] ++ erl_opts_i()} + , {erl_opts, [debug_info, {parse_transform, emqx_mod_vsn}] ++ erl_opts_i()} , {extra_src_dirs, [{"test", [{recursive,true}]}]} ]} ]. @@ -281,6 +281,7 @@ provide_bcrypt_release(ReleaseType) -> compile_and_load_pase_transforms(Dir) -> PtFiles = [ "apps/emqx_rule_engine/src/emqx_rule_actions_trans.erl" + , "src/emqx_mod_vsn.erl" ], CompileOpts = [verbose,report_errors,report_warnings,return_errors,debug_info], lists:foreach(fun(PtFile) -> {ok, _Mod} = compile:file(path(Dir, PtFile), CompileOpts) end, PtFiles). diff --git a/src/emqx_mod_vsn.erl b/src/emqx_mod_vsn.erl new file mode 100644 index 000000000..861398569 --- /dev/null +++ b/src/emqx_mod_vsn.erl @@ -0,0 +1,40 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2021 EMQ Technologies Co., Ltd. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%%-------------------------------------------------------------------- + +%% This module provides a parse_transform to inject emqx version number +%% to all modules as a module attribute. +%% The module attribute is so far only used for beam reload inspection. +-module(emqx_mod_vsn). + +-export([parse_transform/2]). + +parse_transform(Form, _Opts) -> + case os:getenv("PKG_VSN") of + false -> Form; + Vsn -> trans(Form, {attribute, 1, emqx_vsn, Vsn}) + end. + +trans(Form, Injection) -> + trans(Form, Injection, []). + +trans([], _Injection, Acc) -> + lists:reverse(Acc); +trans([{eof, _} | _] = EOF, _Injection, Acc) -> + lists:reverse(Acc) ++ EOF; +trans([{attribute, _, module, _} = Module | Form], Injection, Acc) -> + lists:reverse(Acc) ++ [Module, Injection | Form]; +trans([H | T], Injection, Acc) -> + trans(T, Injection, [H | Acc]).