blob: 34d3bc50c1f1122fc5884bff4e957b6a81869caa [file] [log] [blame]
#!/bin/sh -e
DIR="$(cd "$(dirname "$0")" && pwd)"
DIR_INITRD="$DIR/_initrd"
SRC_LIBS="$(realpath "$DIR/../../src/.libs/")"
TOOLS_LIBS="$(realpath "$DIR/../../tools/.libs/")"
# Add one or more files to the initramfs, with parent directories.
# usr-merge: resolve symlinks for /lib -> /usr/lib etc. so "cp --parents" does
# not fail with "cp: cannot make directory '/tmp/initrd/lib': File exists"
# $@: path to files
initrd_add_file() {
local i
for i in "$@"; do
case "$i" in
/bin/*|/sbin/*|/lib/*|/lib64/*)
cp -a --parents "$i" "$DIR_INITRD"/usr
;;
*)
cp -a --parents "$i" "$DIR_INITRD"
;;
esac
done
}
# Add binaries with depending libraries
# $@: paths to binaries
initrd_add_bin() {
local bin
local bin_path
local file
for bin in "$@"; do
local bin_path="$(which "$bin")"
if [ -z "$bin_path" ]; then
echo "ERROR: file not found: $bin"
exit 1
fi
lddtree_out="$(lddtree -l "$bin_path")"
if [ -z "$lddtree_out" ]; then
echo "ERROR: lddtree failed on '$bin_path'"
exit 1
fi
for file in $lddtree_out; do
initrd_add_file "$file"
# Copy resolved symlink
if [ -L "$file" ]; then
initrd_add_file "$(realpath "$file")"
fi
done
done
}
# Add command to run inside the initramfs
# $@: commands
initrd_add_cmd() {
local i
if ! [ -e "$DIR_INITRD"/cmd.sh ]; then
echo "#!/bin/sh -ex" > "$DIR_INITRD"/cmd.sh
chmod +x "$DIR_INITRD"/cmd.sh
fi
for i in "$@"; do
echo "$i" >> "$DIR_INITRD"/cmd.sh
done
}
rm -rf "$DIR_INITRD"
mkdir -p "$DIR_INITRD"
cd "$DIR_INITRD"
for dir in bin sbin lib lib64; do
ln -s usr/"$dir" "$dir"
done
mkdir -p \
dev/net \
proc \
run \
sys \
tmp \
usr/bin \
usr/sbin
initrd_add_bin \
busybox \
ip
initrd_add_cmd \
"export LD_LIBRARY_PATH=$SRC_LIBS:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="$SRC_LIBS:$LD_LIBRARY_PATH"
for i in gtp-link gtp-tunnel; do
initrd_add_bin "$TOOLS_LIBS"/"$i"
ln -s "$TOOLS_LIBS"/"$i" usr/bin/"$i"
done
mkdir tests
cp "$DIR"/*.sh tests
cp "$DIR"/initrd-init.sh init
find . -print0 \
| cpio --quiet -o -0 -H newc \
| gzip -1 > "$DIR"/_initrd.gz