# TODO: reenable once we get a basic build working
# https://fedoraproject.org/wiki/Changes/SetBuildFlagsBuildCheck
# see build and install -- CXXFLAGS and LDFLAGS are enough
# still need to debug
#undefine _auto_set_build_flags
%bcond_without manpages
# requires missing header to be patched in
%bcond_without libbpf
%if 0%{?facebook}
%bcond_with perl
%else
%bcond_without perl
%endif
%global tag_version 6.12
Name: perf
Version: %{tag_version}.0
Release: %autorelease
Summary: Performance monitoring for the Linux kernel
License: GPL-2.0-only
URL: https://perf.wiki.kernel.org/
Source: https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/v%{version}/perf-%{version}.tar.xz
Source1: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/arch/arm64/include/uapi/asm/bpf_perf_event.h?h=v%{tag_version}#/bpf_perf_event_arm64.h
Source2: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/arch/s390/include/uapi/asm/bpf_perf_event.h?h=v%{tag_version}#/bpf_perf_event_s390.h
# No java-devel
# No point having a 32-bit perf anyway as even in Fedora the kernel is 64-bit
ExcludeArch: %{ix86}
BuildRequires: make
BuildRequires: bison
BuildRequires: flex
%if 0%{?facebook}
%if 0%{?el9}
# Temporarily pin to building against the older clang
# so this works against an older Stream snapshot
BuildRequires: clang = 18.1.8-3.el9
BuildRequires: llvm-devel = 18.1.8-3.el9
%endif
%else
BuildRequires: clang
BuildRequires: llvm-devel
%endif
BuildRequires: gcc
BuildRequires: binutils-devel
BuildRequires: capstone-devel
BuildRequires: elfutils-devel
BuildRequires: elfutils-libelf-devel
BuildRequires: java-devel
BuildRequires: libbabeltrace-devel
BuildRequires: libcap-devel
BuildRequires: libtraceevent-devel
BuildRequires: libunwind-devel
BuildRequires: libbabeltrace-devel
BuildRequires: libpfm-devel
BuildRequires: libstdc++-devel
BuildRequires: libunwind-devel
BuildRequires: numactl-devel
BuildRequires: python-devel
BuildRequires: python3dist(setuptools)
%ifarch aarch64
BuildRequires: opencsd-devel >= 1.0.0
%endif
BuildRequires: openssl-devel
%if %{with perl}
BuildRequires: perl-devel
BuildRequires: perl-interpreter
BuildRequires: perl-ExtUtils-Embed
%endif
BuildRequires: systemtap-sdt-devel
BuildRequires: slang-devel
BuildRequires: zlib-devel
%if %{with manpages}
BuildRequires: asciidoc
BuildRequires: xmlto
%endif
%description
This package contains the perf tool, which enables performance monitoring
of the Linux kernel.
%package -n libperf
Summary: The perf library from kernel source
%description -n libperf
This package contains the kernel source perf library.
%package -n libperf-devel
Summary: Development files for the perf library from kernel source
Requires: libperf%{?_isa} = %{version}-%{release}
%description -n libperf-devel
This package includes libraries and header files needed for development
of applications which use perf library from kernel source.
%package -n python3-perf
Summary: Python bindings for apps which will manipulate perf events
%description -n python3-perf
The python3-perf package contains a module that permits applications
written in the Python programming language to use the interface
to manipulate perf events.
# technically Makefile.config checks for lib64 but only for x86_64
# ifeq ($(SRCARCH)$(IS_64_BIT), x861)
%global perf_flags VF=1 prefix=%{_prefix} lib=%{_lib}
%ifarch aarch64
%global perf_flags %perf_flags CORESIGHT=1
%endif
%if %{without libbpf}
%global perf_flags %perf_flags NO_LIBBPF=1
%endif
%global perf_make %make_build %{perf_flags}
%global perf_make_install %make_install %{perf_flags}
%prep
%autosetup -p1
%if %{with libbpf}
# copy in missing files
UAPI_ASM_ARM_DIR=arch/arm64/include/uapi/asm
UAPI_ASM_S390_DIR=arch/s390/include/uapi/asm
mkdir -p $UAPI_ASM_ARM_DIR
mkdir -p $UAPI_ASM_S390_DIR
cp -p %{SOURCE1} $UAPI_ASM_ARM_DIR/bpf_perf_event.h
cp -p %{SOURCE2} $UAPI_ASM_S390_DIR/bpf_perf_event.h
%endif
%build
unset CXXFLAGS
unset LDFLAGS
# /usr/bin/ld: perf-in.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE object; recompile with -fPIE
#global optflags %{optflags} -fPIE
%perf_make -C tools/perf
%perf_make -C tools/lib/perf
%install
unset CXXFLAGS
unset LDFLAGS
%perf_make_install -C tools/perf
%perf_make_install -C tools/lib/perf
# python-perf extension
%perf_make_install install-python_ext -C tools/perf
# remove the 'trace' symlink.
rm %{buildroot}%{_bindir}/trace
rm -f %{buildroot}%{_libdir}/libperf.a
%if %{without perl}
rm %{buildroot}%{_libexecdir}/perf-core/tests/shell/common/*.pl
%endif
# TODO - make this customizable upstream
mkdir -p %{buildroot}%{bash_completions_dir}
mv %{buildroot}%{_sysconfdir}/bash_completion.d/perf %{buildroot}%{bash_completions_dir}/
rmdir %{buildroot}%{_sysconfdir}/bash_completion.d
rmdir %{buildroot}%{_sysconfdir}/
%files
# license add-license-file-here
%doc tools/perf/CREDITS
%{_bindir}/perf
%{_datadir}/perf-core
# tips.txt is both human readable and used by perf
# and really hard to override
%{_docdir}/perf-tip
%dir %{_includedir}/perf
%{_includedir}/perf/perf_dlfilter.h
%{_libdir}/libperf-jvmti.so
%{_libexecdir}/perf-core
%{bash_completions_dir}/perf
%if %{with manpages}
%{_mandir}/man1/perf*.1*
%endif
%files -n libperf
%{_libdir}/libperf.so.0
%{_libdir}/libperf.so.0.0.1
%files -n libperf-devel
%{_libdir}/libperf.so
%{_libdir}/pkgconfig/libperf.pc
%{_includedir}/internal/*.h
%{_includedir}/perf/bpf_perf.h
%{_includedir}/perf/core.h
%{_includedir}/perf/cpumap.h
%{_includedir}/perf/event.h
%{_includedir}/perf/evlist.h
%{_includedir}/perf/evsel.h
%{_includedir}/perf/mmap.h
%{_includedir}/perf/threadmap.h
%{_mandir}/man3/libperf.3.gz
%{_mandir}/man7/libperf-counting.7.gz
%{_mandir}/man7/libperf-sampling.7.gz
%{_docdir}/libperf/examples/sampling.c
%{_docdir}/libperf/examples/counting.c
%{_docdir}/libperf/html/libperf.html
%{_docdir}/libperf/html/libperf-counting.html
%{_docdir}/libperf/html/libperf-sampling.html
%files -n python3-perf
%{python3_sitearch}/*
%changelog
%autochangelog
-