autoconf와 유사한 프로젝트를 반복하는 것을 불가능하게 만듭니다.

autoconf와 유사한 프로젝트를 반복하는 것을 불가능하게 만듭니다.

ARMv7 칩에서 실행되는 Linux 시스템을 구축했는데 완벽하게 실행되고 있지만 기본 빌드에 문제가 있습니다.

처음에는 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를 사용하고 있는데 비지박스 시스템이기는 하지만 몇몇 도구가 coreutils 도구로 대체되었습니다. 그리고 앞서 언급했듯이 저는 bash(SHELL이 /bin/bash로 설정됨)를 사용하고 있습니다.

나는 해결책을 찾기 위해 많은 것을 검색했습니다. 내가 찾은 유일한 팁은 내 문제와 막연하게 유사한 문제에 대한 것이었고 해결책은 autoreconf를 실행하는 것입니다. 분명히 시도해 보았지만 별 차이가 없었습니다.

빌드가 실패하는 원인은 무엇입니까?

답변1

이는 bash 크로스 빌드로 인한 것으로 밝혀졌습니다. 다행히 이 문제는 ARM 플랫폼 자체에서 로컬로 bash를 빌드하는 데 영향을 미치지 않았으므로 로컬 빌드를 빌드하고 모든 테스트를 실행하고 새 bash 바이너리를 설치하고 재부팅하면 문제가 사라졌습니다.

관련 정보