perf build: Make pylint build test opt-out (NO_PYLINT=1)

Commit 8a54784e70 ("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 NO_SHELLCHECK=1, NO_MYPY=1, and 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
--ignored-modules=textual,setproctitle) 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@google.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Ian Rogers 2026-09-25 23:19:41 -07:00 committed by Arnaldo Carvalho de Melo
parent b3e9c396d0
commit 5fe83fb352
5 changed files with 40 additions and 8 deletions

View File

@ -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)

View File

@ -128,6 +128,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
@ -281,9 +283,39 @@ ifneq ($(force_fixdep),1)
endif
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
# Wait until after the fixdep bootstrap sub-make (force_fixdep != 1) before
# resolving PYLINT and stripping PYLINT=% from MAKEOVERRIDES (substituting
# escaped spaces so multi-word overrides are removed as a single token) so child
# Makefile.build sub-makes inherit the PYTHONPATH- and flag-wrapped export.
ifneq ($(force_fixdep),1)
MAKEOVERRIDES := $(subst __SPACE__,\ ,$(filter-out PYLINT=%,$(subst \ ,__SPACE__,$(MAKEOVERRIDES))))
ifeq ($(NO_PYLINT),1)
override PYLINT :=
else ifeq ($(filter-out 1,$(PYLINT)),)
override PYLINT := $(shell which pylint 2> /dev/null)
endif
ifneq ($(PYLINT),)
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 \
--ignored-modules=textual,setproctitle
endif
endif
endif
export srctree OUTPUT RM CC CXX RUSTC CLANG LD AR CFLAGS CXXFLAGS RUST_FLAGS V BISON FLEX AWK LIBBPF READELF
@ -963,7 +995,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

View File

@ -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))) \

View File

@ -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)

View File

@ -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)