Skip to content

Commit 891922f

Browse files
authored
Support setting MIX_TARGET (#299)
For #248 This allows you to set MIX_TARGET in a config and have it used in Elixir versions >= 1.8 This is most often used with Nerves and removes a lot of compilation errors in repos relying on a target to be set
1 parent 13b96ef commit 891922f

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

apps/language_server/lib/language_server/build.ex

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,15 @@ defmodule ElixirLS.LanguageServer.Build do
1010
with_build_lock(fn ->
1111
{us, _} =
1212
:timer.tc(fn ->
13-
IO.puts("Compiling with Mix env #{Mix.env()}")
13+
IO.puts("MIX_ENV: #{Mix.env()}")
14+
15+
if function_exported?(Mix, :target, 0) do
16+
# Even though we know we have the function here,
17+
# Compilation will fail calling Mix.target/0 directly
18+
# since Elixir 1.7 is used to compile - So we get around
19+
# that with apply/3
20+
IO.puts("MIX_TARGET: #{apply(Mix, :target, [])}")
21+
end
1422

1523
prev_deps = cached_deps()
1624
:ok = Mix.Project.clear_deps_cache()

apps/language_server/lib/language_server/server.ex

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,11 +748,13 @@ defmodule ElixirLS.LanguageServer.Server do
748748
Dialyzer.check_support() == :ok && Map.get(settings, "dialyzerEnabled", true)
749749

750750
mix_env = Map.get(settings, "mixEnv", "test")
751+
mix_target = Map.get(settings, "mixTarget")
751752
project_dir = Map.get(settings, "projectDir")
752753

753754
state =
754755
state
755756
|> set_mix_env(mix_env)
757+
|> maybe_set_mix_target(mix_target)
756758
|> set_project_dir(project_dir)
757759
|> set_dialyzer_enabled(enable_dialyzer)
758760

@@ -787,6 +789,38 @@ defmodule ElixirLS.LanguageServer.Server do
787789
state
788790
end
789791

792+
defp maybe_set_mix_target(state, nil), do: state
793+
794+
defp maybe_set_mix_target(state, target) do
795+
if Version.match?(System.version(), ">= 1.8.0") do
796+
set_mix_target(state, target)
797+
else
798+
JsonRpc.show_message(
799+
:warning,
800+
"MIX_TARGET was set, but it requires Elixir >= 1.8.0. This setting will be ignored"
801+
)
802+
803+
state
804+
end
805+
end
806+
807+
defp set_mix_target(state, target) do
808+
target = target || "host"
809+
810+
prev_target = state.settings["mixTarget"]
811+
812+
if is_nil(prev_target) or target == prev_target do
813+
# We've already checked for Elixir >= 1.8.0 by this point
814+
# but compilation will fail if we just call Mix.target/0
815+
# so we get around that via apply/3
816+
apply(Mix, :target, [String.to_atom(target)])
817+
else
818+
JsonRpc.show_message(:warning, "You must restart ElixirLS after changing Mix target")
819+
end
820+
821+
state
822+
end
823+
790824
defp set_project_dir(%{project_dir: prev_project_dir, root_uri: root_uri} = state, project_dir)
791825
when is_binary(root_uri) do
792826
root_dir = SourceFile.path_from_uri(root_uri)

0 commit comments

Comments
 (0)