@@ -48,28 +48,27 @@ defmodule Mix.Tasks.Deps.Compile do
4848 compiled =
4949 Enum . map deps , fn ( dep ) ->
5050 Mix.Dep [ app : app , status: status , opts: opts ] = dep
51- deps_path = opts [ :dest ]
52-
5351 check_unavailable! ( app , status )
52+
5453 unless run_opts [ :quiet ] || opts [ :compile ] == false do
5554 shell . info "* Compiling #{ app } "
5655 end
5756
5857 compiled = cond do
5958 not nil? ( opts [ :compile ] ) ->
60- do_compile app , deps_path , opts [ :compile ]
59+ do_compile dep
6160 mix? ( dep ) ->
6261 do_mix dep , config
6362 rebar? ( dep ) ->
64- do_rebar app , deps_path , config [ :deps_path ]
63+ do_rebar dep , config
6564 make? ( dep ) ->
66- do_command app , deps_path , "make"
65+ do_make dep
6766 true ->
6867 shell . error "Could not compile #{ app } , no mix.exs, rebar.config or Makefile " <>
6968 "(pass :compile as an option to customize compilation, set it to false to do nothing)"
7069 end
7170
72- Enum . each ( Mix.Deps . load_paths ( dep ) , & Code . prepend_path / 1 )
71+ unless mix? ( dep ) , do: build_structure ( dep , config )
7372 compiled
7473 end
7574
@@ -85,16 +84,12 @@ defmodule Mix.Tasks.Deps.Compile do
8584 :ok
8685 end
8786
88- defp app_path_for ( Mix.Dep [ opts : opts ] ) do
89- opts [ :build ]
90- end
91-
92- defp do_mix ( dep , config ) do
87+ defp do_mix ( Mix.Dep [ opts : opts ] = dep , config ) do
9388 # Set the app_path to be the one stored in the dependency.
9489 # This is important because the name of application in the
9590 # mix.exs file can be different than the actual name and we
9691 # choose to respect the one in the mix.exs.
97- config = Keyword . put ( config , :app_path , app_path_for ( dep ) )
92+ config = Keyword . put ( config , :app_path , opts [ :build ] )
9893
9994 Mix.Deps . in_dependency dep , config , fn _ ->
10095 try do
@@ -111,8 +106,8 @@ defmodule Mix.Tasks.Deps.Compile do
111106 end
112107 end
113108
114- defp do_rebar ( app , deps_path , root_path ) do
115- do_command app , deps_path , rebar_cmd ( app ) , "compile skip_deps=true deps_dir=#{ inspect root_path } "
109+ defp do_rebar ( Mix.Dep [ app : app ] = dep , config ) do
110+ do_command dep , rebar_cmd ( app ) , "compile skip_deps=true deps_dir=#{ inspect config [ :deps_path ] } "
116111 end
117112
118113 defp rebar_cmd ( app ) do
@@ -133,22 +128,42 @@ defmodule Mix.Tasks.Deps.Compile do
133128 Mix.Rebar . local_rebar_cmd || raise Mix.Error , message: "rebar instalation failed"
134129 end
135130
136- defp do_compile ( _ , _deps_path , false ) do
137- false
131+ defp do_make ( dep ) do
132+ do_command ( dep , "make" )
138133 end
139134
140- defp do_compile ( app , deps_path , command ) when is_binary ( command ) do
141- Mix . shell . info ( "#{ app } : #{ command } " )
142- do_command ( app , deps_path , command )
135+ defp do_compile ( Mix.Dep [ app : app , opts: opts ] = dep ) do
136+ if command = opts [ :compile ] do
137+ Mix . shell . info ( "#{ app } : #{ command } " )
138+ do_command ( dep , command )
139+ else
140+ false
141+ end
143142 end
144143
145- defp do_command ( app , deps_path , command , extra // "" ) do
146- File . cd! deps_path , fn ->
144+ defp do_command ( Mix.Dep [ app : app , opts: opts ] , command , extra // "" ) do
145+ File . cd! opts [ :dest ] , fn ->
147146 if Mix . shell . cmd ( "#{ command } #{ extra } " ) != 0 do
148147 raise Mix.Error , message: "Could not compile dependency #{ app } , #{ command } command failed. " <>
149148 "If you want to recompile this dependency, please run: mix deps.compile #{ app } "
150149 end
151150 end
152151 true
153152 end
153+
154+ defp build_structure ( Mix.Dep [ opts : opts ] = dep , config ) do
155+ build_path = Path . dirname ( opts [ :build ] )
156+ Enum . each Mix.Deps . source_paths ( dep ) , fn source ->
157+ app = Path . join ( build_path , Path . basename ( source ) )
158+ build_structure ( source , app , config )
159+ Code . prepend_path ( Path . join ( app , "ebin" ) )
160+ end
161+ end
162+
163+ defp build_structure ( dest , build , config ) do
164+ File . cd! dest , fn ->
165+ config = Keyword . put ( config , :app_path , build )
166+ Mix.Project . build_structure ( config , symlink_ebin?: true )
167+ end
168+ end
154169end
0 commit comments