Don't create Python bytecode when building the kernel
Subsystems (5)
v3 cover Don't create Python bytecode when building the kernel
As reported by Andy, the Kernel build system runs kernel-doc script for DRM, when W=1. Due to Python's normal behavior, its JIT compiler will create a bytecode and store it under scripts/lib/*/__pycache__. As one may be using O= and even having the sources on a read-only mount point, disable its creation during build time.
This is done by adding PYTHONDONTWRITEBYTECODE=1 on every place where the script is called within Kbuild and when called via another script.
This only solves half of the issue though, as one may be manually running the script by hand, without asking Python to not store any bytecode. This should be OK, but afterwards, git status will list the __pycache__ as not committed. To prevent that, add *.pyc to .gitignore.
This series contain 4 patches:
- patch 1 adjusts a variable that pass extra data to scripts/kerneldoc.py;
- patch 2moves scripts/kernel-doc location to the main makefile and exports it, as scripts/Makefile.build will need it;
- patch 3 disables __pycache__ generation and ensure that the entire Kbuild will use KERNELDOC var for the location of kernel-doc;
- patch 4 adds *.pyc at the list of object files to be ignored.
---
v3:
- move KERNELDOC to the main Makefile;
- get rid of the badly-named KERNELDOC_CONF var.
v2:
- added a .gitignore file;
- add PYTHONDONTWRITEBYTECODE=1 to the places where kernel-doc is called.
Mauro Carvalho Chehab (4):
docs: Makefile: get rid of KERNELDOC_CONF env variable
Makefile: move KERNELDOC macro to the main Makefile scripts/kernel-doc.py: don't create *.pyc files .gitignore: ignore Python compiled bytecode
.gitignore | 1 + Documentation/Makefile | 5 ++--- Makefile | 5 +++++ drivers/gpu/drm/Makefile | 2 +- drivers/gpu/drm/i915/Makefile | 2 +- include/drm/Makefile | 2 +- scripts/Makefile.build | 2 +- scripts/find-unused-docs.sh | 2 +- 8 files changed, 13 insertions(+), 8 deletions(-)
Signature · 1 line
2.49.0
PATCH v3 1/4 docs: Makefile: get rid of KERNELDOC_CONF env variable
Despite its name, what's there is a set of Sphinx arguments that are passed to sphinx/kerneldoc.py:
- kerneldoc_srctree: location of the source tree;
- kerneldoc_bin: external script to excecute kernel-doc
Drop it, and just place the values at the already-existing ALLSPHINXOPTS variable.
--- Documentation/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Documentation/Makefile +2 -2
@@ -61,8 +61,8 @@ endif #HAVE_LATEXMK PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter KERNELDOC = $(srctree)/scripts/kernel-doc.py -KERNELDOC_CONF = -D kerneldoc_srctree=$(srctree) -D kerneldoc_bin=$(KERNELDOC) -ALLSPHINXOPTS = $(KERNELDOC_CONF) $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) +ALLSPHINXOPTS = -D kerneldoc_srctree=$(srctree) -D kerneldoc_bin=$(KERNELDOC) +ALLSPHINXOPTS += $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ifneq ($(wildcard $(srctree)/.config),) ifeq ($(CONFIG_RUST),y) # Let Sphinx know we will include rustdoc
Signature · 1 line
2.49.0
PATCH v3 2/4 Makefile: move KERNELDOC macro to the main Makefile
In reply to Mauro Carvalho ChehabAs kernel-doc script is used not only on Documentation, but also on scripts and drivers/drm Makefiles, move it to the main makefile, as otherwise sub-makefiles may not have it.
--- Documentation/Makefile | 1 - Makefile | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-)
Documentation/Makefile +0 -1
@@ -60,7 +60,6 @@ endif #HAVE_LATEXMK # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter -KERNELDOC = $(srctree)/scripts/kernel-doc.py ALLSPHINXOPTS = -D kerneldoc_srctree=$(srctree) -D kerneldoc_bin=$(KERNELDOC) ALLSPHINXOPTS += $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ifneq ($(wildcard $(srctree)/.config),)
Makefile +5 -0
@@ -458,6 +458,11 @@ endif HOSTRUSTC = rustc HOSTPKG_CONFIG = pkg-config +# the KERNELDOC macro needs to be exported, as scripts/Makefile.build +# has a logic to call it +KERNELDOC = $(srctree)/scripts/kernel-doc.py +export KERNELDOC + KBUILD_USERHOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \ -O2 -fomit-frame-pointer -std=gnu11 KBUILD_USERCFLAGS := $(KBUILD_USERHOSTCFLAGS) $(USERCFLAGS)
Signature · 1 line
2.49.0
PATCH v3 3/4 scripts/kernel-doc.py: don't create *.pyc files
In reply to Mauro Carvalho ChehabAs reported by Andy, kernel-doc.py is creating a __pycache__ directory at build time.
Disable creation of __pycache__ for the libraries used by kernel-doc.py, when excecuted via the build system or via scripts/find-unused-docs.sh.
--- drivers/gpu/drm/Makefile | 2 +- drivers/gpu/drm/i915/Makefile | 2 +- include/drm/Makefile | 2 +- scripts/Makefile.build | 2 +- scripts/find-unused-docs.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-)
drivers/gpu/drm/Makefile +1 -1
@@ -236,7 +236,7 @@ always-$(CONFIG_DRM_HEADER_TEST) += \ quiet_cmd_hdrtest = HDRTEST $(patsubst %.hdrtest,%.h,$@) cmd_hdrtest = \ $(CC) $(c_flags) -fsyntax-only -x c /dev/null -include $< -include $<; \ - $(srctree)/scripts/kernel-doc -none $(if $(CONFIG_WERROR)$(CONFIG_DRM_WERROR),-Werror) $<; \ + PYTHONDONTWRITEBYTECODE=1 $(KERNELDOC) -none $(if $(CONFIG_WERROR)$(CONFIG_DRM_WERROR),-Werror) $<; \ touch $@ $(obj)/%.hdrtest: $(src)/%.h FORCE
drivers/gpu/drm/i915/Makefile +1 -1
@@ -408,7 +408,7 @@ obj-$(CONFIG_DRM_I915_GVT_KVMGT) += kvmgt.o # # Enable locally for CONFIG_DRM_I915_WERROR=y. See also scripts/Makefile.build ifdef CONFIG_DRM_I915_WERROR - cmd_checkdoc = $(srctree)/scripts/kernel-doc -none -Werror $< + cmd_checkdoc = PYTHONDONTWRITEBYTECODE=1 $(KERNELDOC) -none -Werror $< endif # header test
include/drm/Makefile +1 -1
@@ -11,7 +11,7 @@ always-$(CONFIG_DRM_HEADER_TEST) += \ quiet_cmd_hdrtest = HDRTEST $(patsubst %.hdrtest,%.h,$@) cmd_hdrtest = \ $(CC) $(c_flags) -fsyntax-only -x c /dev/null -include $< -include $<; \ - $(srctree)/scripts/kernel-doc -none $(if $(CONFIG_WERROR)$(CONFIG_DRM_WERROR),-Werror) $<; \ + PYTHONDONTWRITEBYTECODE=1 $(KERNELDOC) -none $(if $(CONFIG_WERROR)$(CONFIG_DRM_WERROR),-Werror) $<; \ touch $@ $(obj)/%.hdrtest: $(src)/%.h FORCE
scripts/Makefile.build +1 -1
@@ -83,7 +83,7 @@ else ifeq ($(KBUILD_CHECKSRC),2) endif ifneq ($(KBUILD_EXTRA_WARN),) - cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $(KDOCFLAGS) \ + cmd_checkdoc = PYTHONDONTWRITEBYTECODE=1 $(KERNELDOC) -none $(KDOCFLAGS) \ $(if $(findstring 2, $(KBUILD_EXTRA_WARN)), -Wall) \ $< endif
scripts/find-unused-docs.sh +1 -1
@@ -54,7 +54,7 @@ for file in `find $1 -name '*.c'`; do if [[ ${FILES_INCLUDED[$file]+_} ]]; then continue; fi - str=$(scripts/kernel-doc -export "$file" 2>/dev/null) + str=$(PYTHONDONTWRITEBYTECODE=1 scripts/kernel-doc -export "$file" 2>/dev/null) if [[ -n "$str" ]]; then echo "$file" fi
Signature · 1 line
2.49.0
PATCH v3 4/4 .gitignore: ignore Python compiled bytecode
In reply to Mauro Carvalho ChehabWhile the building system doesn't create any Python JIT bytecode, if one manually runs kernel-doc.py or get_abi.py, Python will, by default, create a bytecode and store it under scripts/lib/*.
This is normal, and not controlled by the Kernel itself. So, add *.pyc as an extension to be ignored.
--- .gitignore | 1 + 1 file changed, 1 insertion(+)
.gitignore +1 -0
@@ -39,6 +39,7 @@ *.mod.c *.o *.o.* +*.pyc *.patch *.rmeta *.rpm
Signature · 1 line
2.49.0
Re: [PATCH v3 4/4] .gitignore: ignore Python compiled bytecode
Quoted 3 lines · Mauro Carvalho Chehab
+*.pyc
*.patch
I think the list is intended to be sorted.
Should *.pyo be added as well?
Thanks!
Cheers,
Miguel
Re: [PATCH v3 4/4] .gitignore: ignore Python compiled bytecode
Quoted 2 lines · Miguel Ojeda
Should
*.pyobe added as well?
I think this one is a no, given even oldoldstable Debian ships new enough Python.
Cheers,
Miguel
Re: [PATCH v3 4/4] .gitignore: ignore Python compiled bytecode
In reply to Miguel OjedaQuoted 7 lines · Miguel Ojeda
Quoted 3 lines · Mauro Carvalho Chehab
+*.pyc
*.patchI think the list is intended to be sorted.
+1, I told already twice, I dunno if my messages were seen.
Signature · 2 lines
With Best Regards, Andy Shevchenko
Quoted 14 lines · Mauro Carvalho Chehab
As reported by Andy, the Kernel build system runs kernel-doc script for DRM, when W=1. Due to Python's normal behavior, its JIT compiler will create a bytecode and store it under
scripts/lib/*/__pycache__. As one may be using O= and even having the sources on a read-only mount point, disable its creation during build time.This is done by adding PYTHONDONTWRITEBYTECODE=1 on every place where the script is called within
Kbuildand when called via another script.This only solves half of the issue though, as one may be manually running the script by hand, without asking Python to not store any bytecode. This should be OK, but afterwards, git status will list the
__pycache__as not committed. To prevent that, add *.pyc to .gitignore.
Quoted 8 lines
This series contain 4 patches:
- patch 1 adjusts a variable that pass extra data to
scripts/kerneldoc.py;
- patch 2movesscripts/kernel-doclocation to the main makefile and exports it, asscripts/Makefile.buildwill need it;
- patch 3 disables__pycache__generation and ensure that the entireKbuildwill use KERNELDOC var for the location of kernel-doc;
- patch 4 adds *.pyc at the list of object files to be ignored.
This one works for me, thanks!
Signature · 2 lines
With Best Regards, Andy Shevchenko