您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

51 行
1.5 KiB

  1. -module(rebar_compiler_yrl).
  2. -behaviour(rebar_compiler).
  3. -export([context/1,
  4. needed_files/4,
  5. dependencies/3,
  6. compile/4,
  7. clean/2]).
  8. context(AppInfo) ->
  9. Dir = rebar_app_info:dir(AppInfo),
  10. Mappings = [{".erl", filename:join([Dir, "src"])}],
  11. #{src_dirs => ["src"],
  12. include_dirs => [],
  13. src_ext => ".yrl",
  14. out_mappings => Mappings}.
  15. needed_files(_, FoundFiles, Mappings, AppInfo) ->
  16. FirstFiles = [],
  17. %% Remove first files from found files
  18. RestFiles = [Source || Source <- FoundFiles,
  19. not lists:member(Source, FirstFiles),
  20. rebar_compiler:needs_compile(Source, ".erl", Mappings)],
  21. Opts = rebar_opts:get(rebar_app_info:opts(AppInfo), yrl_opts, []),
  22. Opts1 = rebar_compiler_xrl:update_opts(Opts, AppInfo),
  23. {{FirstFiles, Opts1}, {RestFiles, Opts1}}.
  24. dependencies(_, _, _) ->
  25. [].
  26. compile(Source, [{_, OutDir}], _, Opts) ->
  27. BaseName = filename:basename(Source, ".yrl"),
  28. Target = filename:join([OutDir, BaseName]),
  29. AllOpts = [{parserfile, Target}, {return, true} | Opts],
  30. case yecc:file(Source, AllOpts) of
  31. {ok, _} ->
  32. ok;
  33. {ok, _Mod, Ws} ->
  34. rebar_compiler:ok_tuple(Source, Ws);
  35. {error, Es, Ws} ->
  36. rebar_compiler:error_tuple(Source, Es, Ws, AllOpts)
  37. end.
  38. clean(YrlFiles, _AppInfo) ->
  39. rebar_file_utils:delete_each(
  40. [rebar_utils:to_list(re:replace(F, "\\.yrl$", ".erl", [unicode]))
  41. || F <- YrlFiles]).