blob: b3dcd36760d7ed3de04a577d6ccb37c8ff06b89d [file] [log] [blame]
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI=5
inherit autotools bash-completion-r1 eutils multilib multilib-minimal toolchain-funcs udev user versionator
if [[ ${PV} = 9999* ]]; then
EGIT_REPO_URI="git://anongit.freedesktop.org/systemd/systemd"
inherit git-r3
else
patchset=
SRC_URI="https://github.com/systemd/systemd/archive/v${PV}.tar.gz -> systemd-${PV}.tar.gz"
if [[ -n "${patchset}" ]]; then
SRC_URI+="
https://dev.gentoo.org/~ssuominen/${P}-patches-${patchset}.tar.xz
https://dev.gentoo.org/~williamh/dist/${P}-patches-${patchset}.tar.xz"
fi
KEYWORDS="*"
fi
DESCRIPTION="Linux dynamic and persistent device naming support (aka userspace devfs)"
HOMEPAGE="https://www.freedesktop.org/wiki/Software/systemd"
LICENSE="LGPL-2.1 MIT GPL-2"
SLOT="0"
IUSE="acl +kmod openrc selinux static-libs"
RESTRICT="test"
COMMON_DEPEND=">=sys-apps/util-linux-2.24
sys-libs/libcap[${MULTILIB_USEDEP}]
acl? ( sys-apps/acl )
kmod? ( >=sys-apps/kmod-16 )
selinux? ( >=sys-libs/libselinux-2.1.9 )
!<sys-libs/glibc-2.11
!sys-apps/gentoo-systemd-integration
!sys-apps/systemd
abi_x86_32? (
!<=app-emulation/emul-linux-x86-baselibs-20130224-r7
!app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)]
)"
# Force new make >= -r4 to skip some parallel build issues
DEPEND="${COMMON_DEPEND}
dev-util/gperf
>=dev-util/intltool-0.50
>=sys-apps/coreutils-8.16
virtual/os-headers
virtual/pkgconfig
>=sys-devel/make-3.82-r4
>=sys-kernel/linux-headers-3.9
app-text/docbook-xml-dtd:4.2
app-text/docbook-xml-dtd:4.5
app-text/docbook-xsl-stylesheets
dev-libs/libxslt"
RDEPEND="${COMMON_DEPEND}
!<sec-policy/selinux-base-2.20120725-r10"
PDEPEND=">=sys-apps/hwids-20140304[udev]
openrc? ( >=sys-fs/udev-init-scripts-26 )"
S=${WORKDIR}/systemd-${PV}
PATCHES=(
"${FILESDIR}"/${PN}-225-50-udev-default.rules-set-default-group-for-mediaX.patch
"${FILESDIR}"/${PN}-225-60-persistent-storage.rules-add-nvme-symlinks.patch
"${FILESDIR}"/${PN}-225-libudev-util-change-util_replace_whitespace.patch
"${FILESDIR}"/${PN}-225-udev-event-add-replace_whitespace-param.patch
"${FILESDIR}"/${PN}-225-udev-rules-perform-whitespace-replacement.patch
"${FILESDIR}"/${PN}-225-60-persistent-storage.rules-add-nvme-id-model.patch
"${FILESDIR}"/${PN}-225-udev-rules-all-values-can-contain-escaped-double-quotes-now.patch
"${FILESDIR}"/${PN}-225-udevadm-trigger-add-settle.patch
"${FILESDIR}"/${PN}-225-v4l_id-check-mplane-video-capture-and-output-capaili.patch
"${FILESDIR}"/${PN}-225-udevadm-hwdb-Return-non-zero-exit-code-on-error.patch
"${FILESDIR}"/${PN}-225-sysmacros.patch
"${FILESDIR}"/${PN}-225-50-udev-default.rules-set-default-group-for-udmabuf.patch
"${FILESDIR}"/${PN}-225-50-udev-default.rules-disable-REMOVE_CMD-support.patch
"${FILESDIR}"/${PN}-225-udev-rules-no-slash-run.patch
"${FILESDIR}"/${PN}-225-udev-use-interface-before-the-string-that-interface-.patch
"${FILESDIR}"/${PN}-225-udev-stop-freeing-value-after-using-it-for-setting-s.patch
"${FILESDIR}"/${PN}-225-workaround-renameat-syscall-wrapper-misdetection.patch
"${FILESDIR}"/${PN}-225-udevadm-add-ping-option-to-control-command.patch
"${FILESDIR}"/${PN}-225-fix-joystick-with-mouse-identification.patch
)
check_default_rules() {
# Make sure there are no sudden changes to upstream rules file
# (more for my own needs than anything else ...)
local udev_rules_md5=b8ad860dccae0ca51656b33c405ea2ca
MD5=$(md5sum < "${S}"/rules/50-udev-default.rules)
MD5=${MD5/ -/}
if [[ ${MD5} != ${udev_rules_md5} ]]; then
eerror "50-udev-default.rules has been updated, please validate!"
eerror "md5sum: ${MD5}"
die "50-udev-default.rules has been updated, please validate!"
fi
}
src_prepare() {
if ! [[ ${PV} = 9999* ]]; then
# secure_getenv() disable for non-glibc systems wrt bug #443030
if ! [[ $(grep -r secure_getenv * | wc -l) -eq 25 ]]; then
eerror "The line count for secure_getenv() failed, see bug #443030"
die
fi
fi
# backport some patches
if [[ -n "${patchset}" ]]; then
EPATCH_SUFFIX=patch EPATCH_FORCE=yes epatch
fi
cat <<-EOF > "${T}"/40-gentoo.rules
# Gentoo specific floppy and usb groups
SUBSYSTEM=="block", KERNEL=="fd[0-9]", GROUP="floppy"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GROUP="usb"
EOF
# change rules back to group uucp instead of dialout for now wrt #454556
sed -i -e 's/GROUP="dialout"/GROUP="uucp"/' rules/*.rules || die
# stub out the am_path_libcrypt function
echo 'AC_DEFUN([AM_PATH_LIBGCRYPT],[:])' > m4/gcrypt.m4
# apply user patches
epatch_user
eautoreconf
if ! [[ ${PV} = 9999* ]]; then
check_default_rules
fi
# Restore possibility of running --enable-static wrt #472608
sed -i \
-e '/--enable-static is not supported by systemd/s:as_fn_error:echo:' \
configure || die
if ! use elibc_glibc; then #443030
echo '#define secure_getenv(x) NULL' >> config.h.in
sed -i -e '/error.*secure_getenv/s:.*:#define secure_getenv(x) NULL:' src/shared/missing.h || die
fi
epatch "${PATCHES[@]}"
}
src_configure() {
cros_optimize_package_for_speed
# Prevent conflicts with i686 cross toolchain, bug 559726
tc-export AR CC NM OBJCOPY RANLIB
multilib-minimal_src_configure
}
multilib_src_configure() {
tc-export CC #463846
export cc_cv_CFLAGS__flto=no #502950
export cc_cv_CFLAGS__Werror_shadow=no #554454
# Keep sorted by ./configure --help and only pass --disable flags
# when *required* to avoid external deps or unnecessary compile
local econf_args
econf_args=(
--libdir=/usr/$(get_libdir)
--docdir=/usr/share/doc/${PF}
$(multilib_native_use_enable static-libs static)
--disable-nls
--disable-dbus
$(multilib_native_use_enable kmod)
--disable-xkbcommon
--disable-seccomp
$(multilib_native_use_enable selinux)
--disable-xz
--disable-lz4
--disable-pam
$(multilib_native_use_enable acl)
--disable-gcrypt
--disable-audit
--disable-libcryptsetup
--disable-qrencode
--disable-microhttpd
--disable-gnuefi
--disable-gnutls
--disable-libcurl
--disable-libidn
--disable-quotacheck
--disable-logind
--disable-polkit
--disable-myhostname
$(multilib_is_native_abi || echo "--disable-manpages")
--enable-split-usr
--without-python
--with-bashcompletiondir="$(get_bashcompdir)"
--with-rootprefix=
$(multilib_is_native_abi && echo "--with-rootlibdir=/$(get_libdir)")
--disable-elfutils
)
if ! multilib_is_native_abi; then
econf_args+=(
MOUNT_{CFLAGS,LIBS}=' '
)
fi
ECONF_SOURCE=${S} econf "${econf_args[@]}"
}
multilib_src_compile() {
echo 'BUILT_SOURCES: $(BUILT_SOURCES)' > "${T}"/Makefile.extra
emake -f Makefile -f "${T}"/Makefile.extra BUILT_SOURCES
# Most of the parallel build problems were solved by >=sys-devel/make-3.82-r4,
# but not everything -- separate building of the binaries as a workaround,
# which will force internal libraries required for the helpers to be built
# early enough, like eg. libsystemd-shared.la
if multilib_is_native_abi; then
local lib_targets=( libudev.la )
emake "${lib_targets[@]}"
local exec_targets=(
systemd-udevd
udevadm
)
emake "${exec_targets[@]}"
local helper_targets=(
ata_id
cdrom_id
collect
scsi_id
v4l_id
mtd_probe
)
emake "${helper_targets[@]}"
local man_targets=(
man/udev.conf.5
man/systemd.link.5
man/udev.7
man/systemd-udevd.service.8
man/udevadm.8
)
emake "${man_targets[@]}"
else
local lib_targets=( libudev.la )
emake "${lib_targets[@]}"
fi
}
multilib_src_install() {
if multilib_is_native_abi; then
local lib_LTLIBRARIES="libudev.la"
local pkgconfiglib_DATA="src/libudev/libudev.pc"
local targets=(
install-libLTLIBRARIES
install-includeHEADERS
install-rootbinPROGRAMS
install-rootlibexecPROGRAMS
install-udevlibexecPROGRAMS
install-dist_udevconfDATA
install-dist_udevrulesDATA
install-pkgconfiglibDATA
install-pkgconfigdataDATA
install-dist_docDATA
libudev-install-hook
install-directories-hook
install-dist_bashcompletionDATA
install-dist_networkDATA
)
# add final values of variables:
targets+=(
rootlibexec_PROGRAMS=systemd-udevd
rootbin_PROGRAMS=udevadm
lib_LTLIBRARIES="${lib_LTLIBRARIES}"
pkgconfiglib_DATA="${pkgconfiglib_DATA}"
pkgconfigdata_DATA="src/udev/udev.pc"
INSTALL_DIRS='$(sysconfdir)/udev/rules.d $(sysconfdir)/udev/hwdb.d $(sysconfdir)/systemd/network'
dist_bashcompletion_DATA="shell-completion/bash/udevadm"
dist_network_DATA="network/99-default.link"
)
emake -j1 DESTDIR="${D}" "${targets[@]}"
doman man/{udev.conf.5,systemd.link.5,udev.7,systemd-udevd.service.8,udevadm.8}
else
local lib_LTLIBRARIES="libudev.la"
local pkgconfiglib_DATA="src/libudev/libudev.pc"
local include_HEADERS="src/libudev/libudev.h"
local targets=(
install-libLTLIBRARIES
install-includeHEADERS
install-pkgconfiglibDATA
)
targets+=(
lib_LTLIBRARIES="${lib_LTLIBRARIES}"
pkgconfiglib_DATA="${pkgconfiglib_DATA}"
include_HEADERS="${include_HEADERS}"
)
emake -j1 DESTDIR="${D}" "${targets[@]}"
fi
# Move back to the old path since we filter out */systemd/* from images.
dodir /sbin
mv "${ED}"/lib/systemd/systemd-udevd "${ED}"/sbin/udevd || die
}
multilib_src_install_all() {
dodoc TODO
prune_libtool_files --all
rm -f "${D}"/lib/udev/rules.d/99-systemd.rules
rm -f "${D}"/usr/share/doc/${PF}/{LICENSE.*,GVARIANT-SERIALIZATION,DIFFERENCES,PORTING-DBUS1,sd-shutdown.h}
# see src_prepare() for content of 40-gentoo.rules
insinto /lib/udev/rules.d
doins "${T}"/40-gentoo.rules
# Install ChromeOS-specific rules
doins "${FILESDIR}"/91-chromeos-keyboard.rules
# maintainer note: by not letting the upstream build-sys create the .so
# link, you also avoid a parallel make problem
mv "${D}"/usr/share/man/man8/systemd-udevd{.service,}.8
}
pkg_postinst() {
mkdir -p "${ROOT%/}"/run
# "losetup -f" is confused if there is an empty /dev/loop/, Bug #338766
# So try to remove it here (will only work if empty).
rmdir "${ROOT%/}"/dev/loop 2>/dev/null
if [[ -d ${ROOT%/}/dev/loop ]]; then
ewarn "Please make sure your remove /dev/loop,"
ewarn "else losetup may be confused when looking for unused devices."
fi
local fstab="${ROOT%/}"/etc/fstab dev path fstype rest
while read -r dev path fstype rest; do
if [[ ${path} == /dev && ${fstype} != devtmpfs ]]; then
ewarn "You need to edit your /dev line in ${fstab} to have devtmpfs"
ewarn "filesystem. Otherwise udev won't be able to boot."
ewarn "See, https://bugs.gentoo.org/453186"
fi
done < "${fstab}"
if [[ -d ${ROOT%/}/usr/lib/udev ]]; then
ewarn
ewarn "Please re-emerge all packages on your system which install"
ewarn "rules and helpers in /usr/lib/udev. They should now be in"
ewarn "/lib/udev."
ewarn
ewarn "One way to do this is to run the following command:"
ewarn "emerge -av1 \$(qfile -q -S -C /usr/lib/udev)"
ewarn "Note that qfile can be found in app-portage/portage-utils"
fi
local old_cd_rules="${ROOT%/}"/etc/udev/rules.d/70-persistent-cd.rules
local old_net_rules="${ROOT%/}"/etc/udev/rules.d/70-persistent-net.rules
for old_rules in "${old_cd_rules}" "${old_net_rules}"; do
if [[ -f ${old_rules} ]]; then
ewarn
ewarn "File ${old_rules} is from old udev installation but if you still use it,"
ewarn "rename it to something else starting with 70- to silence this deprecation"
ewarn "warning."
fi
done
# If user has disabled 80-net-name-slot.rules using a empty file or a symlink to /dev/null,
# do the same for 80-net-setup-link.rules to keep the old behavior
local net_move=no
local net_name_slot_sym=no
local net_rules_path="${ROOT%/}"/etc/udev/rules.d
local net_name_slot="${net_rules_path}"/80-net-name-slot.rules
local net_setup_link="${net_rules_path}"/80-net-setup-link.rules
if [[ ! -e ${net_setup_link} ]]; then
[[ -f ${net_name_slot} && $(sed -e "/^#/d" -e "/^\W*$/d" ${net_name_slot} | wc -l) == 0 ]] && net_move=yes
if [[ -L ${net_name_slot} && $(readlink ${net_name_slot}) == /dev/null ]]; then
net_move=yes
net_name_slot_sym=yes
fi
fi
if [[ ${net_move} == yes ]]; then
ebegin "Copying ${net_name_slot} to ${net_setup_link}"
if [[ ${net_name_slot_sym} == yes ]]; then
ln -nfs /dev/null "${net_setup_link}"
else
cp "${net_name_slot}" "${net_setup_link}"
fi
eend $?
fi
# https://cgit.freedesktop.org/systemd/systemd/commit/rules/50-udev-default.rules?id=3dff3e00e044e2d53c76fa842b9a4759d4a50e69
# https://bugs.gentoo.org/246847
# https://bugs.gentoo.org/514174
enewgroup input
# Update hwdb database in case the format is changed by udev version.
if has_version 'sys-apps/hwids[udev]'; then
udevadm hwdb --update --root="${ROOT%/}"
# Only reload when we are not upgrading to avoid potential race w/ incompatible hwdb.bin and the running udevd
# https://cgit.freedesktop.org/systemd/systemd/commit/?id=1fab57c209035f7e66198343074e9cee06718bda
[[ -z ${REPLACING_VERSIONS} ]] && udev_reload
fi
}