Packages
nerves
1.14.3
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/nerves/system/br.ex
# SPDX-FileCopyrightText: 2016 Justin Schneck
# SPDX-FileCopyrightText: 2020 Frank Hunleth
# SPDX-FileCopyrightText: 2022 Jon Carstens
#
# SPDX-License-Identifier: Apache-2.0
#
defmodule Nerves.System.BR do
@moduledoc """
Package builder for Buildroot-based Nerves systems
"""
@behaviour Nerves.Artifact.BuildRunner
@behaviour Nerves.Package.Platform
import Mix.Nerves.Utils
alias Nerves.Artifact
@doc """
Called as the last step of bootstrapping the Nerves env.
"""
@impl Nerves.Package.Platform
def bootstrap(%{path: path}) do
_ =
path
|> Path.join("nerves_env.exs")
|> Code.require_file()
:ok
end
@doc """
Build the artifact
"""
@impl Nerves.Artifact.BuildRunner
def build(pkg, toolchain, opts) do
{_, type} = :os.type()
make(type, pkg, toolchain, opts)
end
@doc """
Return the location in the build path to where the global artifact is linked.
"""
@impl Nerves.Package.Platform
def build_path_link(pkg) do
Artifact.build_path(pkg)
end
@doc """
Clean up all the build files
"""
@impl Nerves.Artifact.BuildRunner
def clean(pkg) do
_ = Artifact.Cache.delete(pkg)
_ = File.rm_rf(Artifact.build_path(pkg))
Nerves.Env.package(:nerves_system_br)
|> Map.get(:path)
|> Path.join("buildroot*")
|> Path.wildcard()
|> Enum.each(&File.rm_rf(&1))
end
@doc """
Create an archive of the artifact
"""
@impl Nerves.Artifact.BuildRunner
def archive(pkg, toolchain, opts) do
{_, type} = :os.type()
make_archive(type, pkg, toolchain, opts)
end
defp make(:linux, pkg, _toolchain, opts) do
System.delete_env("BINDIR")
dest = Artifact.build_path(pkg)
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)
_ = shell(script, [defconfig, dest])
{:ok, pid} = Nerves.Utils.Stream.start_link(file: "build.log")
stream = IO.stream(pid, :line)
make_args = Keyword.get(opts, :make_args, [])
case shell("make", make_args, cd: dest, stream: stream) do
{_, 0} -> {:ok, dest}
{_error, _} -> {:error, Nerves.Utils.Stream.history(pid)}
end
end
defp make(type, _pkg, _toolchain, _opts) do
error_host_os(type)
end
defp make_archive(:linux, pkg, _toolchain, _opts) do
name = Artifact.download_name(pkg)
dest = Artifact.build_path(pkg)
{:ok, pid} = Nerves.Utils.Stream.start_link(file: "archive.log")
stream = IO.stream(pid, :line)
case shell("make", ["system", "NERVES_ARTIFACT_NAME=#{name}"], cd: dest, stream: stream) do
{_, 0} -> {:ok, Path.join(dest, name <> Artifact.ext(pkg))}
{_error, _} -> {:error, Nerves.Utils.Stream.history(pid)}
end
end
defp make_archive(type, _pkg, _toolchain, _opts) do
error_host_os(type)
end
defp error_host_os(type) do
{:error,
"""
Local build_runner is not available for host system: #{type}
Please use the Docker build_runner to build this package artifact
"""}
end
end