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.

Reply via email to