@@ -42,7 +42,7 @@ defmodule Mix.Tasks.Compile.All do
4242
4343 app = config [ :app ]
4444 _ = 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? )
4646 result
4747 end
4848
@@ -99,16 +99,16 @@ defmodule Mix.Tasks.Compile.All do
9999 { runtime , optional } = Mix.Tasks.Compile.App . project_apps ( config )
100100 parent = self ( )
101101 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 }
103103
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 )
106106 |> Stream . run ( )
107107 end
108108
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
110110 children =
111- case load_app ( app , deps , lib_path , validate_compile_env? ) do
111+ case load_app ( app , lib_path , validate_compile_env? ) do
112112 :ok ->
113113 Application . spec ( app , :applications ) ++ Application . spec ( app , :included_applications )
114114
@@ -120,37 +120,37 @@ defmodule Mix.Tasks.Compile.All do
120120 :ok
121121 end
122122
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 )
125125 end
126126
127127 # 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 } )
130130 end
131131
132132 # 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 } }
135135 end
136136
137137 # 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
139139 nil
140140 end
141141
142142 # 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
144144 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 } )
146146 end
147147 end
148148
149- defp load_app ( app , deps , lib_path , validate_compile_env? ) do
149+ defp load_app ( app , lib_path , validate_compile_env? ) do
150150 if Application . spec ( app , :vsn ) do
151151 :ok
152152 else
153- with { :ok , bin } <- read_app ( app , deps , lib_path ) ,
153+ with { :ok , bin } <- read_app ( app , lib_path ) ,
154154 { :ok , { :application , _ , properties } = application_data } <- consult_app_file ( bin ) ,
155155 :ok <- :application . load ( application_data ) do
156156 if compile_env = validate_compile_env? && properties [ :compile_env ] do
@@ -164,19 +164,19 @@ defmodule Mix.Tasks.Compile.All do
164164 end
165165 end
166166
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
173169 name = Atom . to_charlist ( app ) ++ '.app'
174170
175171 with [ _ | _ ] = path <- :code . where_is_file ( name ) ,
176172 { :ok , bin , _full_name } <- :erl_prim_loader . get_file ( path ) ,
177173 do: { :ok , bin }
178174 end
179175
176+ defp read_app ( app , lib_path ) do
177+ File . read ( "#{ lib_path } /#{ app } /ebin/#{ app } .app" )
178+ end
179+
180180 defp consult_app_file ( bin ) do
181181 # The path could be located in an .ez archive, so we use the prim loader.
182182 with { :ok , tokens , _ } <- :erl_scan . string ( String . to_charlist ( bin ) ) do
0 commit comments