@@ -308,65 +308,59 @@ defmodule Mix.Tasks.Deps.Compile do
308308
309309 defp do_gleam ( % Mix.Dep { opts: opts } = dep , config ) do
310310 Mix.Gleam . require! ( )
311+ Mix.Project . ensure_structure ( )
311312
312313 lib = Path . join ( Mix.Project . build_path ( ) , "lib" )
313314 out = opts [ :build ]
314315 package = opts [ :dest ]
315316
316317 command =
317318 { "gleam" ,
318- [ "compile-package" , "--target" , "erlang" , "--package" , package , "--out" , out , "--lib" , lib ] }
319+ [
320+ "compile-package" ,
321+ "--no-beam" ,
322+ "--target" ,
323+ "erlang" ,
324+ "--package" ,
325+ package ,
326+ "--out" ,
327+ out ,
328+ "--lib" ,
329+ lib
330+ ] }
319331
320332 shell_cmd! ( dep , config , command )
321333
322- ebin = Path . join ( out , "ebin" )
323- app_file_path = Keyword . get ( opts , :app , Path . join ( ebin , "#{ dep . app } .app" ) )
324- create_app_file = app_file_path && ! File . exists? ( app_file_path )
334+ File . cd! ( package , fn -> Mix.Gleam . load_config ( "." ) end )
335+ |> push_gleam_project ( dep , Keyword . fetch! ( config , :deps_path ) )
325336
326- if create_app_file do
327- generate_gleam_app_file ( opts )
328- end
329-
330- Code . prepend_path ( ebin , cache: true )
337+ Code . prepend_path ( Path . join ( out , "ebin" ) , cache: true )
331338 end
332339
333- defp gleam_extra_applications ( config ) do
334- config
335- |> Map . get ( :extra_applications , [ ] )
336- |> Enum . map ( & String . to_atom / 1 )
337- end
338-
339- defp gleam_mod ( config ) do
340- case config [ :mod ] do
341- nil -> [ ]
342- mod -> { String . to_atom ( mod ) , [ ] }
343- end
344- end
345-
346- defp generate_gleam_app_file ( opts ) do
347- toml = File . cd! ( opts [ :dest ] , fn -> Mix.Gleam . load_config ( "." ) end )
348-
349- module =
350- quote do
351- def project do
352- [
353- app: unquote ( toml . name ) |> String . to_atom ( ) ,
354- version: "#{ unquote ( toml . version ) } "
355- ]
356- end
357-
358- def application do
359- [
360- mod: unquote ( gleam_mod ( toml ) ) ,
361- extra_applications: unquote ( gleam_extra_applications ( toml ) )
362- ]
363- end
364- end
365-
366- module_name = String . to_atom ( "Gleam.#{ toml . name } " )
367- Module . create ( module_name , module , Macro.Env . location ( __ENV__ ) )
368- Mix.Project . push ( module_name )
369- Mix.Tasks.Compile.App . run ( [ ] )
340+ defp push_gleam_project ( toml , dep , deps_path ) do
341+ build = Path . expand ( dep . opts [ :build ] )
342+ src = Path . join ( build , "_gleam_artefacts" )
343+ File . mkdir ( Path . join ( build , "ebin" ) )
344+
345+ config =
346+ [
347+ app: dep . app ,
348+ version: toml . version ,
349+ deps: toml . deps ,
350+ build_per_environment: true ,
351+ lockfile: "mix.lock" ,
352+ # Remove per-environment segment from the path since ProjectStack.push below will append it
353+ build_path: Mix.Project . build_path ( ) |> Path . split ( ) |> Enum . drop ( - 1 ) |> Path . join ( ) ,
354+ deps_path: deps_path ,
355+ erlc_paths: [ src ] ,
356+ erlc_include_path: Path . join ( build , "include" )
357+ ]
358+
359+ Mix.ProjectStack . pop ( )
360+ Mix.ProjectStack . push ( dep . app , config , "nofile" )
361+ # Somehow running just `compile` task won't work (doesn't compile the .erl files)
362+ Mix.Task . run ( "compile.erlang" , [ "--force" ] )
363+ Mix.Task . run ( "compile.app" )
370364 end
371365
372366 defp make_command ( dep ) do
0 commit comments