Packages
nerves_system_br
1.34.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
#!/usr/bin/env bash
# SPDX-FileCopyrightText: 2016 Arjan Scherpenisse
# SPDX-FileCopyrightText: 2016 Frank Hunleth
# SPDX-FileCopyrightText: 2017 Justin Schneck
# SPDX-FileCopyrightText: 2021 Connor Rigby
# SPDX-FileCopyrightText: 2021 mayl
# SPDX-FileCopyrightText: 2024 Jon Carstens
#
# SPDX-License-Identifier: Apache-2.0
#
# 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..
# 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 "*.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"
}
# searches for a file named `.noscrub`. If found
# filter that folder out of the `EXECUTABLES` list later
NOSCRUBS=$(find "$RELEASE_DIR" -name ".noscrub" -exec dirname {} \;)
noscrub()
{
# Using `find` across various MacOS systems differs which may
# cause errors. So we manually cycling throught the noscrub
# list until finding a match which may be less performant
# than `find`, but reduces errors. The noscrub list should
# generally be small and is only called at the last moment
# after we've determined the file type is different
for noscrub in $NOSCRUBS; do
if [[ "$1" == "$noscrub"* ]]; then
return 0
fi
done
return 1
}
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
if noscrub "$EXECUTABLE"; then
# Skip any errors or attempts to strip
continue
fi
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. If this file comes from a library, that library may be compiling to"
echo " its source directory under \`deps\`. Manually clean up the source"
echo " directory and try building again."
echo
echo "2. 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 "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 are very sure you know what you are doing, you may place an empty"
echo "file in the same directory as the offending file(s) called '.noscrub'."
echo "This will explicitly disable scrubbing for that directory."
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.
chmod +w "$EXECUTABLE"
if ! $STRIP "$EXECUTABLE"; then
echo "WARNING: Can't remove debug symbols from $EXECUTABLE. This is expected for precompiled Rust."
fi
fi
done