You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.2 KiB

  1. -module(rebar_compiler_mib).
  2. -behaviour(rebar_compiler).
  3. -export([context/1,
  4. needed_files/3,
  5. dependencies/3,
  6. compile/4,
  7. clean/2]).
  8. -include("rebar.hrl").
  9. -include_lib("stdlib/include/erl_compile.hrl").
  10. context(AppInfo) ->
  11. Dir = rebar_app_info:dir(AppInfo),
  12. Mappings = [{".bin", filename:join([Dir, "priv", "mibs"])},
  13. {".hrl", filename:join(Dir, "include")}],
  14. #{src_dirs => ["mibs"],
  15. include_dirs => [],
  16. src_ext => ".mib",
  17. out_mappings => Mappings}.
  18. needed_files(_, FoundFiles, AppInfo) ->
  19. FirstFiles = [],
  20. %% Remove first files from found files
  21. RestFiles = [Source || Source <- FoundFiles, not lists:member(Source, FirstFiles)],
  22. Opts = rebar_opts:get(rebar_app_info:opts(AppInfo), mib_opts, []),
  23. {{FirstFiles, Opts}, {RestFiles, Opts}}.
  24. dependencies(_, _, _) ->
  25. [].
  26. compile(Source, OutDirs, _, Opts) ->
  27. {_, BinOut} = lists:keyfind(".bin", 1, OutDirs),
  28. {_, HrlOut} = lists:keyfind(".hrl", 1, OutDirs),
  29. ok = rebar_file_utils:ensure_dir(BinOut),
  30. ok = rebar_file_utils:ensure_dir(HrlOut),
  31. Mib = filename:join(BinOut, filename:basename(Source, ".mib")),
  32. HrlFilename = Mib ++ ".hrl",
  33. AllOpts = [{outdir, BinOut}, {i, [BinOut]}] ++ Opts,
  34. case snmpc:compile(Source, AllOpts) of
  35. {ok, _} ->
  36. MibToHrlOpts =
  37. case proplists:get_value(verbosity, AllOpts, undefined) of
  38. undefined ->
  39. #options{specific = [],
  40. cwd = rebar_dir:get_cwd()};
  41. Verbosity ->
  42. #options{specific = [{verbosity, Verbosity}],
  43. cwd = rebar_dir:get_cwd()}
  44. end,
  45. ok = snmpc:mib_to_hrl(Mib, Mib, MibToHrlOpts),
  46. rebar_file_utils:mv(HrlFilename, HrlOut),
  47. ok;
  48. {error, compilation_failed} ->
  49. ?FAIL
  50. end.
  51. clean(MibFiles, AppInfo) ->
  52. AppDir = rebar_app_info:dir(AppInfo),
  53. MIBs = [filename:rootname(filename:basename(MIB)) || MIB <- MibFiles],
  54. rebar_file_utils:delete_each(
  55. [filename:join([AppDir, "include", MIB++".hrl"]) || MIB <- MIBs]),
  56. ok = rebar_file_utils:rm_rf(filename:join([AppDir, "priv/mibs/*.bin"])).