Packages
nerves
1.14.0
1.15.0
1.14.3
1.14.2
1.14.1
1.14.0
1.13.2
1.13.1
1.13.0
1.12.0
1.11.3
1.11.2
1.11.1
1.11.0
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.3
1.9.2
retired
1.9.1
1.9.0
1.8.0
1.7.17
1.7.16
1.7.15
1.7.14
retired
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
retired
1.7.1
retired
1.7.0
retired
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.11.0
0.10.1
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.2
0.8.1
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.4.0-rc.0
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
Craft and deploy bulletproof embedded software
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/compile.nerves_package.ex
# SPDX-FileCopyrightText: 2016 Justin Schneck
# SPDX-FileCopyrightText: 2017 Greg Mefford
# SPDX-FileCopyrightText: 2022 Frank Hunleth
# SPDX-FileCopyrightText: 2022 Jon Carstens
#
# SPDX-License-Identifier: Apache-2.0
#
defmodule Mix.Tasks.Compile.NervesPackage do
@shortdoc "Nerves Package Compiler"
@moduledoc """
Compile a Nerves package into a local artifact
This is only intended to be used by Nerves systems and toolchains
and configured in their mix.exs files. It should not be used manually
when compiling a Nerves project. See `mix firmware` instead.
"""
use Mix.Task
import Mix.Nerves.IO
require Logger
@recursive true
@impl Mix.Task
def run(_args) do
debug_info("Compile.NervesPackage start")
if Nerves.Env.enabled?() do
bootstrap_check!()
package =
case Nerves.Env.ensure_loaded(Mix.Project.config()[:app]) do
{:ok, package} -> package
{:error, err} -> Mix.raise(err)
end
toolchain = Nerves.Env.toolchain()
ret =
if Nerves.Artifact.stale?(package) do
_ = Nerves.Artifact.build(package, toolchain)
:ok
else
:noop
end
debug_info("Compile.NervesPackage end")
ret
else
debug_info("Compile.NervesPackage disabled")
:noop
end
end
defp bootstrap_check!() do
cond do
bootstrap_started?() ->
:ok
not bootstrap_installed?() ->
Mix.raise("""
Compiling Nerves packages requires the nerves_bootstrap archive which is missing
from the Elixir version currently in use (#{System.version()}).
Please install it with:
mix archive.install hex nerves_bootstrap
""")
true ->
Mix.raise(
"""
Compiling Nerves packages requires nerves_bootstrap to be started, which ought to
happen in your generated `config.exs`. Please ensure that MIX_TARGET is set in your environment.
""" <>
if in_umbrella?(File.cwd!()) do
"""
When compiling from an Umbrella project you must also ensure:
* You are compiling from an application directory, not the root of the Umbrella
* The Umbrella config (/config/config.exs) imports the generated Nerves config from your
Nerves application (import_config "../apps/your_nerves_app/config/config.exs")
"""
else
""
end
)
end
end
defp bootstrap_installed?() do
Mix.path_for(:archives)
|> Path.join("*")
|> Path.wildcard()
|> Enum.any?(&(&1 =~ ~r/nerves_bootstrap/))
end
defp bootstrap_started?() do
Application.started_applications()
|> Enum.map(&Tuple.to_list/1)
|> Enum.map(&List.first/1)
|> Enum.member?(:nerves_bootstrap)
end
defp in_umbrella?(app_path) do
umbrella = Path.expand(Path.join([app_path, "..", ".."]))
mix_path = Path.join(umbrella, "mix.exs")
apps_path = Path.join(umbrella, "apps")
File.exists?(mix_path) && File.exists?(apps_path)
end
end