blob: c9535b33420a7fd782373f55528e65e5eaadee6c [file] [log] [blame]
# Copyright 1999-2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=7
PYTHON_COMPAT=( python2_7 )
inherit bash-completion-r1 estack eutils toolchain-funcs python-single-r1 linux-info
MY_PV="${PV/_/-}"
MY_PV="${MY_PV/-pre/-git}"
DESCRIPTION="Userland tools for Linux Performance Counters"
HOMEPAGE="https://perf.wiki.kernel.org/"
LINUX_V="${PV:0:1}.x"
if [[ ${PV} == *_rc* ]] ; then
LINUX_VER=$(ver_cut 1-2).$(($(ver_cut 3)-1))
PATCH_VERSION=$(ver_cut 1-3)
LINUX_PATCH=patch-${PV//_/-}.xz
SRC_URI="https://www.kernel.org/pub/linux/kernel/v${LINUX_V}/testing/${LINUX_PATCH}
https://www.kernel.org/pub/linux/kernel/v${LINUX_V}/testing/v${PATCH_VERSION}/${LINUX_PATCH}"
elif [[ ${PV} == *.*.* ]] ; then
# stable-release series
LINUX_VER=$(ver_cut 1-2)
LINUX_PATCH=patch-${PV}.xz
SRC_URI="https://www.kernel.org/pub/linux/kernel/v${LINUX_V}/${LINUX_PATCH}"
else
LINUX_VER=${PV}
SRC_URI=""
fi
LINUX_SOURCES="linux-${LINUX_VER}.tar.xz"
SRC_URI+=" https://www.kernel.org/pub/linux/kernel/v${LINUX_V}/${LINUX_SOURCES}"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="*"
IUSE="audit clang coresight crypt debug +demangle +doc gtk java lzma numa perl python slang systemtap unwind zlib"
# TODO babeltrace
REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
RDEPEND="audit? ( sys-process/audit )
crypt? ( dev-libs/openssl:0= )
clang? (
sys-devel/clang:*
sys-devel/llvm:*
)
coresight? ( dev-libs/opencsd )
gtk? ( x11-libs/gtk+:2 )
java? ( virtual/jre:* )
lzma? ( app-arch/xz-utils )
numa? ( sys-process/numactl )
perl? ( dev-lang/perl:= )
python? ( ${PYTHON_DEPS} )
slang? ( sys-libs/slang )
systemtap? ( dev-util/systemtap )
unwind? ( sys-libs/llvm-libunwind )
zlib? ( sys-libs/zlib )
dev-libs/elfutils
sys-libs/binutils-libs:="
DEPEND="${RDEPEND}
>=sys-kernel/linux-headers-4.4"
BDEPEND="
${LINUX_PATCH+dev-util/patchutils}
sys-devel/bison
sys-devel/flex
java? ( virtual/jdk )
doc? (
app-text/asciidoc
app-text/sgml-common
app-text/xmlto
sys-process/time
)"
S_K="${WORKDIR}/linux-${LINUX_VER}"
S="${S_K}/tools/perf"
CONFIG_CHECK="~PERF_EVENTS ~KALLSYMS"
PATCHES=(
"${FILESDIR}/5.3.7-Fix-hugepage-text.patch"
"${FILESDIR}/5.3.7-Don-t-install-self-tests.patch"
"${FILESDIR}/5.3.7-Fix-exit-on-signal.patch"
"${FILESDIR}/5.3.7-Fix-libbfd-api.patch"
"${FILESDIR}/5.3.7-Fix-configure-tests.patch"
"${FILESDIR}/5.3.7-Update-perf-bench.patch"
"${FILESDIR}/5.3.7-Fix-perf-bench.patch"
"${FILESDIR}/5.3.7-Fix-nm-binutils-2.35.patch"
"${FILESDIR}/5.3.7-cs-etm-Swap-packets.patch"
"${FILESDIR}/5.3.7-cs-etm-Continuously-record-last-branch.patch"
"${FILESDIR}/5.3.7-cs-etm-Correct-synth-inst-samples.patch"
"${FILESDIR}/5.3.7-cs-etm-Optimize-copying-last-branches.patch"
"${FILESDIR}/5.3.7-cs-etm-Fix-unsigned-variable.patch"
"${FILESDIR}/5.3.7-Consolidate-symbol-fixup-issue.patch"
"${FILESDIR}/5.3.7-Correct-event-attribute-sizes.patch"
"${FILESDIR}/5.3.7-Fix-file-corruption-due-to-event-deletion.patch"
"${FILESDIR}/5.3.7-Allow-no-CoreSight-sink.patch"
"${FILESDIR}/5.3.7-EL2-fix-1-Update-ETM-metadata-format.patch"
"${FILESDIR}/5.3.7-EL2-fix-2-Update-linux-coresight-pmu-h.patch"
"${FILESDIR}/5.3.7-EL2-fix-3-Fix-bitmap-for-option.patch"
"${FILESDIR}/5.3.7-EL2-fix-4-Support-PID-tracing-in-config.patch"
"${FILESDIR}/5.3.7-EL2-fix-5-Add-cs-etm-helper.patch"
"${FILESDIR}/5.3.7-EL2-fix-6-Detect-pid-in-VMID.patch"
)
pkg_setup() {
linux-info_pkg_setup
use python && python-single-r1_pkg_setup
}
src_unpack() {
local paths=(
tools/arch tools/build tools/include tools/lib tools/perf tools/scripts
include lib "arch/*/lib"
)
local p1=(${paths[@]/%/*})
# We expect the tar implementation to support the -j option (both
# GNU tar and libarchive's tar support that).
echo ">>> Unpacking ${LINUX_SOURCES} (${paths[*]}) to ${PWD}"
tar --wildcards -xpf "${DISTDIR}"/${LINUX_SOURCES} \
"${paths[@]/#/linux-${LINUX_VER}/}" || die
if [[ -n ${LINUX_PATCH} ]] ; then
eshopts_push -o noglob
ebegin "Filtering partial source patch"
xz -d -c "${DISTDIR}"/${LINUX_PATCH} | filterdiff -p1 ${p1[@]/#/-i } \
> ${P}.patch
eend $? || die "filterdiff failed"
eshopts_pop
fi
local a
for a in ${A}; do
[[ ${a} == ${LINUX_SOURCES} ]] && continue
[[ ${a} == ${LINUX_PATCH} ]] && continue
unpack ${a}
done
# support clang8
echo $(clang-major-version)
if use clang; then
local old_CC=${CC}
CC=${CHOST}-clang
if [[ $(clang-major-version) -ge 8 ]]; then
pushd "${S_K}" >/dev/null || die
eapply "${FILESDIR}/perf-5.1.15-fix-clang8.patch"
popd || die
fi
CC=${old_CC}
fi
}
src_prepare() {
pushd "${S_K}" >/dev/null || die
if [[ -n ${LINUX_PATCH} ]] ; then
eapply "${WORKDIR}"/${P}.patch
fi
eapply ${PATCHES[@]}
popd || die
eapply_user
# Drop some upstream too-developer-oriented flags and fix the
# Makefile in general
sed -i \
-e 's:-Werror::' \
-e "s:\$(sysconfdir_SQ)/bash_completion.d:$(get_bashcompdir):" \
"${S}"/Makefile.perf || die
# A few places still use -Werror w/out $(WERROR) protection.
sed -i -e 's:-Werror::' \
"${S}"/Makefile.perf "${S_K}"/tools/lib/bpf/Makefile || die
# Avoid the call to make kernelversion
echo "#define PERF_VERSION \"${MY_PV}\"" > PERF-VERSION-FILE
# The code likes to compile local assembly files which lack ELF markings.
find -name '*.S' -exec sed -i '$a.section .note.GNU-stack,"",%progbits' {} +
}
puse() { usex $1 "" no; }
perf_make() {
# The arch parsing is a bit funky. The perf tools package is integrated
# into the kernel, so it wants an ARCH that looks like the kernel arch,
# but it also wants to know about the split value -- i386/x86_64 vs just
# x86. We can get that by telling the func to use an older linux version.
# It's kind of a hack, but not that bad ...
# LIBDIR sets a search path of perf-gtk.so. Bug 515954
local arch=$(tc-arch-kernel)
local java_dir
use java && java_dir="/etc/java-config-2/current-system-vm"
use coresight && append-ldflags "-lc++" # opencsd requires linking with C++ libraries.
MAKEOPTS="${MAKEOPTS} -j1" # crbug.com/1173859
# FIXME: NO_LIBBABELTRACE
emake V=1 VF=1 \
CC="$(tc-getCC)" CXX="$(tc-getCXX)" AR="$(tc-getAR)" LD="$(tc-getLD)" \
HOSTCC="$(tc-getBUILD_CC)" \
PKG_CONFIG="$(tc-getPKG_CONFIG)" \
prefix="${EPREFIX}/usr" bindir_relative="bin" \
EXTRA_CFLAGS="${CFLAGS}" \
ARCH="${arch}" \
CORESIGHT=$(usex coresight 1 "") \
JDIR="${java_dir}" \
LIBCLANGLLVM=$(usex clang 1 "") \
NO_AUXTRACE="" \
NO_BACKTRACE="" \
NO_DEMANGLE=$(puse demangle) \
NO_GTK2=$(puse gtk) \
NO_JVMTI=$(puse java) \
NO_LIBAUDIT=$(puse audit) \
NO_LIBBABELTRACE=1 \
NO_LIBBIONIC=1 \
NO_LIBBPF="" \
NO_LIBCRYPTO=$(puse crypt) \
NO_LIBDW_DWARF_UNWIND="" \
NO_LIBELF="" \
NO_LIBNUMA=$(puse numa) \
NO_LIBPERL=$(puse perl) \
NO_LIBPYTHON=$(puse python) \
NO_LIBUNWIND=$(puse unwind) \
NO_SDT=$(puse systemtap) \
NO_SLANG=$(puse slang) \
NO_LZMA=$(puse lzma) \
NO_ZLIB= \
WERROR=0 \
XMLTO="$(usex doc xmlto '')" \
LIBDIR="/usr/libexec/perf-core" \
"$@"
}
src_compile() {
# test-clang.bin not build with g++
if use clang; then
pushd "${S_K}/tools/build/feature/" || die
make V=1 CXX=${CHOST}-clang++ test-clang.bin || die
popd
fi
perf_make -f Makefile.perf
use doc && perf_make -C Documentation
}
src_test() {
:
}
src_install() {
perf_make -f Makefile.perf install DESTDIR="${D}"
rm -rv "${ED}"/usr/share/doc/perf-tip || die
if use gtk; then
mv "${ED}"/usr/$(get_libdir)/libperf-gtk.so \
"${ED}"/usr/libexec/perf-core || die
fi
dodoc CREDITS
dodoc *txt Documentation/*.txt
if use doc ; then
docinto html
dodoc Documentation/*.html
doman Documentation/*.1
fi
}
pkg_postinst() {
if ! use doc ; then
einfo "Without the doc USE flag you won't get any documentation nor man pages."
einfo "And without man pages, you won't get any --help output for perf and its"
einfo "sub-tools."
fi
}