Switch arm64 over to our new bookworm nvidia sysroot

This also adds some cc_library rules using the sysroot necesary to build
vision code against libargus

Change-Id: Icbc529c546af2932fe4f041806ca9e6bb3cf93d1
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/frc971/orin/build_rootfs.py b/frc971/orin/build_rootfs.py
index f82bed7..ddbb853 100755
--- a/frc971/orin/build_rootfs.py
+++ b/frc971/orin/build_rootfs.py
@@ -5,7 +5,9 @@
 import collections
 import subprocess
 import shlex
+import datetime
 import os
+import shutil
 
 IMAGE = "arm64_bookworm_debian_yocto.img"
 YOCTO = "/home/austin/local/jetpack/robot-yocto/build"
@@ -295,7 +297,8 @@
             "gstreamer1.0-plugins-ugly", "gstreamer1.0-nice", "usbutils",
             "locales", "trace-cmd", "clinfo", "jq", "strace", "sysstat",
             "lm-sensors", "can-utils", "xfsprogs", "gstreamer1.0-tools",
-            "bridge-utils", "net-tools", "apt-file", "parted", "xxd"
+            "bridge-utils", "net-tools", "apt-file", "parted", "xxd",
+            "libv4l-dev"
         ])
         target(["apt-get", "clean"])
 
@@ -311,16 +314,43 @@
         install_virtual_packages(virtual_packages)
 
         yocto_package_names = [
-            'tegra-argus-daemon', 'tegra-firmware', 'tegra-firmware-tegra234',
-            'tegra-firmware-vic', 'tegra-firmware-xusb',
-            'tegra-libraries-argus-daemon-base', 'tegra-libraries-camera',
-            'tegra-libraries-core', 'tegra-libraries-cuda',
-            'tegra-libraries-eglcore', 'tegra-libraries-glescore',
-            'tegra-libraries-glxcore', 'tegra-libraries-multimedia',
+            'tegra-argus-daemon',
+            'tegra-firmware',
+            'tegra-firmware-tegra234',
+            'tegra-firmware-vic',
+            'tegra-firmware-xusb',
+            'tegra-libraries-argus-daemon-base',
+            'tegra-libraries-camera',
+            'tegra-libraries-core',
+            'tegra-libraries-cuda',
+            'tegra-libraries-eglcore',
+            'tegra-libraries-glescore',
+            'tegra-libraries-glxcore',
+            'tegra-libraries-multimedia',
             'tegra-libraries-multimedia-utils',
-            'tegra-libraries-multimedia-v4l', 'tegra-libraries-nvsci',
-            'tegra-libraries-vulkan', 'tegra-nvphs', 'tegra-nvphs-base',
-            'libnvidia-egl-wayland1'
+            'tegra-libraries-multimedia-v4l',
+            'tegra-libraries-nvsci',
+            'tegra-libraries-vulkan',
+            'tegra-nvphs',
+            'tegra-nvphs-base',
+            'libnvidia-egl-wayland1',
+            'tegra-mmapi',
+            'tegra-mmapi-dev',
+            'cuda-cudart-11-8',
+            'cuda-cudart-11-8-dev',
+            'cuda-cudart-11-8-stubs',
+            'libcurand-11-8',
+            'libcurand-11-8-dev',
+            'libcurand-11-8-stubs',
+            'cuda-nvcc-11-8',
+            'tegra-cmake-overrides',
+            'cuda-target-environment',
+            'libnpp-11-8',
+            'libnpp-11-8-stubs',
+            'libnpp-11-8-dev',
+            'cuda-cccl-11-8',
+            'cuda-nvcc-11-8',
+            'cuda-nvcc-headers-11-8',
         ]
         yocto_packages = list_yocto_packages()
         packages = list_packages()
@@ -407,6 +437,56 @@
             )
             target(["vim", "-c", "\":qa!\""])
 
+        tarball = datetime.date.today().strftime(
+            f"{os.getcwd()}/%Y-%m-%d-bookworm-arm64-nvidia-rootfs.tar")
+        print(tarball)
+
+        subprocess.run([
+            "sudo",
+            "tar",
+            "--exclude=./usr/share/ca-certificates",
+            "--exclude=./home",
+            "--exclude=./root",
+            "--exclude=./usr/src",
+            "--exclude=./usr/lib/mesa-diverted",
+            "--exclude=./usr/bin/X11",
+            "--exclude=./usr/lib/systemd/system/system-systemd*cryptsetup.slice",
+            "--exclude=./dev",
+            "--exclude=./usr/local/cuda-11.8/bin/fatbinary",
+            "--exclude=./usr/local/cuda-11.8/bin/ptxas",
+            "-cf",
+            tarball,
+            ".",
+        ],
+                       cwd=partition,
+                       check=True)
+
+        # Pack ptxas and fatbinary into the spots that clang expect them to make compiling easy.
+        nvidia_cuda_toolkit_path = 'nvidia-cuda-toolkit'
+        if not os.path.exists(nvidia_cuda_toolkit_path):
+            os.mkdir(nvidia_cuda_toolkit_path)
+
+            subprocess.run(['apt-get', 'download', 'nvidia-cuda-toolkit'],
+                           cwd=nvidia_cuda_toolkit_path,
+                           check=True)
+
+            subprocess.run(
+                ['dpkg', '-x',
+                 os.listdir(nvidia_cuda_toolkit_path)[0], '.'],
+                cwd=nvidia_cuda_toolkit_path,
+                check=True)
+
+        subprocess.run([
+            "sudo", "tar",
+            '--transform=s|usr/bin/ptxas|usr/local/cuda-11.8/bin/ptxas|',
+            '--transform=s|usr/bin/fatbinary|usr/local/cuda-11.8/bin/aarch64-unknown-linux-gnu-fatbinary|',
+            "--append", "-f", tarball, "usr/bin/fatbinary", "usr/bin/ptxas"
+        ],
+                       cwd=nvidia_cuda_toolkit_path,
+                       check=True)
+
+        subprocess.run(["sha256sum", tarball], check=True)
+
 
 if __name__ == '__main__':
     main()