Packages
nerves
1.10.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/nerves/preflight.ex
defmodule Mix.Nerves.Preflight do
@moduledoc false
alias Nerves.Utils.WSL
@fwup_semver "~> 1.8"
@doc """
Run the preflight checks for the Nerves System
"""
@spec check!() :: any()
def check!() do
:os.type()
|> case do
{_, :linux} -> if WSL.running_on_wsl?(), do: :wsl, else: :linux
{_, type} -> type
end
|> check_platform!()
Mix.Task.run("nerves.loadpaths")
end
# OSX
defp check_platform!(:darwin) do
ensure_fwup_version!()
ensure_available!("mksquashfs", package: "squashfs")
ensure_available!("gstat", package: "gstat (coreutils)")
end
# NOTE: We currently require fwup to be installed both in WSL and in Windows
# because the fwup.exe in Windows is used when burning firmware to a physical
# memory card, and fwup in WSL is used for most other operations.
#
# WSL 2 adds some new lower-level integrations that may eliminate the need
# for this in the future, but we'll need to do some more research.
defp check_platform!(:wsl) do
ensure_fwup_version!()
ensure_fwup_version!("fwup.exe")
ensure_available!("mksquashfs", package: "squashfs")
end
# Non-WSL Linux
defp check_platform!(_) do
ensure_fwup_version!()
ensure_available!("mksquashfs", package: "squashfs")
end
@doc """
Ensure fwup executable is available and is the expected version
"""
@spec ensure_fwup_version!(String.t(), String.t()) :: :ok
def ensure_fwup_version!(fwup_bin \\ "fwup", vsn_requirement \\ @fwup_semver) do
ensure_available!(fwup_bin)
case Nerves.Port.cmd(fwup_bin, ["--version"]) do
{vsn, 0} ->
vsn = String.trim(vsn)
{:ok, req} = Version.parse_requirement(vsn_requirement)
unless Version.match?(vsn, req) do
Mix.raise("""
#{fwup_bin} #{vsn_requirement} is required for Nerves.
You are running #{vsn}.
Please see https://hexdocs.pm/nerves/installation.html#fwup
for installation instructions
""")
end
error ->
Mix.raise("""
Nerves encountered an error while checking host requirements for fwup
#{inspect(error)}
Please open a bug report for this issue on github.com/nerves-project/nerves
""")
end
:ok
end
@doc """
Ensure that the given command is available in the system path
"""
@spec ensure_available!(String.t(), Keyword.t()) :: :ok
def ensure_available!(executable, opts \\ []) do
if System.find_executable(executable) do
:ok
else
package = opts[:package] || executable
Mix.raise(missing_package_message(package))
end
end
defp missing_package_message(package) do
"""
#{package} is required by the Nerves tooling.
Please see https://hexdocs.pm/nerves/installation.html for installation
instructions.
"""
end
end