Programming Languages

Expect cross-compile 문제 해결

Sushi Yun 2013. 5. 20. 20:47
회사에서는 배포의 유리함 때문에 VM이미지를 만들어 빌드환경을 배포하고 있습니다.
그래서 64bit 데스크탑 놔두고 32bit VM에서 64bit 환경용 펌웨어를 빌드하는 실정... ㅇ<-<
조금 불편하지만, 뭐, 괜찮습니다. 느리면 느린대로 그시간에 책을 읽으며 여유를 가질 수 있으니까 (...)

아무튼 그러던 중, expect라는 툴을 빌드하게 됐는데요,
이 녀석이 글쎄 configure 스크립트 결과 상으로는 '크로스컴파일을 지원하지 않는다 (Expect can't be cross compiled)'며 제게 포기할 것을 강요했습니다. 하지만 이녀석은 나름 중요한 역할을 하는 녀석이라 빼먹고 갈 수가 없어서 빌드를 어떻게든 하겠다며 왠갖 삽질을 다 했지요. 그러던 중 구글링과 삽질의 결과로 configure.in 템플릿의 AC_TRY_RUN 이라는 매크로를 사용하여 우회할 수 있다는 것을 발견하게 되었지요. (참고: configure.in의 내용을 기반으로 autoconf를 실행하여 환경설정 매크로인 configure를 만듭니다.)
AC_TRY_RUN 매크로는 아래와 같은 형식을 가집니다 [1].

AC_TRY_RUN (
program,
[action-if-true],
[action-if-false],
[action-if-cross-compiling]
)


여기서 program은 (당연히) 테스트 프로그램, 그리고 테스트 프로그램의 결과가 0이면 (UNIX계열에서는 보통 정상종료를 의미합니다) true, 그 밖의 값이면 false에 해당하는 명령을 수행합니다. 마지막으로 크로스컴파일 환경이면 cross-compiling에 해당하는 명령을 수행하겠죠.
이 때, 크로스컴파일 환경임을 알 수 있는 방법으로는 configure를 실행할 때 정의하는 System Type을 참고합니다. 아래 configure 도움말을 참고했을 때, 환경설정 내용 중 BUILD와 HOST가 다르면 크로스컴파일 환경이라고 간주하는 것이지요.

  • System Type
    --build=BUILD     configure for building on BUILD [guessed]
    --host=HOST       cross-compile to build programs to run on HOST [BUILD]
    --target=TARGET   configure for building compilers for TARGET [HOST]

다시 expect의 configure.in돌아가면, 앞서 보신 형식과 같은 부분을 여러 군데에서 볼 수 있습니다. 그 중에 하나를 예로 들면 아래와 같지요.

AC_TRY_RUN([
#include <sys/wait.h>
main() {
#ifndef WNOHANG
        return 0;
#else
        return 1;
#endif
}],
        AC_MSG_RESULT(yes)
        AC_DEFINE(WNOHANG_REQUIRES_POSIX_SOURCE)
,
        AC_MSG_RESULT(no)
,
        AC_MSG_ERROR([Expect can't be cross compiled])
)


위 코드에서 WNOHANG은 <sys/wait.h>의 옵션으로, 자식 프로세스의 상태에 따른 값을 리턴하고 바로 종료합니다. (크로스컴파일 환경에서 이를 에러처리하는 이유는 하드웨어 플랫폼 등의 환경이 달라지면서 결과가 변할 수 있기 때문에, 아예 사전에 고민의 여지를 차단해버린 것으로 판단됩니다. 이에 대한 다른 분들의 의견을 구합니다.)
따라서 구글링에 걸린 자료[2]같은 패치를 사용하는 방법으로 expect의 크로스컴파일 설정을 할 수 있겠죠. 간단히 말하면, cross-compile에 해당하는 명령(에러 처리하는 부분) 대신 테스트 프로그램의 결과를 보고 그에 따른 true나 false에 해당하는 명령을 복사하는 방법으로 해결 가능합니다.
그리고 모든 수정이 끝난 뒤에 autoconf를 통해 configure 파일을 업데이트 하는 것을 잊지 마세요. '-^)

[참고 자료]


'Programming Languages' 카테고리의 다른 글

[추상자료형] 집합(Set)  (0) 2016.09.13
glibc/open_memstream() 소개  (0) 2015.04.12
객체지향 Makefile 관리하기  (0) 2014.11.06