mirror of
https://github.com/archr-linux/Arch-R.git
synced 2026-03-31 14:41:55 -07:00
cp (and potentially mkdir -p) are not atomic, and we have seen situations where two packages concurrently copying the same file (eg. the udev rule for xf86-video-nvidia and xf86-video-nvidia-legacy) will succeed for one package but the other package fails with a "file exists" error (as the file didn't exist when it checked, but does exist when it actually copies the file). Not even cp -f will avoid this issue. There are several workarounds, but the most practical (and general) solution is to ensure sequential updates of the image and shared sysroot directories.
179 lines
5.1 KiB
Bash
Executable File
179 lines
5.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
# Copyright (C) 2010-2011 Roman Weber (roman@openelec.tv)
|
|
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
|
|
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
|
|
|
|
. config/options "${1}"
|
|
|
|
if [ -z "${1}" ]; then
|
|
die "usage: ${0} package_name [parent_pkg]"
|
|
fi
|
|
|
|
if [ -z "${PKG_NAME}" ]; then
|
|
die "$(print_color CLR_ERROR "${1}: no package.mk file found")"
|
|
fi
|
|
|
|
if [ -z "${INSTALL}" ] ; then
|
|
die "error: '\${INSTALL}' not set! this script is not intended to be run manually"
|
|
fi
|
|
|
|
if [ -n "${PKG_ARCH}" ]; then
|
|
listcontains "${PKG_ARCH}" "!${TARGET_ARCH}" && exit 0
|
|
listcontains "${PKG_ARCH}" "${TARGET_ARCH}" || listcontains "${PKG_ARCH}" "any" || exit 0
|
|
fi
|
|
|
|
# set defaults
|
|
if [ "${1//:/}" != "${1}" ]; then
|
|
TARGET="${1#*:}"
|
|
else
|
|
TARGET=
|
|
fi
|
|
[ -z "${TARGET}" ] && TARGET="target"
|
|
PARENT_PKG="${2:-${PKG_NAME}:${TARGET}}"
|
|
|
|
pkg_lock "${PKG_NAME}:${TARGET}" "install" "${PARENT_PKG}"
|
|
|
|
STAMP=${STAMPS_INSTALL}/${PKG_NAME}/install_${TARGET}
|
|
if [ -f ${STAMP} ]; then
|
|
pkg_lock_status "UNLOCK" "${PKG_NAME}:${TARGET}" "install" "already installed"
|
|
exit 0
|
|
fi
|
|
|
|
mkdir -p ${STAMPS_INSTALL}/${PKG_NAME}
|
|
|
|
${SCRIPTS}/build "${1}" "${PARENT_PKG}"
|
|
|
|
if is_sequential_build || [ "${PARENT_PKG}" = "initramfs:target" ]; then
|
|
if [ "${TARGET}" = "target" ] ; then
|
|
for p in ${PKG_DEPENDS_TARGET}; do
|
|
${SCRIPTS}/install "${p}" "${PARENT_PKG}"
|
|
done
|
|
elif [ "${TARGET}" = "init" ] ; then
|
|
for p in ${PKG_DEPENDS_INIT}; do
|
|
${SCRIPTS}/install "${p}" "${PARENT_PKG}"
|
|
done
|
|
fi
|
|
fi
|
|
if [ "${TARGET}" = "init" ] ; then
|
|
INSTALL=${BUILD}/initramfs
|
|
fi
|
|
|
|
pkg_lock_status "ACTIVE" "${PKG_NAME}:${TARGET}" "install"
|
|
|
|
build_msg "CLR_INSTALL" "INSTALL" "${PKG_NAME} $(print_color CLR_TARGET "(${TARGET})")" "indent"
|
|
|
|
acquire_update_lock image
|
|
|
|
mkdir -p ${INSTALL}
|
|
|
|
if [ "${TARGET}" = "target" ] ; then
|
|
for PKG_TMP_DIR in ${PKG_DIR} \
|
|
${PROJECT_DIR}/${PROJECT}/packages/${PKG_NAME} \
|
|
${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/packages/${PKG_NAME} \
|
|
; do
|
|
|
|
[ -d ${PKG_TMP_DIR} ] || continue
|
|
|
|
if [ -d ${PKG_TMP_DIR}/profile.d ]; then
|
|
mkdir -p ${INSTALL}/etc/profile.d
|
|
cp ${PKG_TMP_DIR}/profile.d/*.conf ${INSTALL}/etc/profile.d
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/tmpfiles.d ]; then
|
|
mkdir -p ${INSTALL}/usr/lib/tmpfiles.d
|
|
cp ${PKG_TMP_DIR}/tmpfiles.d/*.conf ${INSTALL}/usr/lib/tmpfiles.d
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/system.d ]; then
|
|
mkdir -p ${INSTALL}/usr/lib/systemd/system
|
|
cp -Pr ${PKG_TMP_DIR}/system.d/*.* ${INSTALL}/usr/lib/systemd/system
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/udev.d ]; then
|
|
mkdir -p ${INSTALL}/usr/lib/udev/rules.d
|
|
cp ${PKG_TMP_DIR}/udev.d/*.rules ${INSTALL}/usr/lib/udev/rules.d
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/hwdb.d ]; then
|
|
mkdir -p ${INSTALL}/usr/lib/udev/hwdb.d
|
|
cp ${PKG_TMP_DIR}/hwdb.d/*.hwdb ${INSTALL}/usr/lib/udev/hwdb.d
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/sleep.d ]; then
|
|
mkdir -p ${INSTALL}/usr/lib/systemd/system-sleep
|
|
cp ${PKG_TMP_DIR}/sleep.d/* ${INSTALL}/usr/lib/systemd/system-sleep
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/sleep.d.serial ]; then
|
|
mkdir -p ${INSTALL}/usr/lib/systemd/system-sleep.serial
|
|
cp ${PKG_TMP_DIR}/sleep.d.serial/* ${INSTALL}/usr/lib/systemd/system-sleep.serial
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/sysctl.d ]; then
|
|
mkdir -p ${INSTALL}/usr/lib/sysctl.d
|
|
cp ${PKG_TMP_DIR}/sysctl.d/*.conf ${INSTALL}/usr/lib/sysctl.d
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/modules-load.d ]; then
|
|
mkdir -p ${INSTALL}/usr/lib/modules-load.d
|
|
cp ${PKG_TMP_DIR}/modules-load.d/*.conf ${INSTALL}/usr/lib/modules-load.d
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/sysconf.d ]; then
|
|
mkdir -p ${INSTALL}/etc/sysconf.d
|
|
cp ${PKG_TMP_DIR}/sysconf.d/*.conf ${INSTALL}/etc/sysconf.d
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/debug.d ]; then
|
|
mkdir -p ${INSTALL}/usr/share/debugconf
|
|
cp ${PKG_TMP_DIR}/debug.d/*.conf ${INSTALL}/usr/share/debugconf
|
|
fi
|
|
|
|
if [ -d ${PKG_TMP_DIR}/modprobe.d ]; then
|
|
mkdir -p ${INSTALL}/usr/lib/modprobe.d
|
|
cp ${PKG_TMP_DIR}/modprobe.d/*.conf ${INSTALL}/usr/lib/modprobe.d
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# install
|
|
if [ "${TARGET}" = "target" ] ; then
|
|
pkg_call_exists pre_install && pkg_call pre_install
|
|
fi
|
|
|
|
if [ -n "${PKG_INSTALL}" -a -d "${PKG_INSTALL}" ]; then
|
|
tar \
|
|
-C "${PKG_INSTALL}" \
|
|
--exclude=./usr/local/include \
|
|
--exclude=./usr/local/lib/cmake \
|
|
--exclude=./usr/local/lib/pkgconfig \
|
|
--exclude=./usr/local/share/aclocal \
|
|
--exclude=./usr/local/share/pkgconfig \
|
|
--exclude=./usr/include \
|
|
--exclude=./usr/lib/cmake \
|
|
--exclude=./usr/lib/pkgconfig \
|
|
--exclude=./usr/share/aclocal \
|
|
--exclude=./usr/share/pkgconfig \
|
|
--exclude=./include \
|
|
--exclude=./lib/cmake \
|
|
--exclude=./lib/pkgconfig \
|
|
--exclude=./share/aclocal \
|
|
--exclude=./share/pkgconfig \
|
|
--exclude=./.* \
|
|
--exclude='*.a' \
|
|
--exclude='*.la' \
|
|
-cf - . | tar -C "${INSTALL}" -xf -
|
|
fi
|
|
|
|
if [ "${TARGET}" = "target" ] ; then
|
|
pkg_call_exists post_install && pkg_call post_install
|
|
fi
|
|
|
|
release_update_lock
|
|
|
|
touch ${STAMP}
|
|
|
|
pkg_lock_status "UNLOCK" "${PKG_NAME}:${TARGET}" "install" "installed"
|