сделать невозможным рекурсию для проектов, похожих на 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 и перезагрузитесь, тогда проблема исчезнет.

  • Замените одну строку на STDIN в Makefile
  • После обновления и обновления apt-get мне нужно перекомпилировать и переустановить программное обеспечение, которое я не установил с помощью apt-get install?
  • Ошибки кросс-компиляции с distcc
  • Проход в меню конфигурации (меню)
  • Ошибка компиляции Ocaml в AIX 6.1
  • Ошибка: TCA_HTB_PAD не объявлен при создании ядра
  • Как создать пользовательскую версию FreeBSD без привилегий root?
  • Buliding libaffa: running make говорит: ничего не нужно делать для «всех»,
  • компиляция PHP не приводит к ошибке libpcre
  • Автоматическая генерация LDFLAGS, CPPFLAGS и других сообщений об ошибках
  • checkinstall зависает при «Копирование файлов во временный каталог ...» при создании vim8
  • Компилировать пакет без установки необходимых библиотек
  • Linux и Unix - лучшая ОС в мире.