Skip to content

Commit b0eda69

Browse files
committed
Generate app file for gleam deps on compilation
1 parent 7086167 commit b0eda69

File tree

3 files changed

+57
-44
lines changed

3 files changed

+57
-44
lines changed

lib/mix/lib/mix/dep/loader.ex

-33
Original file line numberDiff line numberDiff line change
@@ -374,46 +374,13 @@ defmodule Mix.Dep.Loader do
374374
from = Path.join(opts[:dest], "gleam.toml")
375375
deps = Enum.map(config[:deps], &to_dep(&1, from, _manager = nil, locked?))
376376

377-
properties =
378-
[{:vsn, to_charlist(config[:version])}]
379-
|> gleam_mod(config)
380-
|> gleam_applications(config)
381-
382-
contents = :io_lib.format("~p.~n", [{:application, dep.app, properties}])
383-
384-
[opts[:build], "ebin"]
385-
|> Path.join()
386-
|> File.mkdir_p!()
387-
388-
[opts[:build], "ebin", "#{dep.app}.app"]
389-
|> Path.join()
390-
|> File.write!(IO.chardata_to_string(contents))
391-
392377
{dep, deps}
393378
end
394379

395380
defp gleam_dep(%Mix.Dep{opts: opts} = dep, children, locked?) do
396381
{dep, Enum.map(children, &to_dep(&1, opts[:dest], _manager = nil, locked?))}
397382
end
398383

399-
defp gleam_mod(properties, config) do
400-
case config[:mod] do
401-
nil -> properties
402-
mod -> [{:mod, {String.to_atom(mod), []}} | properties]
403-
end
404-
end
405-
406-
defp gleam_applications(properties, config) do
407-
case config[:extra_applications] do
408-
nil ->
409-
properties
410-
411-
applications ->
412-
applications = Enum.map(applications, &String.to_atom/1)
413-
[{:applications, applications} | properties]
414-
end
415-
end
416-
417384
defp mix_children(config, locked?, opts) do
418385
from = Mix.Project.project_file()
419386

lib/mix/lib/mix/tasks/deps.compile.ex

+44
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,53 @@ defmodule Mix.Tasks.Deps.Compile do
336336
["compile-package", "--target", "erlang", "--package", package, "--out", out, "--lib", lib]}
337337

338338
shell_cmd!(dep, config, command)
339+
340+
if !Keyword.get(opts, :app, true) == false do
341+
generate_gleam_app_file(opts)
342+
end
343+
339344
Code.prepend_path(Path.join(out, "ebin"), cache: true)
340345
end
341346

347+
defp gleam_extra_applications(config) do
348+
config
349+
|> Map.get(:extra_applications, [])
350+
|> Enum.map(&String.to_atom/1)
351+
end
352+
353+
defp gleam_mod(config) do
354+
case config[:mod] do
355+
nil -> []
356+
mod -> {String.to_atom(mod), []}
357+
end
358+
end
359+
360+
defp generate_gleam_app_file(opts) do
361+
toml = File.cd!(opts[:dest], fn -> Mix.Gleam.load_config(".") end)
362+
363+
module =
364+
quote do
365+
def project do
366+
[
367+
app: unquote(toml.name) |> String.to_atom(),
368+
version: "#{unquote(toml.version)}"
369+
]
370+
end
371+
372+
def application do
373+
[
374+
mod: unquote(gleam_mod(toml)),
375+
extra_applications: unquote(gleam_extra_applications(toml))
376+
]
377+
end
378+
end
379+
380+
module_name = String.to_atom("Gleam.#{toml.name}")
381+
Module.create(module_name, module, Macro.Env.location(__ENV__))
382+
Mix.Project.push(module_name)
383+
File.cd!(opts[:dest], fn -> Mix.Tasks.Compile.App.run([]) end)
384+
end
385+
342386
defp make_command(dep) do
343387
makefile_win? = makefile_win?(dep)
344388

lib/mix/test/mix/gleam_test.exs

+13-11
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,22 @@ defmodule Mix.GleamTest do
8787
assert :gleam_dep.main()
8888
assert :gleam@int.to_string(1) == "1"
8989

90-
load_paths =
91-
Mix.Dep.Converger.converge([])
92-
|> Enum.map(&Mix.Dep.load_paths(&1))
93-
|> Enum.concat()
94-
95-
assert Enum.any?(load_paths, &String.ends_with?(&1, "gleam_dep/ebin"))
96-
assert Enum.any?(load_paths, &String.ends_with?(&1, "gleam_stdlib/ebin"))
97-
# Dep of a dep
98-
assert Enum.any?(load_paths, &String.ends_with?(&1, "gleam_erlang/ebin"))
9990
{:ok, content} = :file.consult("_build/dev/lib/gleam_dep/ebin/gleam_dep.app")
10091

10192
assert content == [
102-
{:application, :gleam_dep,
103-
[applications: [:ssl], mod: {:gleam_dep@somemodule, []}, vsn: ~c"1.0.0"]}
93+
{
94+
:application,
95+
:gleam_dep,
96+
[
97+
{:modules, [:gleam_dep]},
98+
{:optional_applications, []},
99+
{:applications, [:kernel, :stdlib, :elixir, :ssl]},
100+
{:description, ~c"gleam_dep"},
101+
{:registered, []},
102+
{:vsn, ~c"1.0.0"},
103+
{:mod, {:gleam_dep@somemodule, []}}
104+
]
105+
}
104106
]
105107
end)
106108
end

0 commit comments

Comments
 (0)