Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch from extra-data to normal package (v2) #234

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 6 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,55 +35,33 @@ cd org.freedesktop.Platform.GL.nvidia
echo 'DRIVER_VERSIONS="560.35.03"' >> versions.sh
```

**5\.** Install the appropriate 1.6 Freedesktop Platform/SDK for your CPU architecture:
**5\.** Invoke the build command to build for your CPU architecture:

```bash
flatpak --user install --no-related flathub "org.freedesktop.Platform/$(flatpak --default-arch)/1.6"
flatpak --user install --no-related flathub "org.freedesktop.Sdk/$(flatpak --default-arch)/1.6"
make FB_ARGS='--user --install-deps-from=flathub'
```

**6\.** This step is not mandatory, but highly recommended for `x86_64` users (`aarch64` users should skip this):

It's about building the `i386` driver, which is necessary for 32-bit 3D apps and games to work.

If you want to proceed, [these steps](https://github.com/guihkx/freedesktop-sdk-1.6-i386/releases/latest) will guide you on how to download and set up a third-party build (because it's not available on Flathub anymore) of the i386 1.6 Freedesktop SDK.

Once you finish doing that, you can continue following the steps below.

**7\.** Invoke the build command to build for your CPU architecture:

```bash
make FB_ARGS='--user'
```

**7. a)** *(Optional)* If you have set up the i386 1.6 SDK as suggested in the previous step, you also need to run these two commands to create a i386 build:

```bash
make ARCH=i386 FB_ARGS='--user'
flatpak build-update-repo --no-summary-index repo/
```

**8\.** Create a local Flatpak remote named `nvidia-local`, pointing to the `repo/` directory:
**6\.** Create a local Flatpak remote named `nvidia-local`, pointing to the `repo/` directory:

```bash
flatpak --user remote-add --no-gpg-verify nvidia-local repo/
```

**9\.** Check what drivers you have in the repository:
**7\.** Check what drivers you have in the repository:

```bash
flatpak --user remote-ls nvidia-local
```

**10\.** Install the drivers accordingly, for example:
**8\.** Install the drivers accordingly, for example:

```bash
flatpak --user install nvidia-local org.freedesktop.Platform.GL.nvidia-560-35-03
# And if you built the i386 driver...
flatpak --user install nvidia-local org.freedesktop.Platform.GL32.nvidia-560-35-03
```

**11\.** *(Optional)* If you want to free disk space, you can then disable the `nvidia-local` repository and delete the `repo` directory (this is safe, and will not uninstall your drivers):
**9\.** *(Optional)* If you want to free disk space, you can then disable the `nvidia-local` repository and delete the `repo` directory (this is safe, and will not uninstall your drivers):

```bash
flatpak --user remote-modify --disable nvidia-local
Expand Down
80 changes: 53 additions & 27 deletions build.sh
Original file line number Diff line number Diff line change
@@ -1,45 +1,71 @@
#!/usr/bin/env bash

# shellcheck disable=SC1091
source ./versions.sh

ARCH=$1
REPO=$2
EXPORT_ARGS=$3
FB_ARGS=$4
SUBJECT=${5:-"org.freedesktop.Platform.GL.nvidia `git rev-parse HEAD`"}
SUBJECT=$5

set -e
set -x

EXT_PREFIX='org.freedesktop.Platform.GL.nvidia'
SDK_BRANCH=1.4
SDK_RUNTIME_VERSION=1.6
SDK_RUNTIME_VERSION=24.08

for VER in $DRIVER_VERSIONS; do
F="data/nvidia-$VER-$ARCH.data"
if [ ! -f $F ]; then
echo WARNING, no data file for $VER $ARCH
continue
fi
NVIDIA_VERSION=$(echo $VER | sed "s/\./-/;s/\./-/")
EXTRA_DATA=$(cat $F)
NVIDIA_URL=$(cat $F | sed "s/:[^:]*:[^:]*:[^:]*://")
rm -f org.freedesktop.Platform.GL.nvidia-$NVIDIA_VERSION.json
sed -e "s/@@SDK_BRANCH@@/${SDK_BRANCH}/g" \
-e "s/@@SDK_RUNTIME_VERSION@@/${SDK_RUNTIME_VERSION}/g" \
-e "s/@@NVIDIA_VERSION@@/${NVIDIA_VERSION}/g" \
-e "s=@@EXTRA_DATA@@=${EXTRA_DATA}=g" \
-e "s=@@NVIDIA_URL@@=${NVIDIA_URL}=g" \
-e "s=@@ARCH@@=${ARCH}=g" \
org.freedesktop.Platform.GL.nvidia.json.in > org.freedesktop.Platform.GL.nvidia-$NVIDIA_VERSION.json

flatpak-builder -v --force-clean --ccache --sandbox --delete-build-dirs \
--arch=${ARCH} --repo=${REPO} \
--subject="${SUBJECT}" \
${FB_ARGS} ${EXPORT_ARGS} builddir org.freedesktop.Platform.GL.nvidia-$NVIDIA_VERSION.json

if test "${ARCH}" = "i386" ; then \
flatpak build-commit-from ${EXPORT_ARGS} --src-ref=runtime/org.freedesktop.Platform.GL.nvidia-${NVIDIA_VERSION}/${ARCH}/${SDK_BRANCH} ${REPO} runtime/org.freedesktop.Platform.GL32.nvidia-${NVIDIA_VERSION}/x86_64/${SDK_BRANCH} ;
if test "${ARCH}" = 'x86_64'; then
# If we're building the x86_64 driver, we also build the i386 driver.
# Note: The i386 driver has to be built first, otherwise the x86_64 ostree repo gets overwritten by it.
TARGET_ARCHES="i386 ${ARCH}"
else
TARGET_ARCHES=${ARCH}
fi

rm org.freedesktop.Platform.GL.nvidia-$NVIDIA_VERSION.json
for TARGET_ARCH in ${TARGET_ARCHES}; do
F="data/nvidia-${VER}-${TARGET_ARCH}.data"
if [ ! -f "${F}" ]; then
echo "WARNING: No data file for ${VER} ${TARGET_ARCH}"
continue
fi

echo "Packaging ${TARGET_ARCH} NVIDIA driver version ${VER} on ${ARCH} host..."

NVIDIA_VERSION=$(echo "${VER}" | tr '.' '-')
NVIDIA_SHA256=$(awk -F ':' '{print $2}' "${F}")
NVIDIA_URL=$(awk -F '::' '{print $2}' "${F}")

if test -z "${SUBJECT}"; then
SUBJECT="${VER}"
if test -d '.git'; then
SUBJECT="${SUBJECT} ($(git rev-parse --short HEAD))"
fi
fi

sed -e "s/@@EXT_PREFIX@@/${EXT_PREFIX}/g" \
-e "s/@@SDK_BRANCH@@/${SDK_BRANCH}/g" \
-e "s/@@SDK_RUNTIME_VERSION@@/${SDK_RUNTIME_VERSION}/g" \
-e "s/@@NVIDIA_VERSION@@/${NVIDIA_VERSION}/g" \
-e "s=@@NVIDIA_URL@@=${NVIDIA_URL}=g" \
-e "s/@@NVIDIA_ARCH@@/${TARGET_ARCH}/g" \
-e "s/@@NVIDIA_SHA256@@/${NVIDIA_SHA256}/g" \
"${EXT_PREFIX}.json.in" > "${EXT_PREFIX}-${NVIDIA_VERSION}.json"

flatpak-builder -v --force-clean --ccache --sandbox --delete-build-dirs \
--arch="${ARCH}" \
--repo="${REPO}" \
--subject="${SUBJECT}" \
${FB_ARGS} ${EXPORT_ARGS} builddir "${EXT_PREFIX}-${NVIDIA_VERSION}.json"

if test "${TARGET_ARCH}" = 'i386'; then
flatpak build-commit-from ${EXPORT_ARGS} \
--src-ref="runtime/${EXT_PREFIX}-${NVIDIA_VERSION}/${ARCH}/${SDK_BRANCH}" \
"${REPO}" \
"runtime/org.freedesktop.Platform.GL32.nvidia-${NVIDIA_VERSION}/${ARCH}/${SDK_BRANCH}"
fi
rm "${EXT_PREFIX}-${NVIDIA_VERSION}.json"
done
done
2 changes: 1 addition & 1 deletion flathub.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"skip-appstream-check": true,
"only-arches": ["x86_64","i386","aarch64"],
"only-arches": ["x86_64", "aarch64"],
"publish-delay-hours": 0
}
2 changes: 2 additions & 0 deletions nvidia-extractor/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
all:
gcc -o nvidia-extract -Wall -DNVIDIA_VERSION='"'$(subst -,.,${NVIDIA_VERSION})'"' -DNVIDIA_ARCH='"'${NVIDIA_ARCH}'"' nvidia-extract.c ${CFLAGS} ${LDFLAGS} -larchive -lz -llzma -lzstd
85 changes: 50 additions & 35 deletions nvidia-apply-extra.c → nvidia-extractor/nvidia-extract.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
int nvidia_major_version = 0;
int nvidia_minor_version = 0;
int nvidia_patch_version = 0;
int embedded_installer = 0;

void
die_with_error (const char *format, ...)
Expand Down Expand Up @@ -122,11 +123,18 @@ should_extract (struct archive_entry *entry)
{
const char *path = archive_entry_pathname (entry);
char new_path[PATH_MAX];
int is_compat32 = 0;

if (has_prefix (path, "./"))
path += 2;

/* this tar is only a container that stores the actual driver .run file */
if (has_suffix (path, ".run"))
{
archive_entry_set_pathname (entry, "./embedded_installer.run");
embedded_installer = 1;
return 1;
}

if (strcmp (path, "nvidia_icd.json") == 0 || strcmp (path, "nvidia_icd.json.template") == 0)
{
archive_entry_set_pathname (entry, "./vulkan/icd.d/nvidia_icd.json");
Expand Down Expand Up @@ -175,17 +183,14 @@ should_extract (struct archive_entry *entry)
return 1;
}

#ifdef __i386__
/* Nvidia no longer has 32bit drivers so we are getting
* the 32bit compat libs from the 64bit drivers */
if (nvidia_major_version > 390)
if (strcmp (NVIDIA_ARCH, "i386") == 0 && nvidia_major_version > 390)
{
if (!has_prefix (path, "32/"))
return 0;
is_compat32 = 1;
path += 3;
}
#endif

/* Skip these as we're using GLVND on majod > 367*/
if (nvidia_major_version > 367 &&
Expand All @@ -203,32 +208,27 @@ should_extract (struct archive_entry *entry)
strstr (path, "egl-xcb") ||
strstr (path, "egl-xlib"))
{
if (is_compat32)
archive_entry_set_pathname (entry, path);
snprintf (new_path, sizeof new_path, "./lib/%s", path);
archive_entry_set_pathname (entry, new_path);
return 1;
}

if ((has_prefix (path, "lib") ||
has_prefix (path, "tls/lib"))&&
has_suffix (path, ".so." NVIDIA_VERSION))
{
if (is_compat32)
archive_entry_set_pathname (entry, path);
snprintf (new_path, sizeof new_path, "./lib/%s", path);
archive_entry_set_pathname (entry, new_path);
return 1;
}

if (has_suffix (path, ".dll"))
{
snprintf (new_path, sizeof new_path, "./nvidia/wine/%s", path);
snprintf (new_path, sizeof new_path, "./lib/nvidia/wine/%s", path);
archive_entry_set_pathname (entry, new_path);
return 1;
}

/* this tar is only a container that stores the actual driver .run file */
if (strcmp (path, "builds/NVIDIA-Linux-" ARCH "-" NVIDIA_VERSION ".run") == 0) {
return 1;
}

return 0;
}

Expand Down Expand Up @@ -474,15 +474,22 @@ main (int argc, char *argv[])
int skip_lines;
off_t tar_start;

if (argc < 2)
{
fprintf (stderr, "usage: ./%s <path to NVIDIA installer>\n", argv[0]);
return 1;
}
const char *nvidia_installer_path = argv[1];

if (parse_driver_version (NVIDIA_VERSION,
&nvidia_major_version,
&nvidia_minor_version,
&nvidia_patch_version))
die ("failed to parse driver version '%s'.", NVIDIA_VERSION);

fd = open (NVIDIA_BASENAME, O_RDONLY);
fd = open (nvidia_installer_path, O_RDONLY);
if (fd == -1)
die_with_error ("open extra data");
die_with_error ("opening installer");

skip_lines = find_skip_lines (fd);
tar_start = find_line_offset (fd, skip_lines);
Expand All @@ -494,40 +501,48 @@ main (int argc, char *argv[])

close (fd);

unlink (NVIDIA_BASENAME);

/* check if this container is just a wrapper over the real driver container */
if (rename ("./builds/NVIDIA-Linux-" ARCH "-" NVIDIA_VERSION ".run", NVIDIA_BASENAME) == 0)
return main (argc, argv);
else if (errno != ENOENT)
die_with_error ("rename ./builds/NVIDIA-Linux-" ARCH "-" NVIDIA_VERSION ".run failed");
if (access ("embedded_installer.run", F_OK) == 0)
{
if (embedded_installer)
{
/* marks it for deletion after it gets extracted */
embedded_installer = 0;
argv[1] = "embedded_installer.run";
return main (argc, argv);
}
else
{
unlink ("embedded_installer.run");
}
}

char *ldconfig_argv[] = {"ldconfig", "-n", ".", NULL};
char *ldconfig_argv[] = {"ldconfig", "-n", "lib", NULL};
if (subprocess (ldconfig_argv))
die ("running ldconfig failed");

if (((nvidia_major_version == 470 && nvidia_minor_version >= 63) ||
nvidia_major_version >= 495) && nvidia_major_version < 545 &&
strcmp(ARCH, "i386") != 0)
strcmp(NVIDIA_ARCH, "i386") != 0)
{
checked_symlink ("libnvidia-vulkan-producer.so." NVIDIA_VERSION,
"libnvidia-vulkan-producer.so");
"lib/libnvidia-vulkan-producer.so");
}

if (nvidia_major_version >= 550)
{
checked_symlink ("libnvidia-gpucomp.so." NVIDIA_VERSION, "libnvidia-gpucomp.so");
checked_symlink ("libnvidia-gpucomp.so." NVIDIA_VERSION, "lib/libnvidia-gpucomp.so");
}

checked_symlink ("libcuda.so.1", "libcuda.so");
checked_symlink ("libnvidia-ml.so.1", "libnvidia-ml.so");
checked_symlink ("libnvidia-opencl.so.1", "libnvidia-opencl.so");
checked_symlink ("libvdpau_nvidia.so.1", "libvdpau_nvidia.so");
checked_symlink ("libcuda.so.1", "lib/libcuda.so");
checked_symlink ("libnvidia-ml.so.1", "lib/libnvidia-ml.so");
checked_symlink ("libnvidia-opencl.so.1", "lib/libnvidia-opencl.so");
checked_symlink ("libvdpau_nvidia.so.1", "lib/libvdpau_nvidia.so");

if (nvidia_major_version >= 495)
{
mkdir ("gbm", 0755);
checked_symlink ("../libnvidia-allocator.so." NVIDIA_VERSION, "gbm/nvidia-drm_gbm.so");
mkdir ("lib/gbm", 0755);
checked_symlink ("../libnvidia-allocator.so." NVIDIA_VERSION, "lib/gbm/nvidia-drm_gbm.so");
}

if (nvidia_major_version >= 319)
Expand All @@ -540,9 +555,9 @@ main (int argc, char *argv[])

if (nvidia_major_version <= 390)
{
unlink ("libnvidia-tls.so." NVIDIA_VERSION);
unlink ("lib/libnvidia-tls.so." NVIDIA_VERSION);
checked_symlink ("tls/libnvidia-tls.so." NVIDIA_VERSION,
"libnvidia-tls.so." NVIDIA_VERSION);
"lib/libnvidia-tls.so." NVIDIA_VERSION);
}

mkdir ("OpenCL", 0755);
Expand Down
Loading