|
|
@ -42,7 +42,9 @@ |
|
|
|
deps_build_in_prod/1, |
|
|
|
include_file_relative_to_working_directory/1, |
|
|
|
include_file_in_src/1, |
|
|
|
always_recompile_when_erl_compiler_options_set/1]). |
|
|
|
always_recompile_when_erl_compiler_options_set/1, |
|
|
|
recompile_when_parse_transform_inline_changes/1, |
|
|
|
recompile_when_parse_transform_as_opt_changes/1]). |
|
|
|
|
|
|
|
-include_lib("common_test/include/ct.hrl"). |
|
|
|
-include_lib("eunit/include/eunit.hrl"). |
|
|
@ -65,7 +67,9 @@ all() -> |
|
|
|
parse_transform_test, erl_first_files_test, mib_test, |
|
|
|
umbrella_mib_first_test, only_default_transitive_deps, |
|
|
|
clean_all, override_deps, profile_override_deps, deps_build_in_prod, |
|
|
|
include_file_relative_to_working_directory, include_file_in_src] ++ |
|
|
|
include_file_relative_to_working_directory, include_file_in_src, |
|
|
|
recompile_when_parse_transform_as_opt_changes, |
|
|
|
recompile_when_parse_transform_inline_changes] ++ |
|
|
|
case erlang:function_exported(os, unsetenv, 1) of |
|
|
|
true -> [always_recompile_when_erl_compiler_options_set]; |
|
|
|
false -> [] |
|
|
@ -1348,5 +1352,102 @@ always_recompile_when_erl_compiler_options_set(Config) -> |
|
|
|
_ -> os:putenv("ERL_COMPILER_OPTIONS", ExistingEnv) |
|
|
|
end. |
|
|
|
|
|
|
|
recompile_when_parse_transform_inline_changes(Config) -> |
|
|
|
AppDir = ?config(apps, Config), |
|
|
|
|
|
|
|
Name = rebar_test_utils:create_random_name("parse_transform_inline_"), |
|
|
|
Vsn = rebar_test_utils:create_random_vsn(), |
|
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), |
|
|
|
|
|
|
|
ok = filelib:ensure_dir(filename:join([AppDir, "src", "dummy"])), |
|
|
|
|
|
|
|
ModSrc = <<"-module(example).\n" |
|
|
|
"-export([foo/2]).\n" |
|
|
|
"-compile([{parse_transform, example_parse_transform}]).\n" |
|
|
|
"foo(_, _) -> ok.">>, |
|
|
|
|
|
|
|
ok = file:write_file(filename:join([AppDir, "src", "example.erl"]), |
|
|
|
ModSrc), |
|
|
|
|
|
|
|
ParseTransform = <<"-module(example_parse_transform).\n" |
|
|
|
"-export([parse_transform/2]).\n" |
|
|
|
"parse_transform(AST, _) -> AST.\n">>, |
|
|
|
|
|
|
|
ok = file:write_file(filename:join([AppDir, "src", "example_parse_transform.erl"]), |
|
|
|
ParseTransform), |
|
|
|
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}), |
|
|
|
|
|
|
|
EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), |
|
|
|
{ok, Files} = rebar_utils:list_dir(EbinDir), |
|
|
|
ModTime = [filelib:last_modified(filename:join([EbinDir, F])) |
|
|
|
|| F <- Files, filename:basename(F, ".beam") == "example"], |
|
|
|
|
|
|
|
timer:sleep(1000), |
|
|
|
|
|
|
|
NewParseTransform = <<"-module(example_parse_transform).\n" |
|
|
|
"-export([parse_transform/2]).\n" |
|
|
|
"parse_transform(AST, _) -> identity(AST).\n" |
|
|
|
"identity(AST) -> AST.\n">>, |
|
|
|
|
|
|
|
ok = file:write_file(filename:join([AppDir, "src", "example_parse_transform.erl"]), |
|
|
|
NewParseTransform), |
|
|
|
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}), |
|
|
|
|
|
|
|
{ok, NewFiles} = rebar_utils:list_dir(EbinDir), |
|
|
|
NewModTime = [filelib:last_modified(filename:join([EbinDir, F])) |
|
|
|
|| F <- NewFiles, filename:basename(F, ".beam") == "example"], |
|
|
|
|
|
|
|
?assert(ModTime =/= NewModTime). |
|
|
|
|
|
|
|
recompile_when_parse_transform_as_opt_changes(Config) -> |
|
|
|
AppDir = ?config(apps, Config), |
|
|
|
|
|
|
|
Name = rebar_test_utils:create_random_name("parse_transform_opt_"), |
|
|
|
Vsn = rebar_test_utils:create_random_vsn(), |
|
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), |
|
|
|
|
|
|
|
ok = filelib:ensure_dir(filename:join([AppDir, "src", "dummy"])), |
|
|
|
|
|
|
|
ModSrc = <<"-module(example).\n" |
|
|
|
"-export([foo/2]).\n" |
|
|
|
"foo(_, _) -> ok.">>, |
|
|
|
|
|
|
|
ok = file:write_file(filename:join([AppDir, "src", "example.erl"]), |
|
|
|
ModSrc), |
|
|
|
|
|
|
|
ParseTransform = <<"-module(example_parse_transform).\n" |
|
|
|
"-export([parse_transform/2]).\n" |
|
|
|
"parse_transform(AST, _) -> AST.">>, |
|
|
|
|
|
|
|
ok = file:write_file(filename:join([AppDir, "src", "example_parse_transform.erl"]), |
|
|
|
ParseTransform), |
|
|
|
|
|
|
|
RebarConfig = [{erl_opts, [{parse_transform, example_parse_transform}]}], |
|
|
|
|
|
|
|
rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), |
|
|
|
|
|
|
|
EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), |
|
|
|
{ok, Files} = rebar_utils:list_dir(EbinDir), |
|
|
|
ModTime = [filelib:last_modified(filename:join([EbinDir, F])) |
|
|
|
|| F <- Files, filename:basename(F, ".beam") == "example"], |
|
|
|
|
|
|
|
timer:sleep(1000), |
|
|
|
|
|
|
|
NewParseTransform = <<"-module(example_parse_transform).\n" |
|
|
|
"-export([parse_transform/2]).\n" |
|
|
|
"parse_transform(AST, _) -> identity(AST).\n" |
|
|
|
"identity(AST) -> AST.">>, |
|
|
|
|
|
|
|
ok = file:write_file(filename:join([AppDir, "src", "example_parse_transform.erl"]), |
|
|
|
NewParseTransform), |
|
|
|
|
|
|
|
rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), |
|
|
|
|
|
|
|
{ok, NewFiles} = rebar_utils:list_dir(EbinDir), |
|
|
|
NewModTime = [filelib:last_modified(filename:join([EbinDir, F])) |
|
|
|
|| F <- NewFiles, filename:basename(F, ".beam") == "example"], |
|
|
|
|
|
|
|
?assert(ModTime =/= NewModTime). |
|
|
|
|