Packages

nerves_system_br

1.17.1
1.34.0 1.33.9 1.33.8 1.33.7 1.33.6 1.33.5 1.33.4 1.33.3 1.33.2 1.33.1 1.33.0 1.32.5 1.32.4 1.32.3 1.32.2 1.32.1 1.32.0 1.31.7 1.31.6 1.31.5 1.31.4 1.31.3 1.31.2 1.31.1 1.31.0 1.30.1 1.30.0 1.29.3 1.29.2 1.29.1 1.29.0 1.28.3 1.28.2 1.28.1 1.28.0 1.27.3 1.27.2 1.27.1 1.27.0 1.26.1 1.26.0 1.25.3 1.25.2 1.25.1 1.25.0 1.24.1 1.24.0 1.23.3 1.23.2 1.23.1 1.23.0 1.22.8 1.22.7 1.22.6 1.22.5 1.22.4 1.22.3 1.22.2 1.22.1 1.22.0 1.21.6 1.21.5 1.21.4 1.21.3 1.21.2 1.21.1 1.21.0 1.20.6 1.20.5 1.20.4 1.20.3 1.20.2 1.20.1 1.20.0 1.19.1 1.19.0 1.18.6 1.18.5 1.18.4 1.18.3 1.18.2 1.18.1 1.18.0 1.17.4 1.17.3 1.17.2 1.17.1 1.17.0 1.16.5 1.16.4 1.16.3 1.16.2 1.16.1 1.16.0 1.15.2 1.15.1 1.15.0 1.14.5 1.14.4 1.14.3 1.14.2 1.14.1 1.14.0 1.13.8 1.13.7 1.13.6 1.13.5 1.13.4 1.13.3 1.13.2 1.13.1 1.13.0 1.12.4 1.12.3 1.12.2 1.12.1 1.12.0 1.12.0-rc.0 1.11.4 1.11.3 1.11.2 1.11.1 1.11.0 1.10.3 1.10.2 1.10.1 1.10.0 1.9.5 1.9.4 1.9.3 1.9.2 1.9.1 1.9.0 1.8.6 1.8.5 1.8.4 1.8.3 1.8.2 1.8.1 1.8.0 1.7.3 1.7.2 1.7.1 1.7.0 1.6.8 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.6 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.2 1.3.1 1.3.0 1.2.2 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.17.0 0.16.4 0.16.3 0.16.2 0.16.1-2017-11 0.16.0-2017-11 0.15.1 0.15.0 0.14.1 0.14.0 0.13.9 0.13.8 0.13.7 0.13.6 0.13.5 0.13.4 retired 0.13.3 0.13.2 0.13.0 0.12.1 0.12.0 0.11.1 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.2 0.8.1 0.8.0 0.7.0 0.6.1 0.6.0 0.5.2 0.5.1 0.5.0 0.4.2 0.4.1

Nerves System BR - Buildroot based build platform for Nerves Systems

Current section

Files

Jump to
nerves_system_br nerves_env.exs
Raw

nerves_env.exs

defmodule System.Env do
@path "PATH"
@ld_library_path "LD_LIBRARY_PATH"
def path_add(p) do
System.put_env(@path, "#{path()}:#{p}")
end
def ld_library_path_add(p) do
System.put_env(@ld_library_path, "#{ld_library_path()}:#{p}")
end
def path do
System.get_env(@path)
end
def ld_library_path do
System.get_env(@ld_library_path)
end
end
defmodule Utils do
def crosscompile(gcc_path, system_path) do
gcc =
gcc_path
|> Path.join("*gcc")
|> Path.wildcard()
|> List.first()
gcc ||
Mix.raise("""
gcc should have been found in \"#{gcc_path}\", but wasn't.
\"#{system_path}\" is partial or corrupt and may need to be deleted.
""")
String.replace_suffix(gcc, "-gcc", "")
end
end
system_path =
System.get_env("NERVES_SYSTEM") ||
Mix.raise("You must set NERVES_SYSTEM to the system directory prior to requiring this file")
sdk_sysroot = Path.join(system_path, "staging")
{_toolchain_path, crosscompile} =
if File.dir?(Path.join(system_path, "host")) do
# Grab the toolchain from a Buildroot output directory
toolchain_path = Path.join(system_path, "host")
gcc_path = Path.join(toolchain_path, "usr/bin")
crosscompile = Utils.crosscompile(gcc_path, system_path)
System.put_env("PKG_CONFIG", Path.join(toolchain_path, "usr/bin/pkg-config"))
System.put_env("PKG_CONFIG_SYSROOT_DIR", sdk_sysroot)
System.put_env("PKG_CONFIG_LIBDIR", Path.join(sdk_sysroot, "usr/lib/pkgconfig"))
System.put_env("PKG_CONFIG_PATH", "")
System.put_env("PERLLIB", Path.join(toolchain_path, "usr/lib/perl"))
Path.join(toolchain_path, "usr/bin")
|> System.Env.path_add()
Path.join(toolchain_path, "usr/sbin")
|> System.Env.path_add()
Path.join(toolchain_path, "bin")
|> System.Env.path_add()
Path.join(toolchain_path, "usr/lib")
|> System.Env.ld_library_path_add()
{toolchain_path, crosscompile}
else
# Not a BR Local Provider build
toolchain_path =
System.get_env("NERVES_TOOLCHAIN") ||
Mix.raise(
"You must set NERVES_TOOLCHAIN to the toolchain directory prior to requiring this file"
)
gcc_path = Path.join(toolchain_path, "bin")
# Find the crosscompilers
crosscompile = Utils.crosscompile(gcc_path, system_path)
# Add toolchain bin to path
Path.join(toolchain_path, "bin")
|> System.Env.path_add()
{toolchain_path, crosscompile}
end
System.put_env("NERVES_SDK_IMAGES", Path.join(system_path, "images"))
System.put_env("NERVES_SDK_SYSROOT", sdk_sysroot)
system_include_path =
system_path
|> Path.join("staging/usr/include")
unless File.dir?(Path.join(system_path, "staging")) do
Mix.raise("ERROR: It looks like the system hasn't been built!")
end
System.put_env("CROSSCOMPILE", crosscompile)
erts_dir =
Path.join(sdk_sysroot, "usr/lib/erlang/erts-*")
|> Path.wildcard()
|> List.first()
System.put_env("ERTS_DIR", erts_dir)
erl_interface_dir =
Path.join(sdk_sysroot, "/usr/lib/erlang/lib/erl_interface-*")
|> Path.wildcard()
|> List.first()
System.put_env("ERL_INTERFACE_DIR", erl_interface_dir)
erl_lib_dir = Path.join(sdk_sysroot, "/usr/lib/erlang")
System.put_env("REBAR_PLT_DIR", erl_lib_dir)
System.put_env("ERL_LIB_DIR", erl_lib_dir)
erl_system_lib_dir = Path.join(erl_lib_dir, "/lib")
System.put_env("ERL_SYSTEM_LIB_DIR", erl_system_lib_dir)
# Override Make implicit variables with their crosscompile versions
# https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
System.put_env("AR", "#{crosscompile}-ar")
System.put_env("AS", "#{crosscompile}-as")
System.put_env("CC", "#{crosscompile}-gcc")
System.put_env("CXX", "#{crosscompile}-g++")
System.put_env("LD", "#{crosscompile}-ld")
System.put_env("STRIP", "#{crosscompile}-strip")
# Set defaults for compiler flags
System.put_env(
"CFLAGS",
"-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -pipe -O2 -I#{
system_include_path
}"
)
System.put_env(
"CPPFLAGS",
"-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -I#{system_include_path}"
)
System.put_env(
"CXXFLAGS",
"-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -pipe -O2 -I#{
system_include_path
}"
)
System.put_env("LDFLAGS", "--sysroot=#{sdk_sysroot}")
System.put_env("ERL_CFLAGS", "-I#{erts_dir}/include -I#{erl_interface_dir}/include")
System.put_env("ERL_LDFLAGS", "-L#{erts_dir}/lib -L#{erl_interface_dir}/lib -lerts -lei")
# pkg-config
System.put_env("PKG_CONFIG_SYSROOT_DIR", sdk_sysroot)
System.put_env("PKG_CONFIG_LIBDIR", "#{sdk_sysroot}/usr/lib/pkgconfig")
# Qt/Qmake support
qmakespec_dir = Path.join(system_path, "staging/mkspecs/devices/linux-buildroot-g++")
if File.dir?(qmakespec_dir) do
System.put_env("QMAKESPEC", qmakespec_dir)
end
# Rebar naming
System.put_env("REBAR_TARGET_ARCH", Path.basename(crosscompile))
System.put_env("ERL_EI_LIBDIR", Path.join(erl_interface_dir, "lib"))
System.put_env("ERL_EI_INCLUDE_DIR", Path.join(erl_interface_dir, "include"))
# erlang.mk naming
System.put_env("ERTS_INCLUDE_DIR", "#{erts_dir}/include")
System.put_env("ERL_INTERFACE_LIB_DIR", Path.join(erl_interface_dir, "lib"))
System.put_env("ERL_INTERFACE_INCLUDE_DIR", Path.join(erl_interface_dir, "include"))
# Host tools
System.put_env("AR_FOR_BUILD", "ar")
System.put_env("AS_FOR_BUILD", "as")
System.put_env("CC_FOR_BUILD", "cc")
System.put_env("GCC_FOR_BUILD", "gcc")
System.put_env("CXX_FOR_BUILD", "g++")
System.put_env("LD_FOR_BUILD", "ld")
System.put_env("CPPFLAGS_FOR_BUILD", "")
System.put_env("CFLAGS_FOR_BUILD", "")
System.put_env("CXXFLAGS_FOR_BUILD", "")
System.put_env("LDFLAGS_FOR_BUILD", "")
host_erl_major_ver = :erlang.system_info(:otp_release) |> to_string
[target_erl_major_version | _] =
sdk_sysroot
|> Path.join("/usr/lib/erlang/releases/*/OTP_VERSION")
|> Path.wildcard()
|> List.first()
|> File.read!()
|> String.trim()
|> String.split(".")
# Check to see if the system major version of ERL and the target major version match
if host_erl_major_ver != target_erl_major_version do
Mix.raise("""
Major version mismatch between host and target Erlang/OTP versions
Host version: #{host_erl_major_ver}
Target version: #{target_erl_major_version}
This will likely cause Erlang code compiled for the target to fail in
unexpected ways.
The easiest way to resolve this issue is to install the same version of
Erlang/OTP on your host. See the Nerves installation guide for doing this
using the `asdf` version manager.
The Nerves System (nerves_system_*) dependency determines the OTP version
running on the target. It is possible that a recent update to the Nerves
System pulled in a new version of Erlang/OTP. If you are using an official
Nerves System, you can verify this by reviewing the CHANGELOG.md file that
comes with the release. Run 'mix deps' to see the Nerves System version and
go to that system's repository on https://github.com/nerves-project.
If you need to run a particular version of Erlang/OTP on your target, you can
either lock the nerves_system_* dependency in your mix.exs to an older
version. Note that this route prevents you from receiving security updates
from the official systems. The other option is to build a custom Nerves
system. See the Nerves documentation for building a custom system and then
run 'make menuconfig' and look for the Erlang options.
""")
end