1
0

erlang_check_file.erl 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/env escript
  2. main([File]) ->
  3. Dir = get_root(filename:dirname(File)),
  4. Defs = [strong_validation,
  5. warn_export_all,
  6. warn_export_vars,
  7. warn_shadow_vars,
  8. warn_obsolete_guard,
  9. warn_unused_import,
  10. report,
  11. {i, Dir ++ "/include"}],
  12. RebarFile = rebar_file(Dir),
  13. RebarOpts = rebar_opts(Dir ++ "/" ++ RebarFile),
  14. code:add_patha(filename:absname("ebin")),
  15. compile:file(File, Defs ++ RebarOpts);
  16. main(_) ->
  17. io:format("Usage: ~s <file>~n", [escript:script_name()]),
  18. halt(1).
  19. rebar_file(Dir) ->
  20. DirList = filename:split(Dir),
  21. case lists:last(DirList) of
  22. "test" ->
  23. "rebar.test.config";
  24. _ ->
  25. "rebar.config"
  26. end.
  27. rebar_opts(RebarFile) ->
  28. Dir = get_root(filename:dirname(RebarFile)),
  29. case file:consult(RebarFile) of
  30. {ok, Terms} ->
  31. RebarLibDirs = proplists:get_value(lib_dirs, Terms, []),
  32. lists:foreach(
  33. fun(LibDir) ->
  34. code:add_pathsa(filelib:wildcard(LibDir ++ "/*/ebin"))
  35. end, RebarLibDirs),
  36. RebarDepsDir = proplists:get_value(deps_dir, Terms, "deps"),
  37. code:add_pathsa(filelib:wildcard(RebarDepsDir ++ "/*/ebin")),
  38. IncludeDeps = {i, filename:join(Dir, RebarDepsDir)},
  39. proplists:get_value(erl_opts, Terms, []) ++ [IncludeDeps];
  40. {error, _} when RebarFile == "rebar.config" ->
  41. fallback_opts();
  42. {error, _} ->
  43. rebar_opts("rebar.config")
  44. end.
  45. fallback_opts() ->
  46. code:add_pathsa(filelib:wildcard("deps/*/ebin")),
  47. code:add_pathsa(nested_app_ebins()),
  48. [ { i, filename:absname("deps") }
  49. | [ { i, filename:absname(Path) } || Path <- filelib:wildcard("deps/*/apps")]
  50. ].
  51. nested_app_ebins() ->
  52. DetectedAppSrcFiles = filelib:wildcard("deps/*/apps/**/*.app.src"),
  53. [apps_dir_from_src(AppSrcFile)||AppSrcFile<-DetectedAppSrcFiles].
  54. apps_dir_from_src(SrcFile) ->
  55. SrcDir = filename:dirname(SrcFile),
  56. filename:join(SrcDir, "../../ebin").
  57. get_root(Dir) ->
  58. Path = filename:split(filename:absname(Dir)),
  59. filename:join(get_root(lists:reverse(Path), Path)).
  60. get_root([], Path) ->
  61. Path;
  62. get_root(["src" | Tail], _Path) ->
  63. lists:reverse(Tail);
  64. get_root(["test" | Tail], _Path) ->
  65. lists:reverse(Tail);
  66. get_root([_ | Tail], Path) ->
  67. get_root(Tail, Path).