Packages
nerves_system_br
1.0.0-rc.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")
{_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", "/")
System.put_env("PKG_CONFIG_LIBDIR", Path.join(toolchain_path, "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
sdk_sysroot = Path.join(system_path, "staging")
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)
System.put_env("CC", "#{crosscompile}-gcc")
System.put_env("CXX", "#{crosscompile}-g++")
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("STRIP", "#{crosscompile}-strip")
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")
System.put_env("REBAR_TARGET_ARCH", Path.basename(crosscompile))
# Rebar naming
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