@@ -18,7 +18,7 @@ defmodule Mix.Compilers.Elixir do
18
18
all_entries = read_manifest ( manifest )
19
19
20
20
removed =
21
- for { _b , _m , source , _d , _f } <- all_entries , not ( source in all ) , do: source
21
+ for { _b , _m , source , _d , _f , _bin } <- all_entries , not ( source in all ) , do: source
22
22
23
23
changed =
24
24
if force do
@@ -32,10 +32,10 @@ defmodule Mix.Compilers.Elixir do
32
32
# Otherwise let's start with the new ones
33
33
# plus the ones that have changed
34
34
for ( source <- all ,
35
- not Enum . any? ( all_entries , fn { _b , _m , s , _d , _f } -> s == source end ) ,
35
+ not Enum . any? ( all_entries , fn { _b , _m , s , _d , _f , _bin } -> s == source end ) ,
36
36
do: source )
37
37
++
38
- for ( { _b , _m , source , _d , files } <- all_entries ,
38
+ for ( { _b , _m , source , _d , files , _bin } <- all_entries ,
39
39
times = Enum . map ( [ source | files ] , & HashDict . fetch! ( all_mtimes , & 1 ) ) ,
40
40
Mix.Utils . stale? ( times , [ modified ] ) ,
41
41
do: source )
@@ -46,17 +46,18 @@ defmodule Mix.Compilers.Elixir do
46
46
47
47
cond do
48
48
stale != [ ] ->
49
- do_compile ( manifest , entries , stale , dest , on_start )
49
+ compile_manifest ( manifest , entries , stale , dest , on_start )
50
50
:ok
51
51
removed != [ ] ->
52
+ write_manifest ( manifest , entries )
52
53
:ok
53
54
true ->
54
55
:noop
55
56
end
56
57
end
57
58
58
59
defp mtimes ( entries ) do
59
- Enum . reduce ( entries , HashDict . new , fn { _b , _m , source , _d , files } , dict ->
60
+ Enum . reduce ( entries , HashDict . new , fn { _b , _m , source , _d , files , _bin } , dict ->
60
61
Enum . reduce ( [ source | files ] , dict , fn file , dict ->
61
62
if HashDict . has_key? ( dict , file ) do
62
63
dict
@@ -82,16 +83,14 @@ defmodule Mix.Compilers.Elixir do
82
83
end
83
84
end
84
85
85
- defp do_compile ( manifest , entries , stale , dest , on_start ) do
86
+ defp compile_manifest ( manifest , entries , stale , dest , on_start ) do
86
87
Mix.Project . build_structure
87
88
on_start . ( )
88
89
cwd = File . cwd!
89
90
90
91
# Starts a server responsible for keeping track which files
91
92
# were compiled and the dependencies in between them.
92
- { :ok , pid } = Agent . start_link ( fn ->
93
- Enum . map ( entries , & Tuple . insert_at ( & 1 , 5 , nil ) )
94
- end )
93
+ { :ok , pid } = Agent . start_link ( fn -> entries end )
95
94
96
95
try do
97
96
_ = Kernel.ParallelCompiler . files :lists . usort ( stale ) ,
@@ -155,7 +154,7 @@ defmodule Mix.Compilers.Elixir do
155
154
remove_stale_entries ( all , :lists . usort ( changed ) , [ ] , [ ] )
156
155
end
157
156
158
- defp remove_stale_entries ( [ { beam , module , source , _d , _f } = entry | t ] , changed , removed , acc ) do
157
+ defp remove_stale_entries ( [ { beam , module , source , _d , _f , _bin } = entry | t ] , changed , removed , acc ) do
159
158
if source in changed do
160
159
atom = String . to_atom ( module )
161
160
_ = File . rm ( beam )
@@ -170,7 +169,7 @@ defmodule Mix.Compilers.Elixir do
170
169
defp remove_stale_entries ( [ ] , changed , removed , acc ) do
171
170
# If any of the dependencies for the remaining entries
172
171
# were removed, get its source so we can remove them.
173
- next_changed = for { _b , _m , source , deps , _f } <- acc ,
172
+ next_changed = for { _b , _m , source , deps , _f , _bin } <- acc ,
174
173
Enum . any? ( deps , & ( & 1 in removed ) ) ,
175
174
do: source
176
175
@@ -193,7 +192,7 @@ defmodule Mix.Compilers.Elixir do
193
192
{ deps , [ "Elixir" | files ] } -> { deps , files }
194
193
{ deps , _ } -> { deps , [ ] }
195
194
end
196
- [ { beam , module , source , deps , files } | acc ]
195
+ [ { beam , module , source , deps , files , nil } | acc ]
197
196
_ ->
198
197
acc
199
198
end
@@ -216,6 +215,11 @@ defmodule Mix.Compilers.Elixir do
216
215
[ beam , module , source | tail ] |> Enum . join ( "\t " )
217
216
end )
218
217
218
+ # The Mix.Dep.Lock keeps all the project dependencies. Since Elixir
219
+ # is a dependency itself, we need to touch the lock so the current
220
+ # Elixir version, used to compile the files above, is properly stored.
221
+ Mix.Dep.Lock . touch
222
+
219
223
File . mkdir_p! ( Path . dirname ( manifest ) )
220
224
File . write! ( manifest , Enum . join ( lines , "\n " ) )
221
225
end
0 commit comments