torna incapaz de recursar para projetos do tipo autoconf

2

Eu construí um sistema Linux rodando em um chip ARMv7 e ele funciona surpreendentemente bem, mas eu tive um problema com construções nativas.

Primeiro eu sou inicializado pela compilação cruzada em um sistema x86-64, e agora eu pensei em reconstruir tudo nativamente e executar testes, etc.

O problema que estou encontrando afeta projetos que fazem certas coisas que projetos autoconf tendem a fazer. Eu me deparei com esse problema em vários componentes, como gmake e m4, mas vou me concentrar no gmake aqui (o comportamento é exatamente o o mesmo para os outros projetos afetados). Python, nginx, uwsgi, perl, etc., constroem sem problemas.

Esta é a ordem básica das coisas que estou fazendo:

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

Até este ponto tudo funciona muito bem - ele encontra o compilador nativo I construído com o compilador cruzado, e também encontra todas as ferramentas de construção cruzada (sed, gawk, etc). A questão é que quando eu corro "make" ele imediatamente joga um erro:

$ 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

Como se pode ver, essencialmente não faz nada; afirma ser indo para o subdiretório glob, mas nunca chega lá.

Rodando

$ make --trace

.. yields:

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

Eu meio que sei onde isso falha, mas não entendo o porquê. Perto do fundo há uma seção:

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

Se eu mudar isso para:

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

.. e reexecute a linha inteira, então ela gera:

Making all in glob
hello
exit

Em outras palavras, não parece estar passando da parte CDPATH = ..., que é confuso para mim. Eu chequei pelo menos um outro projeto em detalhes e é a mesma lógica que falha nisso também.

Todos os componentes são novos (se não a última versão estável, é apenas uma ou duas versões anteriores (GCC 7.2.0, gmake 4.2.1, bash 4.4, etc)). Eu estou usando o glibc e, embora seja um sistema busybox, várias das ferramentas foram substituídas pelas ferramentas coreutils. E, como mencionei anteriormente, estou usando o bash (com SHELL definido para / bin / bash).

Eu procurei um pouco por aí procurando soluções; a única dica que encontrei foi para um problema que era apenas vagamente semelhante ao meu e a solução era execute o autoreconf. Eu obviamente tentei isso, mas não fez diferença.

O que poderia estar causando falha na construção?

    
por cypheratheist 29.08.2017 / 11:46

1 resposta

2

Acontece que isso foi causado por bash sendo cross-built. Felizmente, o problema não afetou o fato de o edifício basear-se nativamente na plataforma ARM, portanto, depois de construir uma construção nativa, executar todos os testes, instalar o novo binário bash e reiniciar, o problema desaparece.

    
por 01.10.2017 / 05:12