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