Packages
nerves
0.4.1
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/firmware.ex
defmodule Mix.Tasks.Firmware do
use Mix.Task
import Mix.Nerves.Utils
@switches [verbosity: :string]
@moduledoc """
Build a firmware image for the selected target platform.
This task builds the project, combines the generated OTP release with
a Nerves system image, and creates a `.fw` file that may be written
to an SDCard or sent to a device.
## Command line options
* `--verbosity=[silent|quiet|normal|verbose]` - set the verbosity level
## Environment variables
* `NERVES_SYSTEM` - may be set to a local directory to specify the Nerves
system image that is used
* `NERVES_TOOLCHAIN` - may be set to a local directory to specify the
Nerves toolchain (C/C++ crosscompiler) that is used
"""
def run(args) do
preflight()
{opts, _, _} = OptionParser.parse(args, switches: @switches)
debug_info "Nerves Firmware Assembler"
config = Mix.Project.config
otp_app = config[:app]
target = config[:target]
verbosity = opts[:verbosity] || "normal"
firmware_config = Application.get_env(:nerves, :firmware)
system_path = System.get_env("NERVES_SYSTEM") || Mix.raise """
Environment variable $NERVES_SYSTEM is not set
"""
System.get_env("NERVES_TOOLCHAIN") || Mix.raise """
Environment variable $NERVES_TOOLCHAIN is not set
"""
rel_config =
File.cwd!
|> Path.join("rel/config.exs")
unless File.exists?(rel_config) do
Mix.raise """
You are missing a release config file. Run nerves.release.init task first
"""
end
Mix.Task.run "compile", []
Mix.Task.run "release", ["--verbosity=#{verbosity}"]
rel2fw_path = Path.join(system_path, "scripts/rel2fw.sh")
cmd = "bash"
args = [rel2fw_path]
rootfs_additions =
case firmware_config[:rootfs_additions] do
nil -> []
rootfs_additions ->
rfs = File.cwd!
|> Path.join(rootfs_additions)
["-a", rfs]
end
fwup_conf =
case firmware_config[:fwup_conf] do
nil -> []
fwup_conf ->
fw_conf = File.cwd!
|> Path.join(fwup_conf)
["-c", fw_conf]
end
fw = ["-f", "_images/#{target}/#{otp_app}.fw"]
release_path =
Mix.Project.build_path()
|> Path.join("rel/#{otp_app}")
output = [release_path]
args = args ++ fwup_conf ++ rootfs_additions ++ fw ++ output
shell(cmd, args)
|> result
end
def result({_ , 0}), do: nil
def result({result, _}), do: Mix.raise """
Nerves encountered an error. #{inspect result}
"""
end