|
-module(rebar_compile_SUITE).
|
|
|
|
-export([suite/0,
|
|
init_per_suite/1,
|
|
end_per_suite/1,
|
|
init_per_testcase/2,
|
|
end_per_testcase/2,
|
|
all/0,
|
|
build_basic_app/1,
|
|
build_release_apps/1,
|
|
build_checkout_apps/1,
|
|
build_checkout_deps/1,
|
|
build_all_srcdirs/1,
|
|
recompile_when_hrl_changes/1,
|
|
recompile_when_opts_change/1,
|
|
dont_recompile_when_opts_dont_change/1,
|
|
dont_recompile_yrl_or_xrl/1,
|
|
deps_in_path/1,
|
|
delete_beam_if_source_deleted/1,
|
|
checkout_priority/1,
|
|
compile_plugins/1,
|
|
highest_version_of_pkg_dep/1,
|
|
parse_transform_test/1]).
|
|
|
|
-include_lib("common_test/include/ct.hrl").
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
-include_lib("kernel/include/file.hrl").
|
|
|
|
suite() ->
|
|
[].
|
|
|
|
init_per_suite(Config) ->
|
|
Config.
|
|
|
|
end_per_suite(_Config) ->
|
|
ok.
|
|
|
|
init_per_testcase(_, Config) ->
|
|
rebar_test_utils:init_rebar_state(Config).
|
|
|
|
end_per_testcase(_, _Config) ->
|
|
catch meck:unload().
|
|
|
|
all() ->
|
|
[build_basic_app, build_release_apps,
|
|
build_checkout_apps, build_checkout_deps,
|
|
build_all_srcdirs, recompile_when_hrl_changes,
|
|
recompile_when_opts_change, dont_recompile_when_opts_dont_change,
|
|
dont_recompile_yrl_or_xrl, delete_beam_if_source_deleted,
|
|
deps_in_path, checkout_priority, compile_plugins, highest_version_of_pkg_dep,
|
|
parse_transform_test].
|
|
|
|
build_basic_app(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}).
|
|
|
|
build_release_apps(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name1 = rebar_test_utils:create_random_name("relapp1_"),
|
|
Vsn1 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1, [kernel, stdlib]),
|
|
Name2 = rebar_test_utils:create_random_name("relapp2_"),
|
|
Vsn2 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(filename:join([AppDir,Name2]), Name2, Vsn2, [kernel, stdlib]),
|
|
|
|
rebar_test_utils:run_and_check(
|
|
Config, [], ["compile"],
|
|
{ok, [{app, Name1}, {app, Name2}]}
|
|
).
|
|
|
|
build_checkout_apps(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
CheckoutsDir = ?config(checkouts, Config),
|
|
Name1 = rebar_test_utils:create_random_name("checkapp1_"),
|
|
Vsn1 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1, [kernel, stdlib]),
|
|
Name2 = rebar_test_utils:create_random_name("checkapp2_"),
|
|
Vsn2 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(filename:join([CheckoutsDir,Name2]), Name2, Vsn2, [kernel, stdlib]),
|
|
|
|
rebar_test_utils:run_and_check(
|
|
Config, [], ["compile"],
|
|
{ok, [{app, Name1}, {checkout, Name2}]}
|
|
).
|
|
|
|
build_checkout_deps(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
CheckoutsDir = ?config(checkouts, Config),
|
|
DepsDir = filename:join([AppDir, "_build", "default", "lib"]),
|
|
Name1 = rebar_test_utils:create_random_name("checkapp1_"),
|
|
Vsn1 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1, [kernel, stdlib]),
|
|
Name2 = rebar_test_utils:create_random_name("checkapp2_"),
|
|
Vsn2 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(filename:join([CheckoutsDir,Name2]), Name2, Vsn2, [kernel, stdlib]),
|
|
rebar_test_utils:create_app(filename:join([DepsDir,Name2]), Name2, Vsn1, [kernel, stdlib]),
|
|
|
|
Deps = [{list_to_atom(Name2), Vsn2, {git, "", ""}}],
|
|
{ok, RebarConfig} = file:consult(rebar_test_utils:create_config(AppDir, [{deps, Deps}])),
|
|
|
|
{ok, State} = rebar_test_utils:run_and_check(
|
|
Config, RebarConfig, ["compile"],
|
|
{ok, [{app, Name1}, {checkout, Name2}]}
|
|
),
|
|
code:add_paths(rebar_state:code_paths(State, all_deps)),
|
|
ok = application:load(list_to_atom(Name2)),
|
|
Loaded = application:loaded_applications(),
|
|
{_, _, Vsn2} = lists:keyfind(list_to_atom(Name2), 1, Loaded).
|
|
|
|
build_all_srcdirs(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
RebarConfig = [{erl_opts, [{src_dirs, ["src", "extra"]}]}],
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
ExtraSrc = <<"-module(extra_src).\n"
|
|
"-export([ok/0]).\n"
|
|
"ok() -> ok.\n">>,
|
|
|
|
ok = filelib:ensure_dir(filename:join([AppDir, "extra", "dummy"])),
|
|
ok = file:write_file(filename:join([AppDir, "extra", "extra_src.erl"]), ExtraSrc),
|
|
|
|
rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}),
|
|
|
|
%% check a beam corresponding to the src in the extra src_dir exists in ebin
|
|
EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
|
|
true = filelib:is_file(filename:join([EbinDir, "extra_src.beam"])),
|
|
|
|
%% check the extra src_dir was linked into the _build dir
|
|
true = filelib:is_dir(filename:join([AppDir, "_build", "default", "lib", Name, "extra"])).
|
|
|
|
recompile_when_hrl_changes(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
|
|
ExtraSrc = <<"-module(test_header_include).\n"
|
|
"-export([main/0]).\n"
|
|
"-include(\"test_header_include.hrl\").\n"
|
|
"main() -> ?SOME_DEFINE.\n">>,
|
|
|
|
ExtraHeader = <<"-define(SOME_DEFINE, true).\n">>,
|
|
HeaderFile = filename:join([AppDir, "src", "test_header_include.hrl"]),
|
|
ok = file:write_file(filename:join([AppDir, "src", "test_header_include.erl"]), ExtraSrc),
|
|
ok = file:write_file(HeaderFile, ExtraHeader),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
|
|
|
|
EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
|
|
{ok, Files} = file:list_dir(EbinDir),
|
|
ModTime = [filelib:last_modified(filename:join([EbinDir, F]))
|
|
|| F <- Files, filename:extension(F) == ".beam"],
|
|
|
|
timer:sleep(1000),
|
|
|
|
os:cmd("touch " ++ HeaderFile),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
|
|
|
|
{ok, NewFiles} = file:list_dir(EbinDir),
|
|
NewModTime = [filelib:last_modified(filename:join([EbinDir, F]))
|
|
|| F <- NewFiles, filename:extension(F) == ".beam"],
|
|
|
|
?assert(ModTime =/= NewModTime).
|
|
|
|
recompile_when_opts_change(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
|
|
|
|
EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
|
|
{ok, Files} = file:list_dir(EbinDir),
|
|
ModTime = [filelib:last_modified(filename:join([EbinDir, F]))
|
|
|| F <- Files, filename:extension(F) == ".beam"],
|
|
|
|
timer:sleep(1000),
|
|
|
|
rebar_test_utils:create_config(AppDir, [{erl_opts, [{d, some_define}]}]),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
|
|
|
|
{ok, NewFiles} = file:list_dir(EbinDir),
|
|
NewModTime = [filelib:last_modified(filename:join([EbinDir, F]))
|
|
|| F <- NewFiles, filename:extension(F) == ".beam"],
|
|
|
|
?assert(ModTime =/= NewModTime).
|
|
|
|
dont_recompile_when_opts_dont_change(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
|
|
|
|
EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
|
|
{ok, Files} = file:list_dir(EbinDir),
|
|
ModTime = [filelib:last_modified(filename:join([EbinDir, F]))
|
|
|| F <- Files, filename:extension(F) == ".beam"],
|
|
|
|
timer:sleep(1000),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
|
|
|
|
{ok, NewFiles} = file:list_dir(EbinDir),
|
|
NewModTime = [filelib:last_modified(filename:join([EbinDir, F]))
|
|
|| F <- NewFiles, filename:extension(F) == ".beam"],
|
|
|
|
?assert(ModTime == NewModTime).
|
|
|
|
dont_recompile_yrl_or_xrl(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
Xrl = filename:join([AppDir, "src", "not_a_real_xrl_" ++ Name ++ ".xrl"]),
|
|
ok = filelib:ensure_dir(Xrl),
|
|
XrlBody =
|
|
"Definitions."
|
|
"\n\n"
|
|
"D = [0-9]"
|
|
"\n\n"
|
|
"Rules."
|
|
"\n\n"
|
|
"{D}+ :"
|
|
" {token,{integer,TokenLine,list_to_integer(TokenChars)}}."
|
|
"\n\n"
|
|
"{D}+\\.{D}+((E|e)(\\+|\\-)?{D}+)? :"
|
|
" {token,{float,TokenLine,list_to_float(TokenChars)}}."
|
|
"\n\n"
|
|
"Erlang code.",
|
|
ok = ec_file:write(Xrl, XrlBody),
|
|
|
|
XrlBeam = filename:join([AppDir, "ebin", filename:basename(Xrl, ".xrl") ++ ".beam"]),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
|
|
|
|
ModTime = filelib:last_modified(XrlBeam),
|
|
|
|
timer:sleep(1000),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
|
|
|
|
NewModTime = filelib:last_modified(XrlBeam),
|
|
|
|
?assert(ModTime == NewModTime).
|
|
|
|
delete_beam_if_source_deleted(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
|
|
|
|
EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
|
|
SrcDir = filename:join([AppDir, "_build", "default", "lib", Name, "src"]),
|
|
?assert(filelib:is_regular(filename:join(EbinDir, "not_a_real_src_" ++ Name ++ ".beam"))),
|
|
file:delete(filename:join(SrcDir, "not_a_real_src_" ++ Name ++ ".erl")),
|
|
|
|
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
|
|
|
|
?assertNot(filelib:is_regular(filename:join(EbinDir, "not_a_real_src_" ++ Name ++ ".beam"))).
|
|
|
|
deps_in_path(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
StartPaths = code:get_path(),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
DepName = rebar_test_utils:create_random_name("dep1_"),
|
|
PkgName = rebar_test_utils:create_random_name("pkg1_"),
|
|
mock_git_resource:mock([]),
|
|
mock_pkg_resource:mock([
|
|
{pkgdeps, [{{iolist_to_binary(PkgName), iolist_to_binary(Vsn)}, []}]}
|
|
]),
|
|
|
|
RConfFile = rebar_test_utils:create_config(AppDir, [{deps, [
|
|
{list_to_atom(DepName), {git, "http://site.com/user/"++DepName++".git", {tag, Vsn}}},
|
|
{list_to_atom(PkgName), Vsn}
|
|
]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
%% Make sure apps we look for are not visible
|
|
%% Hope not to find src name
|
|
?assertEqual([], [Path || Path <- code:get_path(),
|
|
{match, _} <- [re:run(Path, DepName)]]),
|
|
%% Hope not to find pkg name in there
|
|
?assertEqual([], [Path || Path <- code:get_path(),
|
|
{match, _} <- [re:run(Path, PkgName)]]),
|
|
%% Build things
|
|
{ok, State} = rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {dep, DepName}, {dep, PkgName}]}
|
|
),
|
|
code:add_paths(rebar_state:code_paths(State, all_deps)),
|
|
%% Find src name in there
|
|
?assertNotEqual([], [Path || Path <- code:get_path(),
|
|
{match, _} <- [re:run(Path, DepName)]]),
|
|
%% find pkg name in there
|
|
?assertNotEqual([], [Path || Path <- code:get_path(),
|
|
{match, _} <- [re:run(Path, PkgName)]]),
|
|
code:set_path(StartPaths),
|
|
%% Make sure apps we look for are not visible again
|
|
%% Hope not to find src name
|
|
?assertEqual([], [Path || Path <- code:get_path(),
|
|
{match, _} <- [re:run(Path, DepName)]]),
|
|
%% Hope not to find pkg name in there
|
|
?assertEqual([], [Path || Path <- code:get_path(),
|
|
{match, _} <- [re:run(Path, PkgName)]]),
|
|
%% Rebuild
|
|
{ok, State1} = rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {dep, DepName}, {dep, PkgName}]}
|
|
),
|
|
%% Find src name in there
|
|
code:add_paths(rebar_state:code_paths(State1, all_deps)),
|
|
?assertNotEqual([], [Path || Path <- code:get_path(),
|
|
{match, _} <- [re:run(Path, DepName)]]),
|
|
%% find pkg name in there
|
|
?assertNotEqual([], [Path || Path <- code:get_path(),
|
|
{match, _} <- [re:run(Path, PkgName)]]).
|
|
|
|
checkout_priority(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
CheckoutsDir = ?config(checkouts, Config),
|
|
StartPaths = code:get_path(),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
DepName = rebar_test_utils:create_random_name("dep1_"),
|
|
PkgName = rebar_test_utils:create_random_name("pkg1_"),
|
|
mock_git_resource:mock([]),
|
|
mock_pkg_resource:mock([
|
|
{pkgdeps, [{{iolist_to_binary(PkgName), iolist_to_binary(Vsn)}, []}]}
|
|
]),
|
|
|
|
RConfFile = rebar_test_utils:create_config(AppDir, [{deps, [
|
|
{list_to_atom(DepName), {git, "http://site.com/user/"++DepName++".git", {tag, Vsn}}},
|
|
{list_to_atom(PkgName), Vsn}
|
|
]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {dep, DepName}, {dep, PkgName}]}
|
|
),
|
|
|
|
%% Build two checkout apps similar to dependencies to be fetched,
|
|
%% but on a different version
|
|
Vsn2 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(filename:join([CheckoutsDir,DepName]), DepName, Vsn2, [kernel, stdlib]),
|
|
rebar_test_utils:create_app(filename:join([CheckoutsDir,PkgName]), PkgName, Vsn2, [kernel, stdlib]),
|
|
|
|
%% Rebuild and make sure the checkout apps are in path
|
|
code:set_path(StartPaths),
|
|
{ok, State} = rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {checkout, DepName}, {checkout, PkgName}]}
|
|
),
|
|
code:add_paths(rebar_state:code_paths(State, all_deps)),
|
|
[DepPath] = [Path || Path <- code:get_path(),
|
|
{match, _} <- [re:run(Path, DepName)]],
|
|
[PkgPath] = [Path || Path <- code:get_path(),
|
|
{match, _} <- [re:run(Path, PkgName)]],
|
|
|
|
{ok, [DepApp]} = file:consult(filename:join([DepPath, DepName ++ ".app"])),
|
|
{ok, [PkgApp]} = file:consult(filename:join([PkgPath, PkgName ++ ".app"])),
|
|
|
|
{application, _, DepProps} = DepApp,
|
|
{application, _, PkgProps} = PkgApp,
|
|
|
|
?assertEqual(Vsn2, proplists:get_value(vsn, DepProps)),
|
|
?assertEqual(Vsn2, proplists:get_value(vsn, PkgProps)).
|
|
|
|
%% Tests that compiling a project installs and compiles the plugins of deps
|
|
compile_plugins(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
DepName = rebar_test_utils:create_random_name("dep1_"),
|
|
PluginName = rebar_test_utils:create_random_name("plugin1_"),
|
|
mock_git_resource:mock([{config, [{plugins, [
|
|
{list_to_atom(PluginName), Vsn}
|
|
]}]}]),
|
|
mock_pkg_resource:mock([
|
|
{pkgdeps, [{{iolist_to_binary(PluginName), iolist_to_binary(Vsn)}, []}]}
|
|
]),
|
|
|
|
RConfFile =
|
|
rebar_test_utils:create_config(AppDir,
|
|
[{deps, [
|
|
{list_to_atom(DepName), {git, "http://site.com/user/"++DepName++".git", {tag, Vsn}}}
|
|
]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {plugin, PluginName}, {dep, DepName}]}
|
|
).
|
|
|
|
highest_version_of_pkg_dep(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
PkgName = rebar_test_utils:create_random_name("pkg1_"),
|
|
mock_git_resource:mock([]),
|
|
mock_pkg_resource:mock([
|
|
{pkgdeps, [{{iolist_to_binary(PkgName), <<"0.1.0">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.0.1">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.1.3">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.1.1">>}, []}]}
|
|
]),
|
|
|
|
RConfFile = rebar_test_utils:create_config(AppDir, [{deps, [list_to_atom(PkgName)]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {dep, PkgName, <<"0.1.3">>}]}
|
|
).
|
|
|
|
parse_transform_test(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
RebarConfig = [{erl_opts, [{parse_transform, pascal}]}],
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
ExtraSrc = <<"-module(pascal). "
|
|
"-export([parse_transform/2]). "
|
|
"parse_transform(Forms, _Options) -> "
|
|
"Forms.">>,
|
|
|
|
ok = file:write_file(filename:join([AppDir, "src", "pascal.erl"]), ExtraSrc),
|
|
|
|
rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}),
|
|
|
|
EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
|
|
true = filelib:is_file(filename:join([EbinDir, "pascal.beam"])).
|