make clean
echo'foo=$(foo)'> ./Modules/Setup.local
./configure
make # hangs forever
Or more minimally:
make clean
echo'foo=$(foo)'> ./Modules/Setup.local
make Makefile
./python -m sysconfig --generate-posix-vars # hangs forever
Longer cycles are also possible, e.g. v1=$(v2), v2=$(v3), ...., v999=$(v1).
Note that this is less of an issue if the recursive variable definition gets expanded in the Makefile before python -m sysconfig --generate-posix-vars gets invoked. In that case, Make will detect the cycle and exit before the infinite loop occurs.
Thank you for report. This is much complex code, and it is not always clear what behavior is correct.
Recursive solution fixes the problem of infinite recursion and other bugs, but it introduces other problem -- stack consumption. If you create several hundred forward referencing variables, you can now get RecursionError. It would be possible to solve this using topological sorting, but I am not sure that it is worth to do this.
Activity
pythongh-136097: Fix sysconfig._parse_makefile()
serhiy-storchaka commented on Jul 1, 2025
Thank you for report. This is much complex code, and it is not always clear what behavior is correct.
Recursive solution fixes the problem of infinite recursion and other bugs, but it introduces other problem -- stack consumption. If you create several hundred forward referencing variables, you can now get RecursionError. It would be possible to solve this using topological sorting, but I am not sure that it is worth to do this.
pythongh-136097: Fix sysconfig._parse_makefile()
gh-136097: Fix sysconfig._parse_makefile() (#136166)
pythongh-136097: Fix sysconfig._parse_makefile() (python#136166)