summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rebar_erlc_compiler.erl3
-rw-r--r--src/rebar_utils.erl21
2 files changed, 22 insertions, 2 deletions
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
%% ====================================================================