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?