Рассмотрим этот каталог сборки:
grep "" . -r
./sub/Makefile.include.am:include ../Makefile.include.am
./sub/Makefile.am:include Makefile.include.am
./sub/dir/Makefile.include.am:include ../Makefile.include.am
./sub/dir/Makefile.am:include Makefile.include.am
./Makefile.include.am:# empty file
./Makefile.am:include Makefile.include.am
./clean.sh:rm -fr \
./clean.sh: aclocal.m4 \
./clean.sh: autom4te.cache \
./clean.sh: Makefile.in \
./clean.sh: sub/Makefile.in \
./clean.sh: sub/dir/Makefile.in \
./clean.sh: install-sh missing INSTALL NEWS README AUTHORS ChangeLog COPYING \
./configure.ac:AC_INIT([Foo],[0.8.15],[me@pricavy.net])
./configure.ac:AM_INIT_AUTOMAKE([])
./configure.ac:
./configure.ac:AC_CONFIG_FILES([
./configure.ac: Makefile
./configure.ac: sub/Makefile
./configure.ac: sub/dir/Makefile
./configure.ac:])
./run.sh:aclocal
./run.sh:touch install-sh missing INSTALL NEWS README AUTHORS ChangeLog COPYING
./run.sh:automake
Выполнение ./run.sh генерирует эту ошибку:
Deep recursion on subroutine "Automake::read_am_file" at /usr/bin/automake-1.15 line 6536, <GEN115> line 1.
automake-1.15: error: cannot open < sub/dir/../Makefile.include.am: Too many open files
Проблема в том, что при генерации sub/dir/Makefile
текущая рабочаякаталог sub/dir
и остается таким же при включении sub/Makefile.include.am
, поэтому, когда sub/Makefile.include.am
пытается включить Makefile.include.am
, он фактически включает в себя создание бесконечного цикла до тех пор, пока не произойдет автоматическая ошибка.
ТамЕсть несколько решений, таких как использование абсолютных путей, однако я бы очень хотел сохранить показанный здесь шаблон, используя как можно больше относительных путей.Как я могу перефразировать эти включенные строки, чтобы сделать то, что я хочу?
Что-то вроде include $(selfdir)/../Makefile.include.am
в идеале, без необходимости определять selfdir
себя?
Вспомогательный скрипт для создания вышеуказанной структуры каталогов:
mkdir foo || exit
cd foo || exit
mkdir sub sub/dir || exit
echo "include ../Makefile.include.am" > sub/Makefile.include.am
echo "include Makefile.include.am" > sub/Makefile.am
echo "include ../Makefile.include.am" > sub/dir/Makefile.include.am
echo "include Makefile.include.am" > sub/dir/Makefile.am
echo "# empty file" > Makefile.include.am
echo "include Makefile.include.am" > Makefile.am
echo -e "rm -fr \\\\\n\taclocal.m4 \\\\\n\tautom4te.cache \\\\\n\tMakefile.in \\\\\n\tsub/Makefile.in \\\\\n\tsub/dir/Makefile.in \\\\\n\tinstall-sh missing INSTALL NEWS README AUTHORS ChangeLog COPYING \\" > clean.sh
echo -e "AC_INIT([Foo],[0.8.15],[me@pricavy.net])\nAM_INIT_AUTOMAKE([])\n\nAC_CONFIG_FILES([\n\tMakefile\n\tsub/Makefile\n\tsub/dir/Makefile\n])" > configure.ac
echo -e "aclocal\ntouch install-sh missing INSTALL NEWS README AUTHORS ChangeLog COPYING\nautomake" > run.sh
chmod +x clean.sh run.sh