diff --git a/meson.build b/meson.build
index a49c484fe64e..85ca0013733e 100644
--- a/meson.build
+++ b/meson.build
@@ -24,6 +24,9 @@ endif
 
 libcamera_version = libcamera_git_version.split('+')[0]
 
+# This script gererates the version.gen file on a 'meson dist' command.
+meson.add_dist_script('utils/run-dist.sh')
+
 # Configure the build environment.
 cc = meson.get_compiler('c')
 cxx = meson.get_compiler('cpp')
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 243dd3c180eb..360eaf80ecf1 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -93,12 +93,11 @@ endforeach
 
 libcamera_sources += control_sources
 
-gen_version = meson.source_root() / 'utils' / 'gen-version.sh'
-
-version_cpp = vcs_tag(command : [gen_version, meson.build_root()],
-                      input : 'version.cpp.in',
-                      output : 'version.cpp',
-                      fallback : meson.project_version())
+version_data = configuration_data()
+version_data.set('VCS_TAG', libcamera_git_version)
+version_cpp = configure_file(input : 'version.cpp.in',
+                             output : 'version.cpp',
+                             configuration : version_data)
 
 libcamera_sources += version_cpp
 
diff --git a/utils/gen-version.sh b/utils/gen-version.sh
index b09ad495f86a..09cede84c25e 100755
--- a/utils/gen-version.sh
+++ b/utils/gen-version.sh
@@ -5,6 +5,15 @@
 
 build_dir="$1"
 
+# If version.gen exists, output the version string from the file and exit.
+# This file is auto-generated on a 'meson dist' command from the run-dist.sh
+# script.
+if [ -f "${MESON_SOURCE_ROOT}"/version.gen ]
+then
+	cat "${MESON_SOURCE_ROOT}"/version.gen
+	exit 0
+fi
+
 # Bail out if the directory isn't under git control
 src_dir=$(git rev-parse --git-dir 2>&1) || exit 1
 src_dir=$(readlink -f "$src_dir/..")
diff --git a/utils/run-dist.sh b/utils/run-dist.sh
new file mode 100644
index 000000000000..3b6c0adb05ed
--- /dev/null
+++ b/utils/run-dist.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# On a meson dist run, generate the version string and store it in a file.
+# This will later be picked up by the utils/gen-version.sh script and used
+# instead of re-generating it. This way, if we are not building in the upstream
+# git source tree, the upstream version information will be preserved.
+
+cd "$MESON_SOURCE_ROOT" || return
+./utils/gen-version.sh > "$MESON_DIST_ROOT"/version.gen
