https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127956
Bug ID: 127956
Summary: [riscv] configure writes empty PYTHON to config.status
when which is not installed
Product: gcc
Version: 16.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: other
Assignee: unassigned at gcc dot gnu.org
Reporter: tehtiam at aosc dot io
Target Milestone: ---
## Steps of reproducing
In a build environment with Python 3 but no which, build gcc targeting RISC-V
with m2 enabled. In the GCC 16.2.0 source directory:
> mkdir build
> cd build
> ../configure --target=riscv64-unknown-linux-gnu
> --enable-languages=c,c++,lto,m2 --disable-bootstrap --disable-multilib
> make
The build will fail with error:
> ../../gcc/m2/tools-src/def2doc.py -t -b./
> -f../../gcc/m2/gm2-libs/Builtins.def -o
> /root/gcc-16.2.0/build/gcc/m2/Builtins.texi
> make[2]: ../../gcc/m2/tools-src/def2doc.py: Permission denied
> make[2]: *** [../../gcc/m2/Make-lang.in:345: Builtins.texi-check] Error 127
In the logs and config files, there will be:
> $ grep -r PYTHON
> gcc/config.log:ac_cv_prog_PYTHON=python3
> gcc/config.log:HAVE_PYTHON='yes'
> gcc/config.log:PYTHON=''
> gcc/config.cache:ac_cv_prog_PYTHON=${ac_cv_prog_PYTHON=python3}
> gcc/config.status:S["HAVE_PYTHON"]="yes"
> gcc/config.status:S["PYTHON"]=""
> gcc/m2/config-make:PYTHON =
> gcc/m2/config-make:HAVE_PYTHON = yes
> gcc/m2/Make-maintainer:ifeq ($(HAVE_PYTHON),yes)
> gcc/m2/Make-maintainer:ifeq ($(HAVE_PYTHON),yes)
This problem can be reproduced as long as the target is RISC-V, no matter
wheher a native compiler is being built on RISC-V host or a cross compiler is
being built on a non-RISC-V host. It cannot be reproduced if the target is not
RISC-V. It cannot be reproduced if `which` is available.
## Analysis
This script is invoked in `gcc/m2/Make-lang.in`:
> gcc/m2/Make-lang.in:249: $(PYTHON) $(srcdir)/m2/tools-src/def2doc.py
> -t -uLibraries -s$(srcdir)/m2 -b$(objdir)/m2 -o $(objdir)/m2/gm2-libs.texi
> gcc/m2/Make-lang.in:263: $(PYTHON) $(srcdir)/m2/tools-src/def2doc.py
> -x -uLibraries -s$(srcdir)/m2 -b$(objdir)/m2 -o $(objdir)/m2/gm2-libs.rst
> gcc/m2/Make-lang.in:292: $(PYTHON) $(srcdir)/m2/tools-src/def2doc.py
> -t -b$(objdir)/m2 -f$(objdir)/m2/gm2-libs/SYSTEM.def -o
> $(objdir)/m2/SYSTEM-pim.texi
> gcc/m2/Make-lang.in:305: $(PYTHON) $(srcdir)/m2/tools-src/def2doc.py
> -x -b$(objdir)/m2 -f$(objdir)/m2/gm2-libs/SYSTEM.def -o
> $(objdir)/m2/SYSTEM-pim.rst
> gcc/m2/Make-lang.in:318: $(PYTHON) $(srcdir)/m2/tools-src/def2doc.py
> -t -b$(objdir)/m2 -f$(objdir)/m2/gm2-libs-iso/SYSTEM.def -o
> $(objdir)/m2/SYSTEM-iso.texi
> gcc/m2/Make-lang.in:331: $(PYTHON) $(srcdir)/m2/tools-src/def2doc.py
> -x -b$(objdir)/m2 -f$(objdir)/m2/gm2-libs-iso/SYSTEM.def -o
> $(objdir)/m2/SYSTEM-iso.rst
> gcc/m2/Make-lang.in:345: $(PYTHON) $(srcdir)/m2/tools-src/def2doc.py
> -t -b./ -f$(srcdir)/m2/gm2-libs/Builtins.def -o $(objdir)/m2/Builtins.texi
> gcc/m2/Make-lang.in:358: $(PYTHON) $(srcdir)/m2/tools-src/def2doc.py
> -x -b./ -f$(srcdir)/m2/gm2-libs/Builtins.def -o $(objdir)/m2/Builtins.rst
However, as shown above, `$(PYTHON)` is set to empty, and `def2doc.py` is not
executable, so it fails. The `$(PYTHON)` is set by this script, which will
silently make `$(PYTHON)` empty if which is not available.
> gcc/config.gcc:4924: PYTHON=`which python3 || which python`
However, this is inconsistent with
https://gcc.gnu.org/install/prerequisites.html , which does not say `which` is
required to build gcc. I have also noted that in `gcc/config.gcc`, only RISC-V
targets have this behavior.
It is my first time reporting bugs to GCC, please tell me how to improve if I
am not doning well.