@@ -324,65 +324,59 @@ defmodule Mix.Tasks.Deps.Compile do
324
324
325
325
defp do_gleam ( % Mix.Dep { opts: opts } = dep , config ) do
326
326
Mix.Gleam . require! ( )
327
+ Mix.Project . ensure_structure ( )
327
328
328
329
lib = Path . join ( Mix.Project . build_path ( ) , "lib" )
329
330
out = opts [ :build ]
330
331
package = opts [ :dest ]
331
332
332
333
command =
333
334
{ "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
+ ] }
335
347
336
348
shell_cmd! ( dep , config , command )
337
349
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 ) )
341
352
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 )
347
354
end
348
355
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" )
386
380
end
387
381
388
382
defp make_command ( dep ) do
0 commit comments