сделать невозможным рекурсию для проектов, похожих на autoconf

Я построил Linux-систему на чипе ARMv7, и она работает на удивление хорошо, но у меня возникла проблема с собственными сборками.

Сначала я загрузился с помощью кросс-компиляции в системе x86-64, и теперь мне показалось, что я перестрою все изначально и запускаю тесты и т. Д.

Проблема, с которой я сталкиваюсь, затрагивает проекты, которые делают определенные вещи, которые, как правило, делают проекты autoconf. Я столкнулся с этой проблемой в нескольких компонентах, таких как gmake и m4, но я сосредоточусь здесь на gmake (поведение в точности одинаково для других затронутых проектов). Python, nginx, uwsgi, perl и т. Д., Строят без каких-либо проблем.

Это основной порядок вещей, которые я делаю:

$ tar xjf ~/download/make-4.2.1.tar.bz2 $ cd make-4.2.1 $ ./configure 

До этого момента все отлично работает – он находит встроенный компилятор, который я построил с помощью кросс-компилятора, а также находит все кросс-встроенные инструменты (sed, gawk и т. Д.). Проблема в том, что когда я запускаю «make», он сразу же выдает ошибку:

 $ make make all-recursive make[1]: Entering directory '/home/jan/tmp/make-4.2.1' Making all in glob make[1]: *** [Makefile:798: all-recursive] Error 1 make[1]: Leaving directory '/home/jan/tmp/make-4.2.1' make: *** [Makefile:534: all] Error 2 

Как видно, он практически ничего не делает; он утверждает, что входит в подкаталог glob, но он никогда туда не попадает.

Бег

 $ make --trace 

.. дает:

 Makefile:573: update target 'config.h' due to: stamp-h1 test -f config.h || rm -f stamp-h1 test -f config.h || make stamp-h1 Makefile:534: update target 'all' due to: config.h make all-recursive make[1]: Entering directory '/home/jan/tmp/make-4.2.1' Makefile:798: target 'all-recursive' does not exist fail=; \ if (target_option=k; case ${target_option-} in ?) ;; *) echo "am__make_running_with_option: internal error: invalid" "target option '${target_option-}' specified" >&2; exit 1;; esac; has_opt=no; sane_makeflags=$MAKEFLAGS; if { if test -z '1'; then false; elif test -n 'armv7l-unknown-linux-gnueabihf'; then true; elif test -n '4.2.1' && test -n '/home/jan/tmp/make-4.2.1'; then true; else false; fi; }; then sane_makeflags=$MFLAGS; else case $MAKEFLAGS in *\\[\ \ ]*) bs=\\; sane_makeflags=`printf '%s\n' "$MAKEFLAGS" | sed "s/$bs$bs[$bs $bs ]*//g"`;; esac; fi; skip_next=no; strip_trailopt () { flg=`printf '%s\n' "$flg" | sed "s/$1.*$//"`; }; for flg in $sane_makeflags; do test $skip_next = yes && { skip_next=no; continue; }; case $flg in *=*|--*) continue;; -*I) strip_trailopt 'I'; skip_next=yes;; -*I?*) strip_trailopt 'I';; -*O) strip_trailopt 'O'; skip_next=yes;; -*O?*) strip_trailopt 'O';; -*l) strip_trailopt 'l'; skip_next=yes;; -*l?*) strip_trailopt 'l';; -[dEDm]) skip_next=yes;; -[JT]) skip_next=yes;; esac; case $flg in *$target_option*) has_opt=yes; break;; esac; done; test $has_opt = yes); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo all-recursive | sed s/-recursive//`; \ case "all-recursive" in \ distclean-* | maintainer-clean-*) list='glob config po doc w32' ;; \ *) list='glob config po doc ' ;; \ esac; \ for subdir in $list; do \ echo "Making $target in $subdir"; \ if test "$subdir" = "."; then \ dot_seen=yes; \ local_target="$target-am"; \ else \ local_target="$target"; \ fi; \ (CDPATH="${ZSH_VERSION+.}:" && cd $subdir && make $local_target) \ || eval $failcom; \ done; \ if test "$dot_seen" = "no"; then \ make "$target-am" || exit 1; \ fi; test -z "$fail" Making all in glob make[1]: *** [Makefile:798: all-recursive] Error 1 make[1]: Leaving directory '/home/jan/tmp/make-4.2.1' make: *** [Makefile:534: all] Error 2 

Я знаю, где это не удается, но я не понимаю, почему. В нижней части находится раздел:

 (CDPATH="${ZSH_VERSION+.}:" && cd $subdir && make $local_target) 

Если я изменю это на:

 (printf "hello\n" && CDPATH="${ZSH_VERSION+.}:" && printf "world\n" && cd $subdir && make $local_target) 

.. и повторите всю строку, затем она выдает:

 Making all in glob hello exit 

Другими словами, похоже, что она не проходит мимо части CDPATH = …, которая меня сбивает с толку. Я проверил по крайней мере один другой проект в деталях, и это та же самая логика, которая тоже не срабатывает.

Все компоненты являются новыми (если не самая последняя стабильная версия, это всего лишь одна или две версии (GCC 7.2.0, gmake 4.2.1, bash 4.4 и т. Д.)). Я использую glibc и, хотя это система busybox, некоторые из инструментов были заменены инструментами coreutils. И, как я упоминал ранее, я использую bash (с SHELL, установленным в / bin / bash).

Я много искал поиски решений; единственный совет, который я нашел, был для проблемы, которая была только смутно похожа на мою, и решение заключалось в том, чтобы запустить autoreconf. Я, очевидно, пробовал это, но это не имело значения.

Что может привести к сбою сборки?

One Solution collect form web for “сделать невозможным рекурсию для проектов, похожих на autoconf”

Оказывается, это было вызвано перестройкой bash. К счастью, проблема не повлияла на создание bash сама по себе на платформе ARM, поэтому, как только я построю собственную сборку, запустите все тесты, установите новую биновку bash и перезагрузитесь, тогда проблема исчезнет.

  • Ошибочно думать, что правило преуспело из-за 0-размерного файла, сгенерированного перенаправлением вывода
  • cc1: предупреждения обрабатываются как ошибки при компиляции FreeBSD 8.2 Release
  • Файлы с файлами Makefile с шаблоном
  • Проход в меню конфигурации (меню)
  • Чтобы написать этот псевдокод с регулярным выражением
  • Мой рукописный C + + Makefile дает команду не найдена
  • Я хочу запускать команды, такие как make, make install, установка установки python без изменения каталогов
  • cd в дочерний каталог символической ссылки не выполняется
  • Есть ли способ создать журнал сборки при запуске «make»?
  • Как выдать с помощью MAKE и только -silent вывод на экран, но получить полный вывод в файл журнала
  • Использование встроенного скрипта python в Makefile
  • Linux и Unix - лучшая ОС в мире.