@@ -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}"
|
||||
Reference in New Issue
Block a user