@@ -42,7 +42,7 @@ defmodule Mix.Tasks.Compile.All do
42
42
43
43
app = config [ :app ]
44
44
_ = Code . prepend_path ( Mix.Project . compile_path ( ) )
45
- load_app ( app , % { app => true } , lib_path , validate_compile_env? )
45
+ load_app ( app , lib_path , validate_compile_env? )
46
46
result
47
47
end
48
48
@@ -99,16 +99,16 @@ defmodule Mix.Tasks.Compile.All do
99
99
{ runtime , optional } = Mix.Tasks.Compile.App . project_apps ( config )
100
100
parent = self ( )
101
101
opts = [ ordered: false , timeout: :infinity ]
102
- deps = for dep <- Mix.Dep . cached ( ) , into: % { } , do: { dep . app , true }
102
+ deps = for dep <- Mix.Dep . cached ( ) , into: % { } , do: { dep . app , lib_path }
103
103
104
- stream_apps ( runtime ++ optional )
105
- |> Task . async_stream ( & load_app ( & 1 , parent , deps , lib_path , validate_compile_env? ) , opts )
104
+ stream_apps ( runtime ++ optional , deps )
105
+ |> Task . async_stream ( & load_stream_app ( & 1 , parent , validate_compile_env? ) , opts )
106
106
|> Stream . run ( )
107
107
end
108
108
109
- defp load_app ( app , parent , deps , lib_path , validate_compile_env? ) do
109
+ defp load_stream_app ( { app , lib_path } , parent , validate_compile_env? ) do
110
110
children =
111
- case load_app ( app , deps , lib_path , validate_compile_env? ) do
111
+ case load_app ( app , lib_path , validate_compile_env? ) do
112
112
:ok ->
113
113
Application . spec ( app , :applications ) ++ Application . spec ( app , :included_applications )
114
114
@@ -120,37 +120,37 @@ defmodule Mix.Tasks.Compile.All do
120
120
:ok
121
121
end
122
122
123
- defp stream_apps ( initial ) do
124
- Stream . unfold ( { initial , % { } , % { } } , & stream_app / 1 )
123
+ defp stream_apps ( initial , deps ) do
124
+ Stream . unfold ( { initial , % { } , % { } , deps } , & stream_app / 1 )
125
125
end
126
126
127
127
# We already processed this app, skip it.
128
- defp stream_app ( { [ app | apps ] , seen , done } ) when is_map_key ( seen , app ) do
129
- stream_app ( { apps , seen , done } )
128
+ defp stream_app ( { [ app | apps ] , seen , done , deps } ) when is_map_key ( seen , app ) do
129
+ stream_app ( { apps , seen , done , deps } )
130
130
end
131
131
132
132
# We haven't processed this app, emit it.
133
- defp stream_app ( { [ app | apps ] , seen , done } ) do
134
- { app , { apps , Map . put ( seen , app , true ) , done } }
133
+ defp stream_app ( { [ app | apps ] , seen , done , deps } ) do
134
+ { { app , deps [ app ] } , { apps , Map . put ( seen , app , true ) , done , deps } }
135
135
end
136
136
137
137
# We have processed all apps and all seen have been done.
138
- defp stream_app ( { [ ] , seen , done } ) when map_size ( seen ) == map_size ( done ) do
138
+ defp stream_app ( { [ ] , seen , done , _deps } ) when map_size ( seen ) == map_size ( done ) do
139
139
nil
140
140
end
141
141
142
142
# We have processed all apps but there is work being done.
143
- defp stream_app ( { [ ] , seen , done } ) do
143
+ defp stream_app ( { [ ] , seen , done , deps } ) do
144
144
receive do
145
- { :done , app , children } -> stream_app ( { children , seen , Map . put ( done , app , true ) } )
145
+ { :done , app , children } -> stream_app ( { children , seen , Map . put ( done , app , true ) , deps } )
146
146
end
147
147
end
148
148
149
- defp load_app ( app , deps , lib_path , validate_compile_env? ) do
149
+ defp load_app ( app , lib_path , validate_compile_env? ) do
150
150
if Application . spec ( app , :vsn ) do
151
151
:ok
152
152
else
153
- with { :ok , bin } <- read_app ( app , deps , lib_path ) ,
153
+ with { :ok , bin } <- read_app ( app , lib_path ) ,
154
154
{ :ok , { :application , _ , properties } = application_data } <- consult_app_file ( bin ) ,
155
155
:ok <- :application . load ( application_data ) do
156
156
if compile_env = validate_compile_env? && properties [ :compile_env ] do
@@ -164,19 +164,19 @@ defmodule Mix.Tasks.Compile.All do
164
164
end
165
165
end
166
166
167
- # Optimize the ones coming from deps by avoiding code/erl_prim_loader
168
- defp read_app ( app , deps , lib_path ) when is_map_key ( deps , app ) do
169
- File . read ( "#{ lib_path } /#{ app } /ebin/#{ app } .app" )
170
- end
171
-
172
- defp read_app ( app , _deps , _lib_path ) do
167
+ # The app didn't come from a dep, go through the slow path (code/erl_prim_loader)
168
+ defp read_app ( app , nil ) do
173
169
name = Atom . to_charlist ( app ) ++ '.app'
174
170
175
171
with [ _ | _ ] = path <- :code . where_is_file ( name ) ,
176
172
{ :ok , bin , _full_name } <- :erl_prim_loader . get_file ( path ) ,
177
173
do: { :ok , bin }
178
174
end
179
175
176
+ defp read_app ( app , lib_path ) do
177
+ File . read ( "#{ lib_path } /#{ app } /ebin/#{ app } .app" )
178
+ end
179
+
180
180
defp consult_app_file ( bin ) do
181
181
# The path could be located in an .ez archive, so we use the prim loader.
182
182
with { :ok , tokens , _ } <- :erl_scan . string ( String . to_charlist ( bin ) ) do
0 commit comments