@@ -298,65 +298,59 @@ defmodule Mix.Tasks.Deps.Compile do
298298
299299 defp do_gleam ( % Mix.Dep { opts: opts } = dep , config ) do
300300 Mix.Gleam . require! ( )
301+ Mix.Project . ensure_structure ( )
301302
302303 lib = Path . join ( Mix.Project . build_path ( ) , "lib" )
303304 out = opts [ :build ]
304305 package = opts [ :dest ]
305306
306307 command =
307308 { "gleam" ,
308- [ "compile-package" , "--target" , "erlang" , "--package" , package , "--out" , out , "--lib" , lib ] }
309+ [
310+ "compile-package" ,
311+ "--no-beam" ,
312+ "--target" ,
313+ "erlang" ,
314+ "--package" ,
315+ package ,
316+ "--out" ,
317+ out ,
318+ "--lib" ,
319+ lib
320+ ] }
309321
310322 shell_cmd! ( dep , config , command )
311323
312- ebin = Path . join ( out , "ebin" )
313- app_file_path = Keyword . get ( opts , :app , Path . join ( ebin , "#{ dep . app } .app" ) )
314- create_app_file = app_file_path && ! File . exists? ( app_file_path )
324+ File . cd! ( package , fn -> Mix.Gleam . load_config ( "." ) end )
325+ |> push_gleam_project ( dep , Keyword . fetch! ( config , :deps_path ) )
315326
316- if create_app_file do
317- generate_gleam_app_file ( opts )
318- end
319-
320- Code . prepend_path ( ebin , cache: true )
327+ Code . prepend_path ( Path . join ( out , "ebin" ) , cache: true )
321328 end
322329
323- defp gleam_extra_applications ( config ) do
324- config
325- |> Map . get ( :extra_applications , [ ] )
326- |> Enum . map ( & String . to_atom / 1 )
327- end
328-
329- defp gleam_mod ( config ) do
330- case config [ :mod ] do
331- nil -> [ ]
332- mod -> { String . to_atom ( mod ) , [ ] }
333- end
334- end
335-
336- defp generate_gleam_app_file ( opts ) do
337- toml = File . cd! ( opts [ :dest ] , fn -> Mix.Gleam . load_config ( "." ) end )
338-
339- module =
340- quote do
341- def project do
342- [
343- app: unquote ( toml . name ) |> String . to_atom ( ) ,
344- version: "#{ unquote ( toml . version ) } "
345- ]
346- end
347-
348- def application do
349- [
350- mod: unquote ( gleam_mod ( toml ) ) ,
351- extra_applications: unquote ( gleam_extra_applications ( toml ) )
352- ]
353- end
354- end
355-
356- module_name = String . to_atom ( "Gleam.#{ toml . name } " )
357- Module . create ( module_name , module , Macro.Env . location ( __ENV__ ) )
358- Mix.Project . push ( module_name )
359- Mix.Tasks.Compile.App . run ( [ ] )
330+ defp push_gleam_project ( toml , dep , deps_path ) do
331+ build = Path . expand ( dep . opts [ :build ] )
332+ src = Path . join ( build , "_gleam_artefacts" )
333+ File . mkdir ( Path . join ( build , "ebin" ) )
334+
335+ config =
336+ [
337+ app: dep . app ,
338+ version: toml . version ,
339+ deps: toml . deps ,
340+ build_per_environment: true ,
341+ lockfile: "mix.lock" ,
342+ # Remove per-environment segment from the path since ProjectStack.push below will append it
343+ build_path: Mix.Project . build_path ( ) |> Path . split ( ) |> Enum . drop ( - 1 ) |> Path . join ( ) ,
344+ deps_path: deps_path ,
345+ erlc_paths: [ src ] ,
346+ erlc_include_path: Path . join ( build , "include" )
347+ ]
348+
349+ Mix.ProjectStack . pop ( )
350+ Mix.ProjectStack . push ( dep . app , config , "nofile" )
351+ # Somehow running just `compile` task won't work (doesn't compile the .erl files)
352+ Mix.Task . run ( "compile.erlang" , [ "--force" ] )
353+ Mix.Task . run ( "compile.app" )
360354 end
361355
362356 defp make_command ( dep ) do
0 commit comments