Packages
nerves_bootstrap
1.6.3
1.16.0
1.15.3
1.15.2
1.15.1
1.15.0
1.14.5
1.14.4
1.14.3
1.14.2
1.14.0
1.13.1
1.13.0
1.12.2
1.12.1
1.12.0
1.11.5
1.11.4
1.11.3
1.11.2
1.11.1
1.11.0
1.10.6
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.0
1.8.1
1.8.0
1.7.1
1.7.0
1.6.3
1.6.2
1.6.1
1.6.0
1.5.3
1.5.2
1.5.1
1.5.0
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.0
1.0.1
1.0.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.4
0.6.3
Nerves mix integration bootstrap and new project generator
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/nerves/precompile.ex
defmodule Mix.Tasks.Nerves.Precompile do
use Mix.Task
import Mix.Nerves.IO
@moduledoc false
def run(_args) do
debug_info("Precompile Start")
# Note: We have to directly use the environment variable here instead of
# calling Nerves.Env.enabled?/0 because the nerves.precompile step happens
# before the nerves dependency is compiled, which is where Nerves.Env
# currently lives. This would be improved by moving Nerves.Env to
# nerves_bootstrap.
unless System.get_env("NERVES_ENV_DISABLED") do
System.put_env("NERVES_PRECOMPILE", "1")
Mix.Tasks.Nerves.Env.run([])
{app, deps} =
Nerves.Env.packages()
|> Enum.split_with(&(&1.app == Mix.Project.config()[:app]))
(deps ++ app)
|> compile_check()
|> Enum.each(&compile/1)
Mix.Task.reenable("deps.compile")
Mix.Task.reenable("compile")
System.put_env("NERVES_PRECOMPILE", "0")
Mix.Task.rerun("nerves.loadpaths")
end
debug_info("Precompile End")
end
defp compile(%{app: app}) do
cond do
Mix.Project.config()[:app] == app ->
Mix.Tasks.Compile.run([app, "--include-children"])
true ->
Mix.Tasks.Deps.Compile.run([app, "--no-deps-check", "--include-children"])
end
end
defp compile_check(packages) do
stale =
packages
|> Enum.reject(&(Mix.Project.config()[:app] == &1.app))
|> Enum.filter(&(:nerves_package in Map.get(&1, :compilers, Mix.compilers())))
|> Enum.filter(&(Nerves.Artifact.expand_sites(&1) != []))
|> Enum.filter(&Nerves.Artifact.stale?/1)
|> Enum.reject(&Keyword.get(Map.get(&1, :dep_opts, []), :compile, false))
case stale do
[] ->
packages
packages ->
stale_packages =
packages
|> Enum.map(&Map.get(&1, :app))
|> Enum.map(&Atom.to_string/1)
|> Enum.join("\n ")
example = List.first(packages)
Mix.raise("""
The following Nerves packages need to be built:
#{stale_packages}
The build process for each of these can take a significant amount of
time so the maintainers have listed URLs for downloading pre-built packages.
If you have not modified these packages, please try running `mix deps.get`
or `mix deps.update` to download the precompiled versions.
If you have limited network access and are able to obtain the files via
other means, copy them to `~/.nerves/dl` or the location specified by
`$NERVES_DL_DIR`.
If you are making modifications to one of the packages or want to force
local compilation, add `nerves_compile: true` to the dependency. For
example:
{:#{example.app}, "~> #{example.version}", nerves: [compile: true]}
If the package is a dependency of a dependency, you will need to
override it on the parent project with `override: true`.
""")
end
end
end