[PATCH v1 14/49] perf build: Make pylint build test opt-out (NO_PYLINT=1)
From: Ian Rogers
Date: Sun Sep 20 2026 - 01:24:04 EST
Commit 8a54784e708b ("perf build: Add pylint build tests") added a
compile-time pylint check for Python files in tools/perf, but left it
opt-in via PYLINT=1.
Now that pylint issues across tools/perf/python, tools/perf/pmu-events,
and tools/perf/tests/shell/lib have been cleaned up, enable the pylint
check by default when pylint is installed on the system, with an opt-out
via NO_PYLINT=1 (matching other perf build feature flags).
Configure PYTHONPATH in Makefile.perf so pylint resolves perf.pyi type
stubs and pmu-events modules, enable error and warning categories
(--disable=all --enable=E,W --disable=W0123,W0311,W0511,W0603,W0622,W0718)
appropriate for perf's standalone CLI and test scripts, and require
pylint >= 2.16.0 (skipping with a warning if an older version is
installed).
Assisted-by: Antigravity:gemini-3.1-pro
Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
---
tools/perf/Build | 2 +-
tools/perf/Makefile.perf | 39 +++++++++++++++++++++++++++++++++----
tools/perf/pmu-events/Build | 2 +-
tools/perf/tests/Build | 2 +-
tools/perf/util/Build | 2 +-
5 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/tools/perf/Build b/tools/perf/Build
index 37d603faea6d..5bd0e58d7cb0 100644
--- a/tools/perf/Build
+++ b/tools/perf/Build
@@ -101,6 +101,6 @@ endif
$(OUTPUT)%.pylint_log: %
$(call rule_mkdir)
- $(Q)$(call echo-cmd,test)pylint "$<" > $@ || (cat $@ && rm $@ && false)
+ $(Q)$(call echo-cmd,test)$(PYLINT) "$<" > $@ || (cat $@ && rm $@ && false)
perf-y += $(PYLINT_TEST_LOGS)
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index f22eda3d2852..3e193d609988 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -131,6 +131,8 @@ include ../scripts/utilities.mak
# Define NO_SHELLCHECK if you do not want to run shellcheck during build
#
# Define NO_MYPY if you do not want to run mypy during build
+#
+# Define NO_PYLINT if you do not want to run pylint during build
# As per kernel Makefile, avoid funny character set dependencies
unexport LC_ALL
@@ -280,9 +282,38 @@ ifneq ($(MYPY),)
override MYPY := MYPYPATH=$(srctree)/tools/perf/python $(MYPY)
endif
-# Runs pylint on perf python files
-ifeq ($(PYLINT),1)
- PYLINT := $(shell which pylint 2> /dev/null)
+# Runs pylint on perf python files.
+# Require pylint >= 2.16.0 (which introduced W0718 broad-exception-caught and
+# astroid .pyi stub support for perf.pyi).
+# Disabled warnings:
+# W0123 (eval-used): Use of eval()
+# W0311 (bad-indentation): Non-4-space indentation
+# W0511 (fixme): Presence of FIXME/TODO comments
+# W0603 (global-statement): Use of the global statement
+# W0622 (redefined-builtin): Redefining a built-in name (e.g. id, type, dir)
+# W0718 (broad-exception-caught): Catching broad Exception
+MAKEOVERRIDES := $(filter-out PYLINT=%,$(MAKEOVERRIDES))
+ifeq ($(NO_PYLINT),1)
+ override PYLINT :=
+else
+ ifeq ($(PYLINT),1)
+ override PYLINT := $(shell which pylint 2> /dev/null)
+ else
+ PYLINT ?= $(shell which pylint 2> /dev/null)
+ endif
+endif
+
+ifneq ($(PYLINT),)
+ ifneq ($(force_fixdep),1)
+ ifneq ($(shell $(PYLINT) --version 2>/dev/null | \
+ awk '/^pylint / { split($$2, v, "."); print (v[1]+0 > 2 || (v[1]+0 == 2 && v[2]+0 >= 16)) }'), 1)
+ $(warning Warning: pylint version is older than 2.16.0, skipping pylint checks.)
+ override PYLINT :=
+ else
+ override PYLINT := PYTHONPATH=$(srctree)/tools/perf/python:$(srctree)/tools/perf/pmu-events \
+ $(PYLINT) --disable=all --enable=E,W --disable=W0123,W0311,W0511,W0603,W0622,W0718
+ endif
+ endif
endif
export srctree OUTPUT RM CC CXX RUSTC CLANG LD AR CFLAGS CXXFLAGS RUST_FLAGS V BISON FLEX AWK LIBBPF READELF
@@ -962,7 +993,7 @@ clean:: $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBSYMBOL)-clean $(
$(OUTPUT)perf-iostat $(LANG_BINDINGS)
$(Q)find $(or $(OUTPUT),.) -name '*.o' -delete -o -name '*.a' -delete -o \
-name '\.*.cmd' -delete -o -name '\.*.d' -delete -o -name '*.shellcheck_log' -delete -o \
- -name '*.mypy_log' -delete
+ -name '*.mypy_log' -delete -o -name '*.pylint_log' -delete
$(Q)$(RM) $(OUTPUT).config-detected
$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 \
perf-read-vdsox32 $(OUTPUT)$(LIBJVMTI).so
diff --git a/tools/perf/pmu-events/Build b/tools/perf/pmu-events/Build
index c3542e5ae46f..1ac067be9d34 100644
--- a/tools/perf/pmu-events/Build
+++ b/tools/perf/pmu-events/Build
@@ -203,7 +203,7 @@ endif
ifdef PYLINT
define PYLINT_RULE
$(2): $(1)
- $$(Q)$$(call echo-cmd,test)pylint $(1) > $(2) || (cat $(2) && rm $(2) && false)
+ $$(Q)$$(call echo-cmd,test)$$(PYLINT) $(1) > $(2) || (cat $(2) && rm $(2) && false)
endef
$(foreach src,$(wildcard pmu-events/*.py), \
$(eval dest := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.pylint_log,$(src))) \
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 98b05b68fc14..f88e9a55c4f5 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -117,6 +117,6 @@ endif
$(OUTPUT)%.pylint_log: %
$(call rule_mkdir)
- $(Q)$(call echo-cmd,test)pylint "$<" > $@ || (cat $@ && rm $@ && false)
+ $(Q)$(call echo-cmd,test)$(PYLINT) "$<" > $@ || (cat $@ && rm $@ && false)
perf-test-y += $(PYLINT_TEST_LOGS)
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 71d1f7289d03..3ea888f4210a 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -438,7 +438,7 @@ endif
$(OUTPUT)%.pylint_log: %
$(call rule_mkdir)
- $(Q)$(call echo-cmd,test)pylint "$<" > $@ || (cat $@ && rm $@ && false)
+ $(Q)$(call echo-cmd,test)$(PYLINT) "$<" > $@ || (cat $@ && rm $@ && false)
perf-util-y += $(PYLINT_TEST_LOGS)
--
2.55.0.1082.g2b9226bbc0-goog