defmodule Nerves.Artifact.BuildRunners.Local do
@moduledoc """
Builds an artifact locally.
This build_runner will only function on certain Linux host configurations
"""
alias Nerves.Artifact
alias Nerves.Artifact.BuildRunner
@behaviour BuildRunner
@doc """
Builds an artifact locally.
Opts:
`make_args:` - Extra arguments to be passed to make.
For example:
You can configure the number of parallel jobs that buildroot
can use for execution. This is useful for situations where you may
have a machine with a lot of CPUs but not enough ram.
# mix.exs
defp nerves_package do
[
# ...
build_runner_opts: [make_args: ["PARALLEL_JOBS=8"]],
]
end
"""
@spec build(Nerves.Package.t(), Nerves.Package.t(), term) :: BuildRunner.build_result()
def build(pkg, toolchain, opts) do
pkg.platform.build(pkg, toolchain, opts)
end
@doc """
Builds an artifact locally.
"""
@spec archive(Nerves.Package.t(), Nerves.Package.t(), term) :: BuildRunner.archive_result()
def archive(pkg, toolchain, opts) do
pkg.platform.archive(pkg, toolchain, opts)
end
@doc """
Builds an artifact locally.
"""
@callback clean(package :: Nerves.Package.t()) :: BuildRunner.clean_result()
def clean(pkg) do
pkg.platform.clean(pkg)
end
@doc """
Connect to a system configuration sub-shell
"""
@spec system_shell(Nerves.Package.t()) :: :ok
def system_shell(pkg) do
dest = Artifact.build_path(pkg)
error = """
Could not find bash or sh executable.
Make sure one of them are in your $PATH environment variable
"""
shell = System.find_executable("bash") || System.find_executable("sh") || Mix.raise(error)
script = Path.join(Nerves.Env.package(:nerves_system_br).path, "create-build.sh")
platform_config = pkg.config[:platform_config][:defconfig]
defconfig = Path.join("#{pkg.path}", platform_config)
initial_input = [
"echo Updating build directory.",
"echo This will take a while if it is the first time...",
"#{script} #{defconfig} #{dest} >/dev/null",
"cd #{dest}"
]
Mix.Nerves.Shell.open(shell, initial_input)
end
end