Chromebook-Device-Nyan-NVID.../build_linux_for_tegra_userspace.sh

251 lines
7.3 KiB
Bash
Executable File

#!/bin/bash
set -e
DEB_FILE_OUTPUT="nvidia-l4t-driver-21.8-nyan_armhf"
DEB_SOURCE_DIRECTORY="linux-for-tegra-userspace-deb-source"
LINUX_FOR_TEGRA_FOLDER="Linux_for_Tegra"
WORK_DIRECTORY="work-directory"
APPLY_BINARIES_SCRIPT_FILE="apply_binaries.sh"
LINUX_FOR_TEGRA_USERSPACE_PACKAGE_FILE_FOLDER="l4t-userspace-package"
information() {
echo "Flags: --disable-exit-on-error --package-maintainer <name> --package-maintainer-contact <email>"
echo "--linux-for-tegra-userspace-archive-url <url> --triple-buffering-is-disabled"
exit 1
}
if [ $# -eq 0 ]; then
information
fi
while [[ $# -gt 0 ]]; do
case "$1" in
--disable-exit-on-error)
if [ -n "$2" ] && [[ "$2" != "--"* ]]; then
echo "The build image utility will not exit regardless of reported errors"
set +e
shift 2
else
information
fi
;;
--package-maintainer)
if [ -n "$2" ] && [[ "$2" != "--"* ]]; then
PACKAGE_MAINTAINER="$2"
shift 2
else
information
fi
;;
--package-maintainer-contact)
if [ -n "$2" ] && [[ "$2" != "--"* ]]; then
PACKAGE_MAINTAINER_CONTACT="$2"
shift 2
else
information
fi
;;
--linux-for-tegra-userspace-archive-url)
if [ -n "$2" ] && [[ "$2" != "--"* ]]; then
LINUX_FOR_TEGRA_URL="$2"
shift 2
else
information
fi
;;
--triple-buffering-is-disabled)
TRIPLE_BUFFERING_IS_DISABLED="YES"
shift
;;
*)
echo "Invalid flag specified: $1"
information
;;
esac
done
if [ -z "$PACKAGE_MAINTAINER" ]; then
echo "No package maintainer was specified"
PRELIMINARY_CHECK="FAIL"
fi
if [ -z "$PACKAGE_MAINTAINER_CONTACT" ]; then
echo "No package maintainer email address contact was specified"
PRELIMINARY_CHECK="FAIL"
fi
if type -P wget >/dev/null; then
DOWNLOAD_COMMAND="wget"
elif type -P curl >/dev/null; then
DOWNLOAD_COMMAND="curl"
else
"Neither 'curl' nor 'wget' were found by the script"
PRELIMINARY_CHECK="FAIL"
fi
if ! type -P dpkg-deb >/dev/null; then
echo "The script could not find 'dpkg-deb'"
PRELIMINARY_CHECK="FAIL"
fi
if [ "$PRELIMINARY_CHECK" == "FAIL" ]; then
echo "One or more preliminary checks failed"
exit 1
fi
if [ "$TRIPLE_BUFFERING_IS_DISABLED" == "YES" ]; then
echo "The package builder will not enable triple buffering in the X11 server configuration file"
fi
if [ ${EUID: -0} -ne 0 ] || [ "$(id -u)" -ne 0 ]; then
sudo -v
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
PRIVILEGE_ESCALATION_COMMAND="sudo"
fi
if [ -d "$LINUX_FOR_TEGRA_USERSPACE_PACKAGE_FILE_FOLDER" ]; then
rm -rf "$LINUX_FOR_TEGRA_USERSPACE_PACKAGE_FILE_FOLDER"
fi
if [ -d "$WORK_DIRECTORY" ]; then
"$PRIVILEGE_ESCALATION_COMMAND" rm -rf "$WORK_DIRECTORY"
fi
mkdir "$WORK_DIRECTORY"
mkdir "$LINUX_FOR_TEGRA_USERSPACE_PACKAGE_FILE_FOLDER"
cd "$WORK_DIRECTORY"
echo "Preparing deb source tree"
mkdir -p "$DEB_SOURCE_DIRECTORY"/DEBIAN
echo
echo "Downloading NVIDIA Linux for Tegra (L4T) 21.8 userspace software and drivers"
echo -e "\n"
if [ -z "$LINUX_FOR_TEGRA_URL" ]; then
LINUX_FOR_TEGRA_URL="https://developer.download.nvidia.com/embedded/L4T/r21_Release_v8.0/release_files/Tegra124_Linux_R21.8.0_armhf.tbz2"
LINUX_FOR_TEGRA_ARCHIVE_FILE="$(basename "$LINUX_FOR_TEGRA_URL")"
fi
"$DOWNLOAD_COMMAND" "$LINUX_FOR_TEGRA_URL"
echo -e "\n"
echo "Extracting NVIDIA Linux for Tegra (L4T) archive"
echo
tar -xf "$LINUX_FOR_TEGRA_ARCHIVE_FILE" -v
echo
echo "Installing Linux for Tegra (L4T) userspace software and drivers to deb source tree"
echo
cd "$LINUX_FOR_TEGRA_FOLDER"
"$PRIVILEGE_ESCALATION_COMMAND" ./"$APPLY_BINARIES_SCRIPT_FILE" -r ../"$DEB_SOURCE_DIRECTORY"
cd ../"$DEB_SOURCE_DIRECTORY"
echo
echo "Preparing installed userspace files"
echo
"$PRIVILEGE_ESCALATION_COMMAND" mkdir -p etc/X11/xorg.conf.d
"$PRIVILEGE_ESCALATION_COMMAND" mv etc/X11/xorg.conf etc/X11/xorg.conf.d/20-tegra.conf -v
"$PRIVILEGE_ESCALATION_COMMAND" mv home/ubuntu/tegrastats usr/bin -v
"$PRIVILEGE_ESCALATION_COMMAND" chmod +x usr/bin/tegrastats
"$PRIVILEGE_ESCALATION_COMMAND" rm -rf boot home etc/{nv,pulse,systemd,modules,init,ld.so.conf.d,sysctl.d/10-console-messages.conf} usr/lib/arm-linux-gnueabihf/tegra-egl/ld.so.conf lib/firmware/{nvavp_os_f7e00000.bin,tegra_xusb_firmware} lib/modules usr/src etc/{fstab,wpa_supplicant.conf,asound.conf*} etc/udev/rules.d/{90,91,92,99-tegra-mmc-ra,99-nv-wifibt}*.rules etc/X11/xorg.conf.jetson-tk1 -v
echo "/usr/lib/arm-linux-gnueabihf/tegra" | "$PRIVILEGE_ESCALATION_COMMAND" tee usr/lib/arm-linux-gnueabihf/tegra/ld.so.conf
echo "/usr/lib/arm-linux-gnueabihf/tegra-egl" | "$PRIVILEGE_ESCALATION_COMMAND" tee usr/lib/arm-linux-gnueabihf/tegra-egl/ld.so.conf
if [ "$TRIPLE_BUFFERING_IS_DISABLED" != "YES" ]; then
"$PRIVILEGE_ESCALATION_COMMAND" sed -i '/Section "Device"/,/EndSection/{/EndSection/i\
Option "TripleBuffer" "true"
}' etc/X11/xorg.conf.d/20-tegra.conf
else
echo "Triple buffering will not be enabled in the X11 server config"
echo "Skipping the triple buffering enablement setup"
fi
echo
echo "Writing Debian postinst script"
cat << 'EOF' > DEBIAN/postinst
update-alternatives --install /etc/ld.so.conf.d/000-arm-linux-gnueabihf_GL.conf arm-linux-gnueabihf_gl_conf /usr/lib/arm-linux-gnueabihf/tegra/ld.so.conf 1000
update-alternatives --install /etc/ld.so.conf.d/001-arm-linux-gnueabihf_EGL.conf arm-linux-gnueabihf_egl_conf /usr/lib/arm-linux-gnueabihf/tegra-egl/ld.so.conf 1000
if [ -e "/usr/lib/arm-linux-gnueabihf/tegra/libglx.so" ]; then
ln -sf /usr/lib/arm-linux-gnueabihf/tegra/libglx.so /usr/lib/xorg/modules/extensions/libglx.so
fi
ldconfig
EOF
chmod +x DEBIAN/postinst
echo
echo "Writing Debian control file"
cat << 'EOF' > DEBIAN/control
Package: nvidia-l4t-driver-21-nyan
Version: 21.8
Architecture: armhf
Maintainer: MAINTAINER_IDENTIFIER <MAINTAINER_EMAIL_IDENTIFIER>
Depends: xserver-xorg-core, acpid
Section: non-free/libs
Priority: optional
Homepage: http://www.nvidia.com
Description: NVIDIA Linux for Tegra (L4T) driver package for the ChromeOS Nyan device platform
This package contains the NVIDIA Linux for Tegra (L4T) binary driver and all of its libraries,
optimized for the ChromeOS Nyan device platform to provide hardware acceleration for
OpenGL/GLX/EGL/GLES applications on X11.
EOF
sed -i "s/MAINTAINER_IDENTIFIER/$PACKAGE_MAINTAINER/g" "DEBIAN/control"
sed -i "s/MAINTAINER_EMAIL_IDENTIFIER/$PACKAGE_MAINTAINER_CONTACT/g" "DEBIAN/control"
echo
echo "Creating the .deb package containing the NVIDIA Linux for Tegra (L4T) 21.8 proprietary userspace software and drivers"
cd ..
dpkg-deb --build --root-owner-group "$DEB_SOURCE_DIRECTORY" ../"$LINUX_FOR_TEGRA_USERSPACE_PACKAGE_FILE_FOLDER"/"$DEB_FILE_OUTPUT".deb
cd ..
"$PRIVILEGE_ESCALATION_COMMAND" rm -rf "$WORK_DIRECTORY"
echo
if [ -f "$LINUX_FOR_TEGRA_USERSPACE_PACKAGE_FILE_FOLDER"/"$DEB_FILE_OUTPUT".deb ]; then
echo "The NVIDIA Linux for Tegra (L4T) 21.8 userspace software and drivers package for Chromebook device Nyan was created successfully"
exit 0
else
echo "The NVIDIA Linux for Tegra (L4T) 21.8 userspace software and drivers package for Chromebook device Nyan was not created successfully: linux-firmware-nyan_armhf.deb"
rm -rf "$LINUX_FOR_TEGRA_USERSPACE_PACKAGE_FILE_FOLDER"
exit 1
fi