diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl index 933d2df..fc1524f 100644 --- a/src/rebar_erlc_compiler.erl +++ b/src/rebar_erlc_compiler.erl @@ -149,7 +149,8 @@ internal_erl_compile(Source, Config, Outdir) -> skipped end. -compile_mib(Source, _Target, Config) -> +compile_mib(Source, Target, Config) -> + ok = rebar_utils:ensure_dir(Target), Opts = [{outdir, "priv/mibs"}, {i, ["priv/mibs"]}] ++ rebar_config:get(Config, mib_opts, []), case snmpc:compile(Source, Opts) of diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl index 9ecbbe6..5f1612c 100644 --- a/src/rebar_utils.erl +++ b/src/rebar_utils.erl @@ -32,7 +32,8 @@ sh/2, sh/3, sh_failfast/2, find_files/2, - now_str/0]). + now_str/0, + ensure_dir/1]). -include("rebar.hrl"). @@ -89,6 +90,24 @@ now_str() -> lists:flatten(io_lib:format("~4b/~2..0b/~2..0b ~2..0b:~2..0b:~2..0b", [Year, Month, Day, Hour, Minute, Second])). +%% TODO: Review why filelib:ensure_dir/1 sometimes returns {error, eexist}. +%% There appears to be a race condition when calling ensure_dir from +%% multiple processes simultaneously. +%% This does not happen with -j1 but with anything higher than that. +%% So -j2 or default jobs setting will reveal the issue. +%% To reproduce make sure that the priv/mibs directory does not exist +%% $ rm -r priv +%% $ ./rebar -v compile +ensure_dir(Path) -> + case filelib:ensure_dir(Path) of + ok -> + ok; + {error,eexist} -> + ok; + Error -> + Error + end. + %% ==================================================================== %% Internal functions %% ====================================================================