Packages
nerves_system_br
1.6.4
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
Current section
Files
nerves_system_br
nerves_env.exs
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("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 -Os -I#{system_include_path}")
System.put_env("CXXFLAGS", "-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -pipe -Os -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 -lerl_interface -lei")
# 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_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. Install an Erlang OTP release that matches the target
version before continuing.
"""
end