dev-debug/hotspot: new package, add 1.5.1_p20250907, 9999

Take a snapshot as upstream releases seem infrequent and we'd have
to backport a few patches if using the last release, and I already did
the dep work for master.

Based on the ebuild from ::kdab-overlay [0].

[0] 640bf73ef2/dev-util/hotspot/hotspot-1.5.1.ebuild

Closes: https://bugs.gentoo.org/624062
Signed-off-by: Sam James <sam@gentoo.org>
This commit is contained in:
Sam James 2025-12-06 11:13:15 +00:00
parent 78593c921f
commit 221a09ef37
No known key found for this signature in database
GPG Key ID: 738409F520DF9190
5 changed files with 499 additions and 0 deletions

View File

@ -0,0 +1,3 @@
DIST PrefixTickLabels-7cd6d5a04cf3747cc9327efdbcbf43620efaa0c1.gh.tar.gz 21553 BLAKE2B c804b6a573db0015fea032c4e1497d19e70a6d1fac85e980a8a9467bb773b583be0e4ffcc92802083760c56541fc17f3f5ed698f34913e49451a064768a4ad7f SHA512 d0f9d5f1e4b597f55d612bdcb9c870f0a490a5c66cb72e10bb1e73278be3f33bfb0a9c4ba0f4dfd3973f030814b594f9225f9d49a190de176961aa7677287d6f
DIST hotspot-b61451d827dd23e35c5f611e3626226a119dfa48.gh.tar.gz 4103942 BLAKE2B 0ccdc66f1bde032c981d49807a659589ac51023f747afc462a75c27594cc806e67b3ec9525e0236da568c1ecf8f1d4fefcbd539ed5577f9a23850b20a478671b SHA512 e77111fe9213b24aca6070eb21ea1e608dd30472bf72d6433a5e72f2d8e17926bee169aa70820776dbcb966e610fef43f0091db98443e929a2fb1437956f7300
DIST perfparser-65472541f74da213583535c8bb4fea831e875109.gh.tar.gz 3312538 BLAKE2B d2443e60c93047d7f5714d56ed24e5d3f94ace7cef152a6ea70539f8c0e0eb720297635da122715cd07f7efacbed9010951d368f1fc94142a5ebd130ea39377e SHA512 7ee0ec21dfdc201618921d1878c19c32cafecb268ecf45b513048730d8c34202fd28b531ec938ef13666d7b5dd83b75b68f33a607a6e016fcd8759af980bb223

View File

@ -0,0 +1,234 @@
--- a/src/models/disassemblymodel.cpp
+++ b/src/models/disassemblymodel.cpp
@@ -240,7 +240,7 @@ QModelIndex DisassemblyModel::indexForFileLine(const Data::FileLine& fileLine) c
return index(bestMatch, 0);
}
-void DisassemblyModel::find(const QString& search, Direction direction, int current)
+void DisassemblyModel::find(const QString& search, SearchDirection direction, int current)
{
auto searchFunc = [&search](const DisassemblyOutput::DisassemblyLine& line) {
return line.disassembly.indexOf(search, 0, Qt::CaseInsensitive) != -1;
--- a/src/models/disassemblymodel.h
+++ b/src/models/disassemblymodel.h
@@ -20,7 +20,7 @@ class Definition;
class Repository;
}
-enum class Direction;
+enum class SearchDirection;
class DisassemblyModel : public QAbstractTableModel
{
@@ -76,7 +76,7 @@ signals:
public slots:
void updateHighlighting(int line);
- void find(const QString& search, Direction direction, int offset);
+ void find(const QString& search, SearchDirection direction, int offset);
void scrollToLine(const QString& lineNumber);
private:
--- a/src/models/search.h
+++ b/src/models/search.h
@@ -10,7 +10,7 @@
#include <algorithm>
#include <iterator>
-enum class Direction
+enum class SearchDirection
{
Forward,
Backward
@@ -45,7 +45,7 @@ int search_helper(const it begin, const it end, const it current, SearchFunc sea
}
template<typename it, typename SearchFunc, typename EndReached>
-int search(const it begin, const it end, int current, Direction direction, SearchFunc searchFunc, EndReached endReached)
+int search(const it begin, const it end, int current, SearchDirection direction, SearchFunc searchFunc, EndReached endReached)
{
if (begin == end)
return -1;
@@ -54,7 +54,7 @@ int search(const it begin, const it end, int current, Direction direction, Searc
current = std::clamp(current, 0, static_cast<int>(size) - 1);
const auto currentIt = begin + current;
- if (direction == Direction::Forward) {
+ if (direction == SearchDirection::Forward) {
return search_helper(begin, end, std::next(currentIt), searchFunc, endReached);
}
--- a/src/models/sourcecodemodel.cpp
+++ b/src/models/sourcecodemodel.cpp
@@ -258,7 +258,7 @@ void SourceCodeModel::setSysroot(const QString& sysroot)
m_sysroot = sysroot;
}
-void SourceCodeModel::find(const QString& search, Direction direction, int current)
+void SourceCodeModel::find(const QString& search, SearchDirection direction, int current)
{
auto searchFunc = [&search](const QString& line) { return line.indexOf(search, 0, Qt::CaseInsensitive) != -1; };
--- a/src/models/sourcecodemodel.h
+++ b/src/models/sourcecodemodel.h
@@ -20,7 +20,7 @@ class Repository;
class Definition;
}
-enum class Direction;
+enum class SearchDirection;
Q_DECLARE_METATYPE(QTextLine)
@@ -73,7 +73,7 @@ public slots:
void updateHighlighting(int line);
void setSysroot(const QString& sysroot);
- void find(const QString& search, Direction direction, int current);
+ void find(const QString& search, SearchDirection direction, int current);
void scrollToLine(const QString& lineNumber);
private:
--- a/src/resultsdisassemblypage.cpp
+++ b/src/resultsdisassemblypage.cpp
@@ -407,12 +407,12 @@ ResultsDisassemblyPage::ResultsDisassemblyPage(CostContextMenu* costContextMenu,
auto searchNext = [model, edit, additionalRows, searchResultIndex] {
const auto offset = searchResultIndex->isValid() ? searchResultIndex->row() - additionalRows : 0;
- model->find(edit->text(), Direction::Forward, offset);
+ model->find(edit->text(), SearchDirection::Forward, offset);
};
auto searchPrev = [model, edit, additionalRows, searchResultIndex] {
const auto offset = searchResultIndex->isValid() ? searchResultIndex->row() - additionalRows : 0;
- model->find(edit->text(), Direction::Backward, offset);
+ model->find(edit->text(), SearchDirection::Backward, offset);
};
auto findNextAction = KStandardAction::findNext(this, searchNext, actions);
--- a/tests/modeltests/tst_models.cpp
+++ b/tests/modeltests/tst_models.cpp
@@ -514,7 +514,7 @@ private slots:
// check if search works in general
QSignalSpy searchSpy(&model, &SourceCodeModel::resultFound);
for (int i = 0; i < 5; i++) {
- model.find(QStringLiteral("Line 5"), Direction::Forward, i);
+ model.find(QStringLiteral("Line 5"), SearchDirection::Forward, i);
auto result = searchSpy.takeFirst();
QCOMPARE(result.at(0).value<QModelIndex>(), model.index(3, SourceCodeModel::SourceCodeColumn));
}
@@ -522,21 +522,21 @@ private slots:
// Check wrap around
for (int i = 1; i < 4; i++) {
QSignalSpy endReached(&model, &SourceCodeModel::searchEndReached);
- model.find(QStringLiteral("Line 3"), Direction::Forward, i);
+ model.find(QStringLiteral("Line 3"), SearchDirection::Forward, i);
QCOMPARE(endReached.size(), 1);
}
// check if no result found works
searchSpy.clear();
for (int i = 0; i < 5; i++) {
- model.find(QStringLiteral("Line 8"), Direction::Forward, i);
+ model.find(QStringLiteral("Line 8"), SearchDirection::Forward, i);
auto result = searchSpy.takeFirst();
QCOMPARE(result.at(0).value<QModelIndex>().isValid(), false);
}
// test backward search
for (int i = 4; i > 0; i--) {
- model.find(QStringLiteral("Line 7"), Direction::Backward, i);
+ model.find(QStringLiteral("Line 7"), SearchDirection::Backward, i);
auto result = searchSpy.takeFirst();
QCOMPARE(result.at(0).value<QModelIndex>(), model.index(5, SourceCodeModel::SourceCodeColumn));
}
@@ -544,14 +544,14 @@ private slots:
// Check wrap around
for (int i = 4; i > 0; i--) {
QSignalSpy endReached(&model, &SourceCodeModel::searchEndReached);
- model.find(QStringLiteral("Line 7"), Direction::Backward, i);
+ model.find(QStringLiteral("Line 7"), SearchDirection::Backward, i);
QCOMPARE(endReached.size(), 1);
}
// check if no result found works
searchSpy.clear();
for (int i = 0; i < 5; i++) {
- model.find(QStringLiteral("Line 8"), Direction::Backward, i);
+ model.find(QStringLiteral("Line 8"), SearchDirection::Backward, i);
auto result = searchSpy.takeFirst();
QCOMPARE(result.at(0).value<QModelIndex>().isValid(), false);
}
--- a/tests/modeltests/tst_search.cpp
+++ b/tests/modeltests/tst_search.cpp
@@ -24,9 +24,9 @@ private slots:
const std::array<int, 0> testArray = {};
QCOMPARE(
- search(testArray.cbegin(), testArray.cend(), 0, Direction::Forward, [](int) { return false; }, [] {}), -1);
+ search(testArray.cbegin(), testArray.cend(), 0, SearchDirection::Forward, [](int) { return false; }, [] {}), -1);
QCOMPARE(
- search(testArray.cbegin(), testArray.cend(), 0, Direction::Backward, [](int) { return false; }, [] {}), -1);
+ search(testArray.cbegin(), testArray.cend(), 0, SearchDirection::Backward, [](int) { return false; }, [] {}), -1);
}
void testSearch()
{
@@ -35,11 +35,11 @@ private slots:
int maxOffset = testArray.size() - 1;
for (int offset = 0; offset < maxOffset; offset++) {
QCOMPARE(search(
- testArray.cbegin(), testArray.cend(), offset, Direction::Forward,
+ testArray.cbegin(), testArray.cend(), offset, SearchDirection::Forward,
[](int num) { return num == 2; }, [] {}),
1);
QCOMPARE(search(
- testArray.cbegin(), testArray.cend(), offset, Direction::Backward,
+ testArray.cbegin(), testArray.cend(), offset, SearchDirection::Backward,
[](int num) { return num == 2; }, [] {}),
1);
}
@@ -51,7 +51,7 @@ private slots:
{
bool endReached = false;
QCOMPARE(search(
- testArray.cbegin(), testArray.cend(), 1, Direction::Forward, [](int i) { return i == 1; },
+ testArray.cbegin(), testArray.cend(), 1, SearchDirection::Forward, [](int i) { return i == 1; },
[&endReached] { endReached = true; }),
0);
QCOMPARE(endReached, true);
@@ -60,7 +60,7 @@ private slots:
{
bool endReached = false;
QCOMPARE(search(
- testArray.cbegin(), testArray.cend(), 1, Direction::Backward, [](int i) { return i == 4; },
+ testArray.cbegin(), testArray.cend(), 1, SearchDirection::Backward, [](int i) { return i == 4; },
[&endReached] { endReached = true; }),
3);
QCOMPARE(endReached, true);
@@ -73,7 +73,7 @@ private slots:
for (int i = 0; i < 2; i++) {
QCOMPARE(search(
- testArray.cbegin(), testArray.cend(), 0, Direction::Forward, [](int) { return true; }, [] {}),
+ testArray.cbegin(), testArray.cend(), 0, SearchDirection::Forward, [](int) { return true; }, [] {}),
-1);
}
}
@@ -83,7 +83,7 @@ private slots:
const std::array<int, 1> testArray = {0};
QCOMPARE(search(
- testArray.cbegin(), testArray.cend(), 1, Direction::Forward, [](int i) { return i == 0; }, [] {}),
+ testArray.cbegin(), testArray.cend(), 1, SearchDirection::Forward, [](int i) { return i == 0; }, [] {}),
0);
}
@@ -93,7 +93,7 @@ private slots:
for (std::size_t i = 0; i < testArray.size(); i++) {
QCOMPARE(search(
- testArray.cbegin() + 1, testArray.cbegin() + 3, i, Direction::Forward,
+ testArray.cbegin() + 1, testArray.cbegin() + 3, i, SearchDirection::Forward,
[](int i) { return i == 0; }, [] {}),
-1);
}

View File

@ -0,0 +1,124 @@
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
QTMIN=6.8.1
KFMIN=6.18.0
inherit ecm xdg
DESCRIPTION="Linux perf GUI for performance analysis"
HOMEPAGE="https://github.com/KDAB/hotspot"
if [[ ${PV} == 9999 ]] ; then
EGIT_REPO_URI="https://github.com/KDAB/hotspot"
inherit git-r3
elif [[ ${PV} == *_p* ]] ; then
HOTSPOT_COMMIT="b61451d827dd23e35c5f611e3626226a119dfa48"
PERFPARSER_COMMIT="65472541f74da213583535c8bb4fea831e875109"
PREFIXTICKLABELS_COMMIT="7cd6d5a04cf3747cc9327efdbcbf43620efaa0c1"
SRC_URI="
https://github.com/KDAB/hotspot/archive/${HOTSPOT_COMMIT}.tar.gz -> ${PN}-${HOTSPOT_COMMIT}.gh.tar.gz
https://github.com/KDAB/perfparser/archive/${PERFPARSER_COMMIT}.tar.gz -> perfparser-${PERFPARSER_COMMIT}.gh.tar.gz
https://github.com/koenpoppe/PrefixTickLabels/archive/${PREFIXTICKLABELS_COMMIT}.tar.gz -> PrefixTickLabels-${PREFIXTICKLABELS_COMMIT}.gh.tar.gz
"
S="${WORKDIR}"/${PN}-${HOTSPOT_COMMIT}
else
SRC_URI="
https://github.com/KDAB/hotspot/releases/download/v${PV}/${PN}-v${PV}.tar.gz
https://github.com/KDAB/hotspot/releases/download/v${PV}/${PN}-perfparser-v${PV}.tar.gz -> ${PN}-v${PV}-perfparser.tar.gz
https://github.com/KDAB/hotspot/releases/download/v${PV}/${PN}-PrefixTickLabels-v${PV}.tar.gz -> ${PN}-v${PV}-PrefixTickLabels.tar.gz
"
S="${WORKDIR}"/${PN}
fi
# hotspot itself is GPL-2 or GPL-3
# bundled perfparser is GPL-3
# bundled PrefixTickLabels is GPL-3
LICENSE="|| ( GPL-2 GPL-3 ) GPL-3"
SLOT="0"
IUSE="debuginfod"
if [[ ${PV} != 9999 ]] ; then
KEYWORDS="~amd64"
fi
DEPEND="
app-arch/zstd:=
dev-libs/elfutils[debuginfod?]
dev-libs/qcustomplot
>=dev-qt/qtbase-${QTMIN}:6=[network,widgets]
>=dev-qt/qtsvg-${QTMIN}:6
gui-libs/kddockwidgets:=
>=kde-frameworks/karchive-${KFMIN}:6
>=kde-frameworks/kconfigwidgets-${KFMIN}:6
>=kde-frameworks/kcoreaddons-${KFMIN}:6
>=kde-frameworks/ki18n-${KFMIN}:6
>=kde-frameworks/kiconthemes-${KFMIN}:6
>=kde-frameworks/kio-${KFMIN}:6
>=kde-frameworks/kitemviews-${KFMIN}:6
>=kde-frameworks/kitemmodels-${KFMIN}:6
>=kde-frameworks/knotifications-${KFMIN}:6
>=kde-frameworks/kparts-${KFMIN}:6
>=kde-frameworks/kwindowsystem-${KFMIN}:6
>=kde-frameworks/solid-${KFMIN}:6
>=kde-frameworks/syntax-highlighting-${KFMIN}:6
>=kde-frameworks/threadweaver-${KFMIN}:6
media-gfx/kgraphviewer
sys-devel/gettext
"
RDEPEND="
${DEPEND}
dev-util/perf
sys-devel/binutils:*
"
PATCHES=(
"${FILESDIR}"/${PN}-odr.patch
)
src_unpack() {
if [[ ${PV} == 9999 ]] ; then
git-r3_src_unpack
elif [[ ${PV} == *_p* ]] ; then
unpack ${PN}-${HOTSPOT_COMMIT}.gh.tar.gz
tar -xf "${DISTDIR}"/perfparser-${PERFPARSER_COMMIT}.gh.tar.gz --strip-components=1 -C "${S}"/3rdparty/perfparser || die
tar -xf "${DISTDIR}"/PrefixTickLabels-${PREFIXTICKLABELS_COMMIT}.gh.tar.gz --strip-components=1 -C "${S}"/3rdparty/PrefixTickLabels || die
else
unpack ${PN}-v${PV}.tar.gz
tar -xf "${DISTDIR}"/${PN}-v${PV}-perfparser.tar.gz --strip-components=1 -C "${S}"/3rdparty/perfparser || die
tar -xf "${DISTDIR}"/${PN}-v${PV}-PrefixTickLabels.tar.gz --strip-components=1 -C "${S}"/3rdparty/PrefixTickLabels || die
fi
}
src_prepare() {
if ! use debuginfod ; then
sed -i \
'/target_link_libraries(libhotspot-perfparser PRIVATE ${LIBDEBUGINFOD_LIBRARIES})/d' \
3rdparty/perfparser.cmake || die "sed failed for perfparser"
sed -i \
'/target_compile_definitions(libhotspot-perfparser PRIVATE HAVE_DWFL_GET_DEBUGINFOD_CLIENT=1)/d' \
3rdparty/perfparser.cmake || die "sed failed for perfparser"
fi
ecm_src_prepare
}
src_configure() {
local mycmakeargs=(
-DQT6_BUILD=true
)
ecm_src_configure
}
src_test() {
CMAKE_SKIP_TESTS=(
# Complains about {d,rustc}_demangle missing, but may fail
# for other reasons too.
tst_perfparser
)
ecm_src_test
}

View File

@ -0,0 +1,124 @@
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
QTMIN=6.8.1
KFMIN=6.18.0
inherit ecm xdg
DESCRIPTION="Linux perf GUI for performance analysis"
HOMEPAGE="https://github.com/KDAB/hotspot"
if [[ ${PV} == 9999 ]] ; then
EGIT_REPO_URI="https://github.com/KDAB/hotspot"
inherit git-r3
elif [[ ${PV} == *_p* ]] ; then
HOTSPOT_COMMIT="b61451d827dd23e35c5f611e3626226a119dfa48"
PERFPARSER_COMMIT="65472541f74da213583535c8bb4fea831e875109"
PREFIXTICKLABELS_COMMIT="7cd6d5a04cf3747cc9327efdbcbf43620efaa0c1"
SRC_URI="
https://github.com/KDAB/hotspot/archive/${HOTSPOT_COMMIT}.tar.gz -> ${PN}-${HOTSPOT_COMMIT}.gh.tar.gz
https://github.com/KDAB/perfparser/archive/${PERFPARSER_COMMIT}.tar.gz -> perfparser-${PERFPARSER_COMMIT}.gh.tar.gz
https://github.com/koenpoppe/PrefixTickLabels/archive/${PREFIXTICKLABELS_COMMIT}.tar.gz -> PrefixTickLabels-${PREFIXTICKLABELS_COMMIT}.gh.tar.gz
"
S="${WORKDIR}"/${PN}-${HOTSPOT_COMMIT}
else
SRC_URI="
https://github.com/KDAB/hotspot/releases/download/v${PV}/${PN}-v${PV}.tar.gz
https://github.com/KDAB/hotspot/releases/download/v${PV}/${PN}-perfparser-v${PV}.tar.gz -> ${PN}-v${PV}-perfparser.tar.gz
https://github.com/KDAB/hotspot/releases/download/v${PV}/${PN}-PrefixTickLabels-v${PV}.tar.gz -> ${PN}-v${PV}-PrefixTickLabels.tar.gz
"
S="${WORKDIR}"/${PN}
fi
# hotspot itself is GPL-2 or GPL-3
# bundled perfparser is GPL-3
# bundled PrefixTickLabels is GPL-3
LICENSE="|| ( GPL-2 GPL-3 ) GPL-3"
SLOT="0"
IUSE="debuginfod"
if [[ ${PV} != 9999 ]] ; then
KEYWORDS="~amd64"
fi
DEPEND="
app-arch/zstd:=
dev-libs/elfutils[debuginfod?]
dev-libs/qcustomplot
>=dev-qt/qtbase-${QTMIN}:6=[network,widgets]
>=dev-qt/qtsvg-${QTMIN}:6
gui-libs/kddockwidgets:=
>=kde-frameworks/karchive-${KFMIN}:6
>=kde-frameworks/kconfigwidgets-${KFMIN}:6
>=kde-frameworks/kcoreaddons-${KFMIN}:6
>=kde-frameworks/ki18n-${KFMIN}:6
>=kde-frameworks/kiconthemes-${KFMIN}:6
>=kde-frameworks/kio-${KFMIN}:6
>=kde-frameworks/kitemviews-${KFMIN}:6
>=kde-frameworks/kitemmodels-${KFMIN}:6
>=kde-frameworks/knotifications-${KFMIN}:6
>=kde-frameworks/kparts-${KFMIN}:6
>=kde-frameworks/kwindowsystem-${KFMIN}:6
>=kde-frameworks/solid-${KFMIN}:6
>=kde-frameworks/syntax-highlighting-${KFMIN}:6
>=kde-frameworks/threadweaver-${KFMIN}:6
media-gfx/kgraphviewer
sys-devel/gettext
"
RDEPEND="
${DEPEND}
dev-util/perf
sys-devel/binutils:*
"
PATCHES=(
"${FILESDIR}"/${PN}-odr.patch
)
src_unpack() {
if [[ ${PV} == 9999 ]] ; then
git-r3_src_unpack
elif [[ ${PV} == *_p* ]] ; then
unpack ${PN}-${HOTSPOT_COMMIT}.gh.tar.gz
tar -xf "${DISTDIR}"/perfparser-${PERFPARSER_COMMIT}.gh.tar.gz --strip-components=1 -C "${S}"/3rdparty/perfparser || die
tar -xf "${DISTDIR}"/PrefixTickLabels-${PREFIXTICKLABELS_COMMIT}.gh.tar.gz --strip-components=1 -C "${S}"/3rdparty/PrefixTickLabels || die
else
unpack ${PN}-v${PV}.tar.gz
tar -xf "${DISTDIR}"/${PN}-v${PV}-perfparser.tar.gz --strip-components=1 -C "${S}"/3rdparty/perfparser || die
tar -xf "${DISTDIR}"/${PN}-v${PV}-PrefixTickLabels.tar.gz --strip-components=1 -C "${S}"/3rdparty/PrefixTickLabels || die
fi
}
src_prepare() {
if ! use debuginfod ; then
sed -i \
'/target_link_libraries(libhotspot-perfparser PRIVATE ${LIBDEBUGINFOD_LIBRARIES})/d' \
3rdparty/perfparser.cmake || die "sed failed for perfparser"
sed -i \
'/target_compile_definitions(libhotspot-perfparser PRIVATE HAVE_DWFL_GET_DEBUGINFOD_CLIENT=1)/d' \
3rdparty/perfparser.cmake || die "sed failed for perfparser"
fi
ecm_src_prepare
}
src_configure() {
local mycmakeargs=(
-DQT6_BUILD=true
)
ecm_src_configure
}
src_test() {
CMAKE_SKIP_TESTS=(
# Complains about {d,rustc}_demangle missing, but may fail
# for other reasons too.
tst_perfparser
)
ecm_src_test
}

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="person">
<email>sam@gentoo.org</email>
<name>Sam James</name>
</maintainer>
<use>
<flag name="debuginfod">Enable debuginfod support via <pkg>dev-libs/elfutils</pkg> libdebuginfod</flag>
</use>
<upstream>
<remote-id type="github">KDAB/hotspot</remote-id>
</upstream>
</pkgmetadata>