Packages
nerves
0.5.2
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/package/artifact.ex
defmodule Nerves.Package.Artifact do
@moduledoc """
Package artifacts are the product of compiling a package with a
specific toolchain.
"""
@base_dir Path.expand("~/.nerves/artifacts")
@doc """
Get the artifact name
Requires the package and toolchain package to be supplied
"""
@spec name(Nerves.Package.t, Nerves.Package.t) :: String.t
def name(pkg, toolchain) do
target_tuple =
case pkg.type do
:toolchain ->
Nerves.Env.host_platform <> "-" <>
Nerves.Env.host_arch
_ ->
toolchain.config[:target_tuple]
|> to_string
end
"#{pkg.app}-#{pkg.version}.#{target_tuple}"
end
@doc """
Get the base dir for where an artifact for a package should be stored.
If a package is pulled in from hex, the base dir for an artifact will point
to the NERVES_ARTIFACT_DIR or if undefined, `~/.nerves/artifacts`
Packages which were obtained through other Mix SCM's such as path will
have a base_dir local to the package path
"""
@spec base_dir(Nerves.Package.t) :: String.t
def base_dir(pkg) do
case pkg.dep do
local when local in [:path, :project] ->
pkg.path
|> Path.join(".nerves/artifacts")
_ ->
System.get_env("NERVES_ARTIFACTS_DIR") || @base_dir
end
end
@doc """
The full path to the artifact
"""
@spec dir(Nerves.Package.t, Nerves.Package.t) :: String.t
def dir(pkg, toolchain) do
if env_var?(pkg) do
System.get_env(env_var(pkg)) |> Path.expand
else
base_dir(pkg)
|> Path.join(name(pkg, toolchain))
|> protocol_vsn(pkg)
end
end
@doc """
Determines if an artifact exists at its artifact dir.
"""
@spec exists?(Nerves.Package.t, Nerves.Package.t) :: boolean
def exists?(pkg, toolchain) do
dir(pkg, toolchain)
|> File.dir?
end
@doc """
Check to see if the artifact path is being set from the system env
"""
@spec env_var?(Nerves.Package.t) :: boolean
def env_var?(pkg) do
name = env_var(pkg)
dir = System.get_env(name)
dir != nil and File.dir?(dir)
end
@doc """
Determine the environment variable which would be set to override the path
"""
@spec env_var(Nerves.Package.t) :: String.t
def env_var(pkg) do
case pkg.type do
:toolchain -> "NERVES_TOOLCHAIN"
:system -> "NERVES_SYSTEM"
_ ->
pkg.name
|> Atom.to_string
|> String.upcase
end
end
@doc """
Determines the extension for an artifact based off its type.
Toolchains use xz compression
"""
@spec ext(Nerves.Package.t) :: String.t
def ext(%{type: :toolchain}), do: "tar.xz"
def ext(_), do: "tar.gz"
defp protocol_vsn(dir, pkg) do
if pkg.compiler == :nerves_package do
dir
else
build_path =
Mix.Project.build_path
|> Path.join("nerves")
|> Path.expand
case pkg.type do
:toolchain ->
Path.join(build_path, "toolchain")
:system ->
Path.join(build_path, "system")
type -> Mix.raise "Cannot determine artifact path for #{type}"
end
end
end
end