From a7b7205d072702247518019ae2a1540a323871fe Mon Sep 17 00:00:00 2001 From: Tomas Abrahamsson Date: Tue, 23 Dec 2014 15:56:06 +0100 Subject: [PATCH] Revert "Merge pull request #386 from tomas-abrahamsson/gpb-recompilation-detection" This reverts commit 81063d33f0939416f9bc0a7fc6a4cc326a0059d2, reversing changes made to 6584defdda209d43505baee21b0f9f4d7f829573. This was reverted because it changed the gpb compiler to not use rebar_base_compiler. That change was to add support for target name prefixes, but it is better to add that support to rebar_base_compiler. --- inttest/proto_gpb/proto_gpb_rt.erl | 50 ------------------ src/rebar_proto_gpb_compiler.erl | 83 ++++++++++-------------------- 2 files changed, 27 insertions(+), 106 deletions(-) diff --git a/inttest/proto_gpb/proto_gpb_rt.erl b/inttest/proto_gpb/proto_gpb_rt.erl index cfbd1b4..aafc677 100644 --- a/inttest/proto_gpb/proto_gpb_rt.erl +++ b/inttest/proto_gpb/proto_gpb_rt.erl @@ -29,8 +29,6 @@ run/1]). -include_lib("eunit/include/eunit.hrl"). --include_lib("kernel/include/file.hrl"). --include_lib("deps/retest/include/retest.hrl"). -define(MODULES, [foo, @@ -44,13 +42,6 @@ test4_gpb, test5_gpb]). --define(SOURCE_PROTO_FILES, - ["test.proto", - "a/test2.proto", - "a/b/test3.proto", - "c/test4.proto", - "c/d/test5.proto"]). - files() -> [ {copy, "../../rebar", "rebar"}, @@ -69,17 +60,6 @@ run(_Dir) -> %% generating the test_gpb.hrl file, and also that it generated %% the .hrl file was generated before foo was compiled. ok = check_beams_generated(), - - ?DEBUG("Verifying recompilation~n", []), - TestErl = hd(generated_erl_files()), - TestProto = hd(source_proto_files()), - make_proto_newer_than_erl(TestProto, TestErl), - TestMTime1 = read_mtime(TestErl), - ?assertMatch({ok, _}, retest_sh:run("./rebar compile", [])), - TestMTime2 = read_mtime(TestErl), - ?assert(TestMTime2 > TestMTime1), - - ?DEBUG("Verify cleanup~n", []), ?assertMatch({ok, _}, retest_sh:run("./rebar clean", [])), ok = check_files_deleted(), ok. @@ -101,12 +81,6 @@ generated_erl_files() -> generated_hrl_files() -> add_dir("include", add_ext(?GENERATED_MODULES, ".hrl")). -generated_beam_files() -> - add_dir("ebin", add_ext(?GENERATED_MODULES, ".beam")). - -source_proto_files() -> - add_dir("src", ?SOURCE_PROTO_FILES). - file_does_not_exist(F) -> not filelib:is_regular(F). @@ -116,30 +90,6 @@ add_ext(Modules, Ext) -> add_dir(Dir, Files) -> [filename:join(Dir, File) || File <- Files]. -read_mtime(File) -> - {ok, #file_info{mtime=MTime}} = file:read_file_info(File), - MTime. - - -make_proto_newer_than_erl(Proto, Erl) -> - %% Do this by back-dating the erl file instead of touching the - %% proto file. Do this instead of sleeping for a second to get a - %% reliable test. Sleeping would have been needed sin ce the - %% #file_info{} (used by eg. filelib:last_modified) does not have - %% sub-second resolution (even though most file systems have). - {ok, #file_info{mtime=ProtoMTime}} = file:read_file_info(Proto), - {ok, ErlInfo} = file:read_file_info(Erl), - OlderMTime = update_seconds_to_datetime(ProtoMTime, -2), - OlderErlInfo = ErlInfo#file_info{mtime = OlderMTime}, - ok = file:write_file_info(Erl, OlderErlInfo). - -update_seconds_to_datetime(DT, ToAdd) -> - calendar:gregorian_seconds_to_datetime( - calendar:datetime_to_gregorian_seconds(DT) + ToAdd). - -touch_file(File) -> - ?assertMatch({ok, _}, retest_sh:run("touch " ++ File, [])). - check(Check, Files) -> lists:foreach( fun(F) -> diff --git a/src/rebar_proto_gpb_compiler.erl b/src/rebar_proto_gpb_compiler.erl index d6c2c44..32a1f6d 100644 --- a/src/rebar_proto_gpb_compiler.erl +++ b/src/rebar_proto_gpb_compiler.erl @@ -42,36 +42,29 @@ key() -> gpb. -proto_compile(Config, _AppFile, ProtoFiles) -> +proto_compile(Config, _AppFile, _ProtoFiles) -> %% Check for gpb library -- if it's not present, fail %% since we have.proto files that need building case gpb_is_present() of true -> - UserGpbOpts = user_gpb_opts(Config), - lists:foreach( - fun(ProtoFile) -> - GpbOpts = UserGpbOpts ++ default_dest_opts() - ++ default_include_opts(ProtoFile), - - case needs_compile(ProtoFile, GpbOpts) of - true -> - compile_gpb(ProtoFile, GpbOpts); - false -> - ok - end - end, - ProtoFiles); + rebar_base_compiler:run(Config, [], + "src", ".proto", + "src", ".erl", + fun compile_gpb/3, + [{check_last_mod, true}]); false -> ?ERROR("The gpb library is not present in code path!\n", []), ?FAIL end. proto_clean(Config, _AppFile, ProtoFiles) -> - GpbOpts = user_gpb_opts(Config) ++ default_dest_opts(), + GpbOpts = gpb_opts(Config), + MPrefix = proplists:get_value(module_name_prefix, GpbOpts, ""), + MSuffix = proplists:get_value(module_name_suffix, GpbOpts, ""), rebar_file_utils:delete_each( - [beam_file(F, GpbOpts) || F <- ProtoFiles] - ++ [erl_file(F, GpbOpts) || F <- ProtoFiles] - ++ [hrl_file(F, GpbOpts) || F <- ProtoFiles]), + [beam_relpath(MPrefix, F, MSuffix) || F <- ProtoFiles] + ++ [erl_relpath(MPrefix, F, MSuffix) || F <- ProtoFiles] + ++ [hrl_relpath(MPrefix, F, MSuffix) || F <- ProtoFiles]), ok. %% =================================================================== @@ -89,27 +82,17 @@ proto_info(help, compile) -> proto_info(help, clean) -> ?CONSOLE("", []). +gpb_opts(Config) -> + rebar_config:get_local(Config, gpb_opts, []). + gpb_is_present() -> code:which(gpb) =/= non_existing. -user_gpb_opts(Config) -> - rebar_config:get_local(Config, gpb_opts, []). - -default_dest_opts() -> - [{o_erl, "src"}, {o_hrl, "include"}]. - -default_include_opts(Source) -> - SourceFullPath = filename:absname(Source), - [{i,filename:dirname(SourceFullPath)}]. - -needs_compile(ProtoFile, GpbOpts) -> - Erl = erl_file(ProtoFile, GpbOpts), - Hrl = hrl_file(ProtoFile, GpbOpts), - filelib:last_modified(Erl) < filelib:last_modified(ProtoFile) orelse - filelib:last_modified(Hrl) < filelib:last_modified(ProtoFile). - -compile_gpb(Source, GpbOpts) -> +compile_gpb(Source, _Target, Config) -> SourceFullPath = filename:absname(Source), + DefaultDestOpts = [{o_erl, "src"}, {o_hrl, "include"}], + SelfIncludeOpt = [{i,filename:dirname(SourceFullPath)}], + GpbOpts = gpb_opts(Config) ++ DefaultDestOpts ++ SelfIncludeOpt, ok = filelib:ensure_dir(filename:join("ebin", "dummy")), ok = filelib:ensure_dir(filename:join("include", "dummy")), case gpb_compile:file(SourceFullPath, GpbOpts) of @@ -120,28 +103,16 @@ compile_gpb(Source, GpbOpts) -> ?FAIL end. -beam_file(ProtoFile, GpbOpts) -> - proto_filename_to_path("ebin", ProtoFile, ".beam", GpbOpts). +beam_relpath(Prefix, Proto, Suffix) -> + proto_filename_to_relpath("ebin", Prefix, Proto, Suffix, ".beam"). -erl_file(ProtoFile, GpbOpts) -> - ErlOutDir = get_erl_outdir(GpbOpts), - proto_filename_to_path(ErlOutDir, ProtoFile, ".erl", GpbOpts). +erl_relpath(Prefix, Proto, Suffix) -> + proto_filename_to_relpath("src", Prefix, Proto, Suffix, ".erl"). -hrl_file(ProtoFile, GpbOpts) -> - HrlOutDir = get_hrl_outdir(GpbOpts), - proto_filename_to_path(HrlOutDir, ProtoFile, ".hrl", GpbOpts). +hrl_relpath(Prefix, Proto, Suffix) -> + proto_filename_to_relpath("include", Prefix, Proto, Suffix, ".hrl"). -proto_filename_to_path(Dir, ProtoFile, NewExt, GpbOpts) -> - BaseNoExt = filename:basename(ProtoFile, ".proto"), - Prefix = proplists:get_value(module_name_prefix, GpbOpts, ""), - Suffix = proplists:get_value(module_name_suffix, GpbOpts, ""), +proto_filename_to_relpath(Dir, Prefix, Proto, Suffix, NewExt) -> + BaseNoExt = filename:basename(Proto, ".proto"), filename:join([Dir, Prefix ++ BaseNoExt ++ Suffix ++ NewExt]). -get_erl_outdir(Opts) -> - proplists:get_value(o_erl, Opts, get_outdir(Opts)). - -get_hrl_outdir(Opts) -> - proplists:get_value(o_hrl, Opts, get_outdir(Opts)). - -get_outdir(Opts) -> - proplists:get_value(o, Opts, ".").