@@ -324,65 +324,59 @@ defmodule Mix.Tasks.Deps.Compile do
324324
325325 defp do_gleam ( % Mix.Dep { opts: opts } = dep , config ) do
326326 Mix.Gleam . require! ( )
327+ Mix.Project . ensure_structure ( )
327328
328329 lib = Path . join ( Mix.Project . build_path ( ) , "lib" )
329330 out = opts [ :build ]
330331 package = opts [ :dest ]
331332
332333 command =
333334 { "gleam" ,
334- [ "compile-package" , "--target" , "erlang" , "--package" , package , "--out" , out , "--lib" , lib ] }
335+ [
336+ "compile-package" ,
337+ "--no-beam" ,
338+ "--target" ,
339+ "erlang" ,
340+ "--package" ,
341+ package ,
342+ "--out" ,
343+ out ,
344+ "--lib" ,
345+ lib
346+ ] }
335347
336348 shell_cmd! ( dep , config , command )
337349
338- ebin = Path . join ( out , "ebin" )
339- app_file_path = Keyword . get ( opts , :app , Path . join ( ebin , "#{ dep . app } .app" ) )
340- create_app_file = app_file_path && ! File . exists? ( app_file_path )
350+ File . cd! ( package , fn -> Mix.Gleam . load_config ( "." ) end )
351+ |> push_gleam_project ( dep , Keyword . fetch! ( config , :deps_path ) )
341352
342- if create_app_file do
343- generate_gleam_app_file ( opts )
344- end
345-
346- Code . prepend_path ( ebin , cache: true )
353+ Code . prepend_path ( Path . join ( out , "ebin" ) , cache: true )
347354 end
348355
349- defp gleam_extra_applications ( config ) do
350- config
351- |> Map . get ( :extra_applications , [ ] )
352- |> Enum . map ( & String . to_atom / 1 )
353- end
354-
355- defp gleam_mod ( config ) do
356- case config [ :mod ] do
357- nil -> [ ]
358- mod -> { String . to_atom ( mod ) , [ ] }
359- end
360- end
361-
362- defp generate_gleam_app_file ( opts ) do
363- toml = File . cd! ( opts [ :dest ] , fn -> Mix.Gleam . load_config ( "." ) end )
364-
365- module =
366- quote do
367- def project do
368- [
369- app: unquote ( toml . name ) |> String . to_atom ( ) ,
370- version: "#{ unquote ( toml . version ) } "
371- ]
372- end
373-
374- def application do
375- [
376- mod: unquote ( gleam_mod ( toml ) ) ,
377- extra_applications: unquote ( gleam_extra_applications ( toml ) )
378- ]
379- end
380- end
381-
382- module_name = String . to_atom ( "Gleam.#{ toml . name } " )
383- Module . create ( module_name , module , Macro.Env . location ( __ENV__ ) )
384- Mix.Project . push ( module_name )
385- Mix.Tasks.Compile.App . run ( [ ] )
356+ defp push_gleam_project ( toml , dep , deps_path ) do
357+ build = Path . expand ( dep . opts [ :build ] )
358+ src = Path . join ( build , "_gleam_artefacts" )
359+ File . mkdir ( Path . join ( build , "ebin" ) )
360+
361+ config =
362+ [
363+ app: dep . app ,
364+ version: toml . version ,
365+ deps: toml . deps ,
366+ build_per_environment: true ,
367+ lockfile: "mix.lock" ,
368+ # Remove per-environment segment from the path since ProjectStack.push below will append it
369+ build_path: Mix.Project . build_path ( ) |> Path . split ( ) |> Enum . drop ( - 1 ) |> Path . join ( ) ,
370+ deps_path: deps_path ,
371+ erlc_paths: [ src ] ,
372+ erlc_include_path: Path . join ( build , "include" )
373+ ]
374+
375+ Mix.ProjectStack . pop ( )
376+ Mix.ProjectStack . push ( dep . app , config , "nofile" )
377+ # Somehow running just `compile` task won't work (doesn't compile the .erl files)
378+ Mix.Task . run ( "compile.erlang" , [ "--force" ] )
379+ Mix.Task . run ( "compile.app" )
386380 end
387381
388382 defp make_command ( dep ) do
0 commit comments