Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

213 рядки
7.5 KiB

10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
  1. -module(rebar_compile_SUITE).
  2. -export([suite/0,
  3. init_per_suite/1,
  4. end_per_suite/1,
  5. init_per_testcase/2,
  6. all/0,
  7. build_basic_app/1,
  8. build_release_apps/1,
  9. build_checkout_apps/1,
  10. build_checkout_deps/1,
  11. build_all_srcdirs/1,
  12. recompile_when_opts_change/1,
  13. dont_recompile_when_opts_dont_change/1,
  14. dont_recompile_yrl_or_xrl/1]).
  15. -include_lib("common_test/include/ct.hrl").
  16. -include_lib("eunit/include/eunit.hrl").
  17. -include_lib("kernel/include/file.hrl").
  18. suite() ->
  19. [].
  20. init_per_suite(Config) ->
  21. Config.
  22. end_per_suite(_Config) ->
  23. ok.
  24. init_per_testcase(_, Config) ->
  25. rebar_test_utils:init_rebar_state(Config).
  26. all() ->
  27. [build_basic_app, build_release_apps,
  28. build_checkout_apps, build_checkout_deps,
  29. build_all_srcdirs,
  30. recompile_when_opts_change, dont_recompile_when_opts_dont_change,
  31. dont_recompile_yrl_or_xrl].
  32. build_basic_app(Config) ->
  33. AppDir = ?config(apps, Config),
  34. Name = rebar_test_utils:create_random_name("app1_"),
  35. Vsn = rebar_test_utils:create_random_vsn(),
  36. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  37. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}).
  38. build_release_apps(Config) ->
  39. AppDir = ?config(apps, Config),
  40. Name1 = rebar_test_utils:create_random_name("relapp1_"),
  41. Vsn1 = rebar_test_utils:create_random_vsn(),
  42. rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1, [kernel, stdlib]),
  43. Name2 = rebar_test_utils:create_random_name("relapp2_"),
  44. Vsn2 = rebar_test_utils:create_random_vsn(),
  45. rebar_test_utils:create_app(filename:join([AppDir,Name2]), Name2, Vsn2, [kernel, stdlib]),
  46. rebar_test_utils:run_and_check(
  47. Config, [], ["compile"],
  48. {ok, [{app, Name1}, {app, Name2}]}
  49. ).
  50. build_checkout_apps(Config) ->
  51. AppDir = ?config(apps, Config),
  52. CheckoutsDir = ?config(checkouts, Config),
  53. Name1 = rebar_test_utils:create_random_name("checkapp1_"),
  54. Vsn1 = rebar_test_utils:create_random_vsn(),
  55. rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1, [kernel, stdlib]),
  56. Name2 = rebar_test_utils:create_random_name("checkapp2_"),
  57. Vsn2 = rebar_test_utils:create_random_vsn(),
  58. rebar_test_utils:create_app(filename:join([CheckoutsDir,Name2]), Name2, Vsn2, [kernel, stdlib]),
  59. rebar_test_utils:run_and_check(
  60. Config, [], ["compile"],
  61. {ok, [{app, Name1}, {checkout, Name2}]}
  62. ).
  63. build_checkout_deps(Config) ->
  64. AppDir = ?config(apps, Config),
  65. CheckoutsDir = ?config(checkouts, Config),
  66. DepsDir = filename:join([AppDir, "_build", "default", "lib"]),
  67. Name1 = rebar_test_utils:create_random_name("checkapp1_"),
  68. Vsn1 = rebar_test_utils:create_random_vsn(),
  69. rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1, [kernel, stdlib]),
  70. Name2 = rebar_test_utils:create_random_name("checkapp2_"),
  71. Vsn2 = rebar_test_utils:create_random_vsn(),
  72. rebar_test_utils:create_app(filename:join([CheckoutsDir,Name2]), Name2, Vsn2, [kernel, stdlib]),
  73. rebar_test_utils:create_app(filename:join([DepsDir,Name2]), Name2, Vsn1, [kernel, stdlib]),
  74. rebar_test_utils:run_and_check(
  75. Config, [], ["compile"],
  76. {ok, [{app, Name1}, {checkout, Name2}]}
  77. ),
  78. ok = application:load(list_to_atom(Name2)),
  79. Loaded = application:loaded_applications(),
  80. {_, _, Vsn2} = lists:keyfind(list_to_atom(Name2), 1, Loaded).
  81. build_all_srcdirs(Config) ->
  82. AppDir = ?config(apps, Config),
  83. RebarConfig = [{erl_opts, [{src_dirs, ["src", "extra"]}]}],
  84. Name = rebar_test_utils:create_random_name("app1_"),
  85. Vsn = rebar_test_utils:create_random_vsn(),
  86. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  87. ExtraSrc = <<"-module(extra_src).\n"
  88. "-export([ok/0]).\n"
  89. "ok() -> ok.\n">>,
  90. ok = filelib:ensure_dir(filename:join([AppDir, "extra", "dummy"])),
  91. ok = file:write_file(filename:join([AppDir, "extra", "extra_src.erl"]), ExtraSrc),
  92. rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}),
  93. %% check a beam corresponding to the src in the extra src_dir exists in ebin
  94. EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
  95. true = filelib:is_file(filename:join([EbinDir, "extra_src.beam"])),
  96. %% check the extra src_dir was linked into the _build dir
  97. true = filelib:is_dir(filename:join([AppDir, "_build", "default", "lib", Name, "extra"])).
  98. recompile_when_opts_change(Config) ->
  99. AppDir = ?config(apps, Config),
  100. Name = rebar_test_utils:create_random_name("app1_"),
  101. Vsn = rebar_test_utils:create_random_vsn(),
  102. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  103. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  104. EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
  105. {ok, Files} = file:list_dir(EbinDir),
  106. ModTime = [filelib:last_modified(filename:join([EbinDir, F]))
  107. || F <- Files, filename:extension(F) == ".beam"],
  108. timer:sleep(1000),
  109. rebar_test_utils:create_config(AppDir, [{erl_opts, [{d, some_define}]}]),
  110. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  111. {ok, NewFiles} = file:list_dir(EbinDir),
  112. NewModTime = [filelib:last_modified(filename:join([EbinDir, F]))
  113. || F <- NewFiles, filename:extension(F) == ".beam"],
  114. ?assert(ModTime =/= NewModTime).
  115. dont_recompile_when_opts_dont_change(Config) ->
  116. AppDir = ?config(apps, Config),
  117. Name = rebar_test_utils:create_random_name("app1_"),
  118. Vsn = rebar_test_utils:create_random_vsn(),
  119. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  120. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  121. EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
  122. {ok, Files} = file:list_dir(EbinDir),
  123. ModTime = [filelib:last_modified(filename:join([EbinDir, F]))
  124. || F <- Files, filename:extension(F) == ".beam"],
  125. timer:sleep(1000),
  126. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  127. {ok, NewFiles} = file:list_dir(EbinDir),
  128. NewModTime = [filelib:last_modified(filename:join([EbinDir, F]))
  129. || F <- NewFiles, filename:extension(F) == ".beam"],
  130. ?assert(ModTime == NewModTime).
  131. dont_recompile_yrl_or_xrl(Config) ->
  132. AppDir = ?config(apps, Config),
  133. Name = rebar_test_utils:create_random_name("app1_"),
  134. Vsn = rebar_test_utils:create_random_vsn(),
  135. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  136. Xrl = filename:join([AppDir, "src", "not_a_real_xrl_" ++ Name ++ ".xrl"]),
  137. ok = filelib:ensure_dir(Xrl),
  138. XrlBody =
  139. "Definitions."
  140. "\n\n"
  141. "D = [0-9]"
  142. "\n\n"
  143. "Rules."
  144. "\n\n"
  145. "{D}+ :"
  146. " {token,{integer,TokenLine,list_to_integer(TokenChars)}}."
  147. "\n\n"
  148. "{D}+\\.{D}+((E|e)(\\+|\\-)?{D}+)? :"
  149. " {token,{float,TokenLine,list_to_float(TokenChars)}}."
  150. "\n\n"
  151. "Erlang code.",
  152. ok = ec_file:write(Xrl, XrlBody),
  153. XrlBeam = filename:join([AppDir, "ebin", filename:basename(Xrl, ".xrl") ++ ".beam"]),
  154. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  155. ModTime = filelib:last_modified(XrlBeam),
  156. timer:sleep(1000),
  157. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  158. NewModTime = filelib:last_modified(XrlBeam),
  159. ?assert(ModTime == NewModTime).