Initial release
build-mesa-git / build-deb (push) Successful in 5m12s

This commit is contained in:
2026-06-21 13:39:54 +02:00
commit 398e91bb2d
6 changed files with 680 additions and 0 deletions
+159
View File
@@ -0,0 +1,159 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
ROOT_DIR=$(cd -- "${SCRIPT_DIR}/.." && pwd)
CONFIG_FILE="${ROOT_DIR}/config/mesa-opt.conf"
if [[ ! -f "${CONFIG_FILE}" ]]; then
echo "missing config: ${CONFIG_FILE}" >&2
exit 1
fi
# shellcheck disable=SC1090
source "${CONFIG_FILE}"
require_cmd() {
local cmd
for cmd in "$@"; do
command -v "${cmd}" >/dev/null 2>&1 || {
echo "missing command: ${cmd}" >&2
exit 1
}
done
}
require_cmd dpkg-deb git meson ninja python3
WORK_DIR="${ROOT_DIR}/work"
LIBDRM_SRC_DIR="${WORK_DIR}/libdrm"
LIBDRM_BUILD_DIR="${WORK_DIR}/build-libdrm"
SRC_DIR="${WORK_DIR}/mesa"
BUILD_DIR="${WORK_DIR}/build"
PKG_DIR="${WORK_DIR}/pkg"
PREREQ_DIR="${WORK_DIR}/prereq"
DIST_DIR="${ROOT_DIR}/dist"
mkdir -p "${WORK_DIR}" "${DIST_DIR}"
rm -rf "${LIBDRM_SRC_DIR}" "${LIBDRM_BUILD_DIR}" "${SRC_DIR}" "${BUILD_DIR}" "${PKG_DIR}" "${PREREQ_DIR}"
mkdir -p "${PKG_DIR}"
UPSTREAM_REF="${MESA_UPSTREAM_REF:-${UPSTREAM_GIT_REF}}"
LIBDRM_REF="${LIBDRM_UPSTREAM_REF:-${LIBDRM_GIT_REF}}"
git clone --depth 1 --branch "${LIBDRM_REF}" "${LIBDRM_GIT_URL}" "${LIBDRM_SRC_DIR}"
meson setup "${LIBDRM_BUILD_DIR}" "${LIBDRM_SRC_DIR}" \
--buildtype="${BUILD_TYPE}" \
--prefix="${INSTALL_PREFIX}"
ninja -C "${LIBDRM_BUILD_DIR}"
DESTDIR="${PREREQ_DIR}" ninja -C "${LIBDRM_BUILD_DIR}" install
# Debian's xf86drm.h includes <drm.h>, while newer libdrm installs it below
# include/libdrm/. Mirror the headers into the prefix root so Mesa finds them.
if [[ -d "${PREREQ_DIR}${INSTALL_PREFIX}/include/libdrm" ]]; then
ln -sf libdrm/drm.h "${PREREQ_DIR}${INSTALL_PREFIX}/include/drm.h"
ln -sf libdrm/drm_mode.h "${PREREQ_DIR}${INSTALL_PREFIX}/include/drm_mode.h"
ln -sf libdrm/libsync.h "${PREREQ_DIR}${INSTALL_PREFIX}/include/libsync.h"
fi
# libdrm's pkg-config metadata points to the real prefix path. Mirror the staged
# files there during the Mesa build so compiler and linker can resolve them.
mkdir -p "${INSTALL_PREFIX}"
cp -a "${PREREQ_DIR}${INSTALL_PREFIX}/." "${INSTALL_PREFIX}/"
export PKG_CONFIG_PATH="${PREREQ_DIR}${INSTALL_PREFIX}/lib/x86_64-linux-gnu/pkgconfig:${PREREQ_DIR}${INSTALL_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH:-}"
export LD_LIBRARY_PATH="${PREREQ_DIR}${INSTALL_PREFIX}/lib/x86_64-linux-gnu:${PREREQ_DIR}${INSTALL_PREFIX}/lib:${LD_LIBRARY_PATH:-}"
git clone --depth 1 --branch "${UPSTREAM_REF}" "${UPSTREAM_GIT_URL}" "${SRC_DIR}"
detect_upstream_version() {
local source_dir="${1}"
if [[ -f "${source_dir}/VERSION" ]]; then
sed -n '1p' "${source_dir}/VERSION"
return
fi
awk -F"'" '/project\(/ { for (i = 1; i <= NF; ++i) if ($i ~ /^[0-9][0-9A-Za-z.+~:-]*$/) { print $i; exit } }' \
"${source_dir}/meson.build"
}
GIT_SHA=$(git -C "${SRC_DIR}" rev-parse --short=12 HEAD)
GIT_SHA_FULL=$(git -C "${SRC_DIR}" rev-parse HEAD)
UPSTREAM_VERSION="${PACKAGE_VERSION_PREFIX:-$(detect_upstream_version "${SRC_DIR}")}"
UPSTREAM_SERIES="$(printf '%s' "${UPSTREAM_VERSION}" | sed -E 's/^([0-9]+\.[0-9]+).*/\1/')"
PACKAGE_VERSION="${UPSTREAM_SERIES}+git${GIT_SHA}-${PACKAGE_RELEASE}"
OUTPUT_DEB="${DIST_DIR}/${PACKAGE_NAME}_${PACKAGE_VERSION}_${PACKAGE_ARCH}.deb"
meson setup "${BUILD_DIR}" "${SRC_DIR}" \
--buildtype="${BUILD_TYPE}" \
--prefix="${INSTALL_PREFIX}" \
-Dplatforms="${PLATFORMS}" \
-Dgallium-drivers="${GALLIUM_DRIVERS}" \
-Dvulkan-drivers="${VULKAN_DRIVERS}" \
-Dvulkan-layers="${VULKAN_LAYERS}" \
-Dglx=dri \
-Dllvm=enabled \
-Dshared-glapi=enabled
ninja -C "${BUILD_DIR}"
cp -a "${PREREQ_DIR}/." "${PKG_DIR}/"
DESTDIR="${PKG_DIR}" ninja -C "${BUILD_DIR}" install
mkdir -p \
"${PKG_DIR}/DEBIAN" \
"${PKG_DIR}/usr/share/doc/${PACKAGE_NAME}" \
"${PKG_DIR}/usr/bin"
cat > "${PKG_DIR}/DEBIAN/control" <<EOF
Package: ${PACKAGE_NAME}
Version: ${PACKAGE_VERSION}
Section: libs
Priority: optional
Architecture: ${PACKAGE_ARCH}
Maintainer: magges <magges@local>
Depends: libc6, libexpat1, libgcc-s1, libgl1, libllvm${LLVM_RUNTIME_VERSION:-19}, libstdc++6, libvulkan1, libwayland-client0, libx11-6, zlib1g
Description: Mesa snapshot build installed below ${INSTALL_PREFIX}
Built from ${UPSTREAM_GIT_URL} (${UPSTREAM_REF}) with bundled libdrm from
${LIBDRM_GIT_URL} (${LIBDRM_REF}) and installed into ${INSTALL_PREFIX}.
EOF
cat > "${PKG_DIR}/usr/share/doc/${PACKAGE_NAME}/README.Debian" <<EOF
This package installs a standalone Mesa snapshot in ${INSTALL_PREFIX}.
Use it with:
export LD_LIBRARY_PATH=${INSTALL_PREFIX}/lib/x86_64-linux-gnu:${INSTALL_PREFIX}/lib:\$LD_LIBRARY_PATH
export LIBGL_DRIVERS_PATH=${INSTALL_PREFIX}/lib/x86_64-linux-gnu/dri
export VK_LAYER_PATH=${INSTALL_PREFIX}/share/vulkan/explicit_layer.d
export VK_ICD_FILENAMES=${INSTALL_PREFIX}/share/vulkan/icd.d/radeon_icd.x86_64.json:${INSTALL_PREFIX}/share/vulkan/icd.d/lvp_icd.x86_64.json
EOF
cat > "${PKG_DIR}/usr/bin/${PACKAGE_NAME}-env" <<EOF
#!/usr/bin/env bash
set -euo pipefail
export LD_LIBRARY_PATH="${INSTALL_PREFIX}/lib/x86_64-linux-gnu:${INSTALL_PREFIX}/lib:\${LD_LIBRARY_PATH:-}"
export LIBGL_DRIVERS_PATH="${INSTALL_PREFIX}/lib/x86_64-linux-gnu/dri"
export VK_LAYER_PATH="${INSTALL_PREFIX}/share/vulkan/explicit_layer.d"
export VK_ICD_FILENAMES="${INSTALL_PREFIX}/share/vulkan/icd.d/radeon_icd.x86_64.json:${INSTALL_PREFIX}/share/vulkan/icd.d/lvp_icd.x86_64.json"
exec "\$@"
EOF
chmod 0755 "${PKG_DIR}/usr/bin/${PACKAGE_NAME}-env"
find "${PKG_DIR}" -type d -exec chmod 0755 {} +
find "${PKG_DIR}" -path "${PKG_DIR}/DEBIAN" -prune -o -type f -exec chmod 0644 {} +
chmod 0755 "${PKG_DIR}/usr/bin/${PACKAGE_NAME}-env"
dpkg-deb --build "${PKG_DIR}" "${OUTPUT_DEB}"
cat > "${DIST_DIR}/package-info.env" <<EOF
PACKAGE_NAME=${PACKAGE_NAME}
PACKAGE_VERSION=${PACKAGE_VERSION}
PACKAGE_FILE=$(basename "${OUTPUT_DEB}")
UPSTREAM_GIT_URL=${UPSTREAM_GIT_URL}
UPSTREAM_GIT_REF=${UPSTREAM_REF}
UPSTREAM_GIT_SHA=${GIT_SHA_FULL}
UPSTREAM_GIT_SHA_SHORT=${GIT_SHA}
EOF
echo "built ${OUTPUT_DEB}"
+89
View File
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
ROOT_DIR=$(cd -- "${SCRIPT_DIR}/.." && pwd)
DIST_DIR="${ROOT_DIR}/dist"
APT_DIR="${DIST_DIR}/aptrepo"
DIST_ENV="${DIST_DIR}/package-info.env"
if [[ ! -f "${DIST_ENV}" ]]; then
echo "missing dist metadata: ${DIST_ENV}" >&2
exit 1
fi
# shellcheck disable=SC1090
source "${DIST_ENV}"
require_cmd() {
local cmd
for cmd in "$@"; do
command -v "${cmd}" >/dev/null 2>&1 || {
echo "missing command: ${cmd}" >&2
exit 1
}
done
}
require_cmd dpkg-scanpackages gzip md5sum sha256sum sha512sum stat date
PACKAGE_ARCH="$(dpkg-deb -f "${DIST_DIR}/${PACKAGE_FILE}" Architecture)"
APT_SUITE="${APT_SUITE:-stable}"
APT_COMPONENT="${APT_COMPONENT:-main}"
APT_ARCH="${APT_ARCH:-${PACKAGE_ARCH}}"
APT_ORIGIN="${APT_ORIGIN:-mesa-git}"
APT_LABEL="${APT_LABEL:-mesa-git}"
APT_DESCRIPTION="${APT_DESCRIPTION:-Mesa git apt repository}"
POOL_DIR="${APT_DIR}/pool/${APT_COMPONENT}/m/${PACKAGE_NAME}"
BINARY_DIR="${APT_DIR}/dists/${APT_SUITE}/${APT_COMPONENT}/binary-${APT_ARCH}"
PACKAGE_PATH="${POOL_DIR}/${PACKAGE_FILE}"
rm -rf "${APT_DIR}"
mkdir -p "${POOL_DIR}" "${BINARY_DIR}"
cp "${DIST_DIR}/${PACKAGE_FILE}" "${PACKAGE_PATH}"
(
cd "${APT_DIR}"
dpkg-scanpackages --arch "${APT_ARCH}" "pool" > "${BINARY_DIR#${APT_DIR}/}/Packages"
)
gzip -kf "${BINARY_DIR}/Packages"
cat > "${APT_DIR}/dists/${APT_SUITE}/Release" <<EOF
Origin: ${APT_ORIGIN}
Label: ${APT_LABEL}
Suite: ${APT_SUITE}
Codename: ${APT_SUITE}
Architectures: ${APT_ARCH}
Components: ${APT_COMPONENT}
Description: ${APT_DESCRIPTION}
Date: $(date -Ru)
EOF
append_checksum_block() {
local label="${1}"
local checksum_cmd="${2}"
local release_file="${APT_DIR}/dists/${APT_SUITE}/Release"
local rel_dir="${APT_DIR}/dists/${APT_SUITE}"
local file
local sum
local size
local rel_path
printf '%s:\n' "${label}" >> "${release_file}"
while IFS= read -r -d '' file; do
rel_path="${file#${rel_dir}/}"
sum="$(${checksum_cmd} "${file}" | awk '{print $1}')"
size="$(stat -c '%s' "${file}")"
printf ' %s %16s %s\n' "${sum}" "${size}" "${rel_path}" >> "${release_file}"
done < <(find "${rel_dir}" -type f ! -name Release -print0 | sort -z)
}
append_checksum_block "MD5Sum" md5sum
append_checksum_block "SHA256" sha256sum
append_checksum_block "SHA512" sha512sum
+96
View File
@@ -0,0 +1,96 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
ROOT_DIR=$(cd -- "${SCRIPT_DIR}/.." && pwd)
DIST_ENV="${ROOT_DIR}/dist/package-info.env"
MESA_SRC_DIR="${ROOT_DIR}/work/mesa"
if [[ ! -f "${DIST_ENV}" ]]; then
echo "missing dist metadata: ${DIST_ENV}" >&2
exit 1
fi
if [[ ! -d "${MESA_SRC_DIR}/.git" ]]; then
echo "missing mesa source checkout: ${MESA_SRC_DIR}" >&2
exit 1
fi
# shellcheck disable=SC1090
source "${DIST_ENV}"
require_env() {
local name
for name in "$@"; do
if [[ -z "${!name:-}" ]]; then
echo "missing environment variable: ${name}" >&2
exit 1
fi
done
}
require_env GITEA_SERVER_URL GITEA_REPOSITORY GITEA_TOKEN RELEASE_TAG
RELEASES_JSON="$(curl -fsS \
-H "Authorization: token ${GITEA_TOKEN}" \
"${GITEA_SERVER_URL}/api/v1/repos/${GITEA_REPOSITORY}/releases?limit=20")"
PREVIOUS_SHA="$(
python3 - "${RELEASES_JSON}" "${RELEASE_TAG}" "${PACKAGE_NAME}" <<'PY'
import json
import re
import sys
releases = json.loads(sys.argv[1])
current_tag = sys.argv[2]
package_name = sys.argv[3]
pattern = re.compile(rf"^{re.escape(package_name)}-.*\+git([0-9a-f]{{12}})-")
for release in releases:
tag = release.get("tag_name", "")
if tag == current_tag:
continue
match = pattern.match(tag)
if match:
print(match.group(1))
break
PY
)"
COMMITS_TRUNCATED=0
COMMIT_LIMIT=50
if [[ -n "${PREVIOUS_SHA}" ]] && git -C "${MESA_SRC_DIR}" rev-parse --verify --quiet "${PREVIOUS_SHA}^{commit}" >/dev/null; then
COMPARE_RANGE="${PREVIOUS_SHA}..${UPSTREAM_GIT_SHA}"
mapfile -t COMMITS < <(git -C "${MESA_SRC_DIR}" log --no-merges --format='- %h %s' "${COMPARE_RANGE}")
RANGE_LABEL="Changes since \`${PREVIOUS_SHA}\`"
else
COMPARE_RANGE="${UPSTREAM_GIT_SHA}"
mapfile -t COMMITS < <(git -C "${MESA_SRC_DIR}" log --no-merges -n "${COMMIT_LIMIT}" --format='- %h %s' "${COMPARE_RANGE}")
RANGE_LABEL="Recent upstream commits"
fi
if (( ${#COMMITS[@]} > COMMIT_LIMIT )); then
COMMITS=( "${COMMITS[@]:0:${COMMIT_LIMIT}}" )
COMMITS_TRUNCATED=1
fi
{
printf '## Mesa Upstream\n\n'
printf -- '- Upstream: `%s`\n' "${UPSTREAM_GIT_URL}"
printf -- '- Ref: `%s`\n' "${UPSTREAM_GIT_REF}"
printf -- '- Commit: `%s`\n' "${UPSTREAM_GIT_SHA_SHORT}"
printf -- '- Package: `%s`\n\n' "${PACKAGE_FILE}"
printf '## %s\n\n' "${RANGE_LABEL}"
if (( ${#COMMITS[@]} == 0 )); then
printf -- '- No new upstream commits found for this release.\n'
else
printf '%s\n' "${COMMITS[@]}"
fi
if (( COMMITS_TRUNCATED == 1 )); then
printf '\n_Release notes truncated to the first %d commits._\n' "${COMMIT_LIMIT}"
fi
} > "${ROOT_DIR}/dist/release-notes.md"