Packages
nerves_system_br
1.12.0-rc.0
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
scripts/scrub-otp-release.sh
#!/bin/sh
# Remove or minimize files in an Erlang/OTP release directory
# in preparation for use packaging in a Nerves firmware image.
#
# scrub-otp-release.sh <Erlang/OTP release directory>
set -e
export LC_ALL=C
SCRIPT_NAME=$(basename "$0")
RELEASE_DIR="$1"
# Check that the release directory exists
if [ ! -d "$RELEASE_DIR" ]; then
echo "$SCRIPT_NAME: ERROR: Missing Erlang/OTP release directory: ($RELEASE_DIR)"
exit 1
fi
if [ ! -d "$RELEASE_DIR/lib" ] || [ ! -d "$RELEASE_DIR/releases" ]; then
echo "$SCRIPT_NAME: ERROR: Expecting '$RELEASE_DIR' to contain 'lib' and 'releases' subdirectories"
exit 1
fi
STRIP="$CROSSCOMPILE-strip"
READELF="$CROSSCOMPILE-readelf"
if [ ! -e "$STRIP" ] || [ ! -e "$READELF" ]; then
echo "$SCRIPT_NAME: ERROR: Expecting \$CROSSCOMPILE to be set. Did you source nerves-env.sh?"
echo " \"mix firmware\" should do this for you. Please file an issue is using \"mix\"."
echo " Additional information:"
echo " strip=$STRIP"
echo " readelf=$READELF"
exit 1
fi
# Clean up the Erlang release of all the files that we don't need.
# The user should create their releases without source code
# unless they want really big images..
rm -fr "${RELEASE_DIR:?}/bin" "$RELEASE_DIR"/erts-*
# Delete empty directories
find "$RELEASE_DIR" -type d -empty -delete
# Delete any temp files, release tarballs, etc from the base release directory
# Nothing is supposed to be there.
find "$RELEASE_DIR" -maxdepth 1 -type f -delete
# Clean up the releases directory
find "$RELEASE_DIR/releases" \( -name "*.sh" \
-o -name "*.bat" \
-o -name "*.ps1" \
-o -name "*gz" \
-o -name "start.boot" \
-o -name "start_clean.boot" \
-o -name "*.script" \
\) -delete
#
# Scrub the executables
#
executable_type()
{
FILE=$1
# Try readelf first, since it's output seems more trustworthy for executables
READELF_OUTPUT=$("$READELF" -h "$FILE" 2>/dev/null || true)
if [ "$READELF_OUTPUT" ]; then
ELF_MACHINE=$(echo "$READELF_OUTPUT" | sed -E -e '/^ Machine: +(.+)/!d; s//\1/;' | head -1)
ELF_FLAGS=$(echo "$READELF_OUTPUT" | sed -E -e '/^ Flags: +(.+)/!d; s//\1/;' | head -1)
if [ -z "$ELF_MACHINE" ]; then
echo "$SCRIPT_NAME: ERROR: Didn't expect empty machine field in ELF header in $FILE." 1>&2
echo " Try running '$READELF -h $FILE' and" 1>&2
echo " and create an issue at https://github.com/nerves-project/nerves_system_br/issues." 1>&2
exit 1
fi
echo "readelf:$ELF_MACHINE;$ELF_FLAGS"
else
# readelf didn't work, so try file and guess at things that will cause problems
FILE_OUTPUT=$(file -b -h "$FILE")
case "$FILE_OUTPUT" in
*shared*library*)
echo "file:$FILE_OUTPUT"
;;
*x86_64*)
echo "file:$FILE_OUTPUT"
;;
*)
echo "portable"
;;
esac
fi
}
get_expected_executable_type()
{
# Compile a trivial C program with the crosscompiler
# so that we know what the `file` output should look like.
tmpfile=$(mktemp /tmp/scrub-otp-release.XXXXXX)
echo "int main() {}" | "$CROSSCOMPILE-gcc" -x c -o "$tmpfile" -
executable_type "$tmpfile"
rm "$tmpfile"
}
EXECUTABLES=$(find "$RELEASE_DIR" -type f -perm -100)
EXPECTED_TYPE=$(get_expected_executable_type)
for EXECUTABLE in $EXECUTABLES; do
TYPE=$(executable_type "$EXECUTABLE")
if [ "$TYPE" != "portable" ]; then
# Verify that the executable was compiled for the target
if [ "$TYPE" != "$EXPECTED_TYPE" ]; then
echo "$SCRIPT_NAME: ERROR: Unexpected executable format for '$EXECUTABLE'"
echo
echo "Got:"
echo " $TYPE"
echo
echo "Expecting:"
echo " $EXPECTED_TYPE"
echo
echo "This file was compiled for the host or a different target and probably"
echo "will not work."
echo
echo "Check the following:"
echo
echo "1. Are you using a path dependency in your mix deps? If so, run"
echo " 'mix clean' in that directory to avoid pulling in any of its"
echo " build products."
echo
echo "2. Did you recently upgrade to Elixir 1.9 or Nerves 1.5?"
echo " Nerves 1.5 adds support for Elixir 1.9 Releases and requires"
echo " you to either add an Elixir 1.9 Release configuration or add"
echo " Distillery as a dependency. Without this, the OTP binaries"
echo " for your build machine will get included incorrectly and cause"
echo " this error. See"
echo " https://hexdocs.pm/nerves/updating-projects.html#updating-from-v1-4-to-v1-5"
echo
echo "3. Did you recently upgrade or change your Nerves system? If so,"
echo " try cleaning and rebuilding this project and its deps."
echo
echo "4. Are you building outside of Nerves' mix integration? If so,"
echo " make sure that you've sourced 'nerves-env.sh'."
echo
echo "If you're still having trouble, please file an issue on Github"
echo "at https://github.com/nerves-project/nerves_system_br/issues."
echo
exit 1
fi
# Strip debug information from ELF binaries
# Symbols are still available to the user in the release directory.
$STRIP "$EXECUTABLE"
fi
done