2013년 11월 8일 금요일

데비안 리눅스에서 관리가 편한 arm cross toolchain인 emdebian 설치하기

리눅스에는 많은 좋은 점이 있지만,

나한테는 무엇보다도 휼용한 gcc cross 컴파일러를 사용할 수 있다는 것이 너무나도 좋다.

뭐 기본적인 컴파일러는 많은 곳에서 다운로드하여 사용할 수 있다.

그런데 뭔가 좀 하려다 보면 특정 라이브러리

예를 들면 freetype같은 폰트 라이브러리 같은 것을 쓰려다 보면

해당 소스코드를 다운로드하고 내가 가지고 있는 컴파일러에 맞게

configure와 Makefile 수정을 하고 컴파일하고

컴파일이 완료된 Library와 include 파일들을 복사하는 과정을 거쳐야 한다.

이것이 끝이 아니라 버그 수정이나 버전 상승이 발생하면 위의 모든 과정을 다시 거쳐야한다.

하지만, 여러분의 시스템이 데비안 시스템 혹은 데비안 호완 시스템이면

xapt라는 프로그램을 사용해서 이미 cross 컴파일된 패키지를 자동으로 관리해 준다.

이와 같은 것을 구현하려면 emdebian에서 제공하는

armel의 cross compiler와 라이브러리를 설치해야한다.

emdebian의 패키지를 받아 볼 수 있는 저장소는

아마도 여러분의 apt 소스 리스트에 없을 것이다.

 - /etc/apt/source.list.d/emdebian.list  
 deb http://www.emdebian.org/debian/ testing main  

그리고 하나 참고할 사항은 지금 작업하고 설정이 이루어지는 시스템은 jessie debian 임을 밝혀둔다.

그럼 emdebian의 인증키를 다운받아 설치하자.

 # apt-get install emdebian-archive-keyring  
 # apt-get update  

사전 설정은 어느정도 마무리 되었다.

그럼 현 시점에서 제공되고 있는 arm cross toolchain 패키지를 살펴보자.

 # apt-cache search armel  
 asterisk-prompt-fr-armelle - French voice prompts for Asterisk by Armelle Desjardins  
 debian-installer-7.0-netboot-armel - Debian-installer network boot images for armel  
 installation-guide-armel - Debian installation guide for armel  
 icedtea-6-jre-cacao - Alternative JVM for OpenJDK, using Cacao  
 icedtea-6-jre-jamvm - Alternative JVM for OpenJDK, using JamVM  
 icedtea-7-jre-jamvm - Alternative JVM for OpenJDK, using JamVM  
 cpp-4.3-arm-linux-gnueabi - The GNU C preprocessor  
 cpp-4.4-arm-linux-gnueabi - GNU C preprocessor  
 cpp-4.5-arm-linux-gnueabi - The GNU C preprocessor  
 cpp-4.6-arm-linux-gnueabi - GNU C preprocessor  
 cpp-4.7-arm-linux-gnueabi - GNU C preprocessor  
 g++-4.3-arm-linux-gnueabi - The GNU C++ compiler  
 g++-4.4-arm-linux-gnueabi - GNU C++ compiler  
 g++-4.5-arm-linux-gnueabi - The GNU C++ compiler  
 g++-4.6-arm-linux-gnueabi - GNU C++ compiler  
 g++-4.7-arm-linux-gnueabi - GNU C++ compiler  
 gcc-4.3-arm-linux-gnueabi - The GNU C compiler  
 gcc-4.4-arm-linux-gnueabi - GNU C compiler  
 gcc-4.4-base-armel-cross - The GNU Compiler Collection (base package) (for cross-compiling)  
 gcc-4.5-arm-linux-gnueabi - The GNU C compiler  
 gcc-4.6-arm-linux-gnueabi - GNU C compiler  
 gcc-4.7-arm-linux-gnueabi - GNU C compiler  
 libc-bin-armel-cross - Embedded GNU C Library: Binaries (for cross-compiling)  
 libc-dev-bin-armel-cross - Embedded GNU C Library: Development binaries (for cross-compiling)  
 libc6-armel-cross - Embedded GNU C Library: Shared libraries (for cross-compiling)  
 libc6-dev-armel-cross - Embedded GNU C Library: Development Libraries and Header Files (for cross-compiling)  
 libgcc1-dbg-armel-cross - GCC support library (debug symbols)  
 libgfortran3-armel-cross - Runtime library for GNU Fortran applications  
 libgfortran3-dbg-armel-cross - Runtime library for GNU Fortran applications (debug symbols)  
 libgmp-dev-armel-cross - Multiprecision arithmetic library developers tools (for cross-compiling)  
 libgmp10-armel-cross - Multiprecision arithmetic library (for cross-compiling)  
 libgmp3-dev-armel-cross - Multiprecision arithmetic library developers tools (for cross-compiling)  
 libgmp3c2-armel-cross - Multiprecision arithmetic library (for cross-compiling)  
 libgmpxx4ldbl-armel-cross - Multiprecision arithmetic library (C++ bindings) (for cross-compiling)  
 libgo0-armel-cross - Runtime library for GNU Go applications  
 libgo0-dbg-armel-cross - Runtime library for GNU Go applications (debug symbols)  
 libgomp1-armel-cross - GCC OpenMP (GOMP) support library (for cross-compiling)  
 libgomp1-dbg-armel-cross - GCC OpenMP (GOMP) support library (debug symbols)  
 libmpfr-dev-armel-cross - multiple precision floating-point computation developers tools (for cross-compiling)  
 libmpfr1ldbl-armel-cross - multiple precision floating-point computation (for cross-compiling)  
 libmpfr4-armel-cross - multiple precision floating-point computation (for cross-compiling)  
 libmudflap0-4.4-dev-armel-cross - GCC mudflap support libraries (development files)  
 libmudflap0-4.5-dev-armel-cross - GCC mudflap support libraries (development files)  
 libmudflap0-4.6-dev-armel-cross - GCC mudflap support libraries (development files)  
 libmudflap0-4.7-dev-armel-cross - GCC mudflap support libraries (development files)  
 libmudflap0-armel-cross - GCC mudflap shared support libraries  
 libmudflap0-dbg-armel-cross - GCC mudflap shared support libraries (debug symbols)  
 libobjc2-armel-cross - Runtime library for GNU Objective-C applications  
 libobjc2-dbg-armel-cross - Runtime library for GNU Objective-C applications (debug symbols)  
 libobjc3-armel-cross - Runtime library for GNU Objective-C applications  
 libobjc3-dbg-armel-cross - Runtime library for GNU Objective-C applications (debug symbols)  
 libobjc4-armel-cross - Runtime library for GNU Objective-C applications  
 libobjc4-dbg-armel-cross - Runtime library for GNU Objective-C applications (debug symbols)  
 libstdc++6-4.3-dbg-armel-cross - The GNU Standard C++ Library v3 (debugging files)  
 libstdc++6-4.3-dev-armel-cross - The GNU Standard C++ Library v3 (development files)  
 libstdc++6-4.3-pic-armel-cross - The GNU Standard C++ Library v3 (shared library subset kit)  
 libstdc++6-4.4-dbg-armel-cross - GNU Standard C++ Library v3 (debugging files)  
 libstdc++6-4.4-dev-armel-cross - GNU Standard C++ Library v3 (development files)  
 libstdc++6-4.4-pic-armel-cross - GNU Standard C++ Library v3 (shared library subset kit)  
 libstdc++6-4.5-dbg-armel-cross - The GNU Standard C++ Library v3 (debugging files)  
 libstdc++6-4.5-dev-armel-cross - The GNU Standard C++ Library v3 (development files)  
 libstdc++6-4.5-pic-armel-cross - The GNU Standard C++ Library v3 (shared library subset kit)  
 libstdc++6-4.6-dbg-armel-cross - GNU Standard C++ Library v3 (debugging files)  
 libstdc++6-4.6-dev-armel-cross - GNU Standard C++ Library v3 (development files)  
 libstdc++6-4.6-pic-armel-cross - GNU Standard C++ Library v3 (shared library subset kit)  
 libstdc++6-4.7-dbg-armel-cross - GNU Standard C++ Library v3 (debugging files)  
 libstdc++6-4.7-dev-armel-cross - GNU Standard C++ Library v3 (development files)  
 libstdc++6-4.7-pic-armel-cross - GNU Standard C++ Library v3 (shared library subset kit)  
 libstdc++6-armel-cross - GNU Standard C++ Library v3 (for cross-compiling)  
 linux-libc-dev-armel-cross - Linux support headers for userspace development (for cross-compiling)  
 tzdata-armel-cross - time zone and daylight-saving time data (for cross-compiling)  
 zlib1g-armel-cross - compression library - runtime (for cross-compiling)  
 zlib1g-dev-armel-cross - compression library - development (for cross-compiling)  
 gcc-4.8-base-armel-cross - GCC, the GNU Compiler Collection (base package) (for cross-compiling)  
 libgcc1-armel-cross - GCC support library (for cross-compiling)  
 multiarch-support-armel-cross - Transitional package to ensure multiarch compatibility (for cross-compiling)  
 libpng12-0-armel-cross - PNG library - runtime (for cross-compiling)  

위의 리스트에서 필요한 것들은

 linux-libc-dev-armel-cross,  
 libc6-armel-cross libc6-dev-armel-cross,  
 binutils-arm-linux-gnueabi,  
 gcc-4.7-arm-linux-gnueabi,  
 g++-4.7-arm-linux-gnueabi  

등이다. 하지만, 다음과 같이 뭔가 버전 문제가 발생한다.

 # apt-get install libc6-dev-armel-cross  
 패키지 목록을 읽는 중입니다... 완료  
 의존성 트리를 만드는 중입니다      
 상태 정보를 읽는 중입니다... 완료  
 몇몇 패키지를 설치할 수 없습니다. 요청한 상황이 불가능할 수도 있고,  
 불안정 배포판을 사용해서 일부 필요한 패키지를 아직 만들지 않았거나,  
 아직 Incoming에서 나오지 않은 경우일 수도 있습니다.  
 이 상황을 해결하는데 다음 정보가 도움이 될 수도 있습니다:  
 다음 패키지의 의존성이 맞지 않습니다:  
  libc6-dev-armel-cross : 의존: libc6-armel-cross (= 2.13-37) 하지만 2.17-93 패키지를 설치할 것입니다  
              의존: libc-dev-bin-armel-cross (= 2.13-37) 하지만 %s 패키지를 설치하지 않을 것입니다  
 E: 문제를 바로잡을 수 없습니다. 망가진 고정 패키지가 있습니다.  

필요로 하는 libc6-dev-armel-cross가

설치된 버전 혹은 현재의 소스 리스트의 추천 버전과 맞지 않음을 이야기 하는 것 같다.

그래서 현재 설정된 패키지 환경하에서 어떤 버전이 추천되어 있거나 설치되어 있는지 살펴 보았다.

 # apt-cache show libc6-armel-cross  
 Package: libc6-armel-cross  
 Status: install ok installed  
 Priority: extra  
 Section: libs  
 Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>  
 Architecture: all  
 Source: eglibc  
 Version: 2.17-93  
 Provides: glibc-2.17-1-armel-cross, libc6-armel-dcv1  
 Depends: libgcc1-armel-cross  
 Conflicts: prelink-armel-cross (<= 0.0.20090311-1), tzdata-armel-cross (<< 2007k-1), tzdata-etch-armel-cross  
 Description: Embedded GNU C Library: Shared libraries (for cross-compiling)  
  This package was generated by dpkg-cross for cross compiling.  
  .  
  Contains the standard libraries that are used by nearly all programs on  
  the system. This package includes shared versions of the standard C library  
  and the standard math library, as well as many others.  
 Description-md5: 24a92b169d87e4acb423e610210802be  
 Package: libc6-armel-cross  
 Version: 2.13-37  
 Architecture: all  
 Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>  
 Source: eglibc  
 Provides: glibc-2.13-1-armel-cross, libc6-armel-dcv1  
 Depends: libc-bin-armel-cross (= 2.13-37), libgcc1-armel-cross  
 Conflicts: prelink-armel-cross (<= 0.0.20090311-1), tzdata-armel-cross (<< 2007k-1), tzdata-etch-armel-cross  
 Priority: extra  
 Section: libs  
 Filename: pool/main/e/eglibc/libc6-armel-cross_2.13-37_all.deb  
 Size: 1313090  
 SHA256: 8607015bf3d53b0b7cc79e0ce7208609c4feec58be1f3d8e8e02039bb0551044  
 SHA1: c241df537bfd49221c4d37fbd020582ee6ae0044  
 MD5sum: 54b58aa8641f7ada31e9199ed0405d69  
 Description: Embedded GNU C Library: Shared libraries (for cross-compiling)  
  This package was generated by dpkg-cross for cross compiling.  
  .  
  Contains the standard libraries that are used by nearly all programs on  
  the system. This package includes shared versions of the standard C library  
  and the standard math library, as well as many others.  
 Description-md5: 24a92b169d87e4acb423e610210802be  

보아하니 설치된 것은 2.17-39이고 2.13-37도 제공하고 있는 것으로 추정된다.

정확히 무슨 말인지는 모르겠다.

그래서 해당 배포판의 해당 패키지의 정책에 대해서 살펴 보았다.

 # apt-cache policy libc6-armel-cross  
 libc6-armel-cross:  
  설치: 2.17-93  
  후보: 2.17-93  
  버전 테이블:  
  *** 2.17-93 0  
     100 /var/lib/dpkg/status  
    2.13-37 0  
     500 http://ftp.uk.debian.org/emdebian/toolchains/ testing/main amd64 Packages  

뭐 같은 이야기 인것 같다.

그럼 libc6-dev-armel-cross를 설치하는데 의존성을 가지고 있는 2.13-37 버전을 수동으로 설치하자.

 # apt-get install libc6-armel-cross=2.13-37  
 패키지 목록을 읽는 중입니다... 완료  
 의존성 트리를 만드는 중입니다      
 상태 정보를 읽는 중입니다... 완료  
 다음 패키지를 더 설치할 것입니다:  
  libc-bin-armel-cross  
 다음 새 패키지를 설치할 것입니다:  
  libc-bin-armel-cross  
 다음 패키지를 다운그레이드할 것입니다:  
  libc6-armel-cross  
 0개 업그레이드, 1개 새로 설치, 1개 업그레이드, 0개 제거 및 0개 업그레이드 안 함.  
 1,314 k바이트 아카이브를 받아야 합니다.  
 이 작업 후 0 바이트의 디스크 공간을 더 사용하게 됩니다.  
 계속 하시겠습니까? [Y/n]   

자 그럼 중단된 설치를 마무리 하자.

 # apt-get install linux-libc-dev-armel-cross libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi gcc-4.7-arm-linux-gnueabi g++-4.7-arm-linux-gnueabi  

cross toolchain의 설치는 마무리 된 것 같다. 그럼 gcc가 잘 설치 되었는지 살펴보자.

 # arm-linux-gnueabi-gcc-4.7 -v  
 Using built-in specs.  
 COLLECT_GCC=arm-linux-gnueabi-gcc-4.7  
 COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabi/4.7/lto-wrapper  
 Target: arm-linux-gnueabi  
 Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-4' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabi/include/c++/4.7.2 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libitm --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv4t --with-float=soft --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include --with-headers=/usr/arm-linux-gnueabi/include --with-libs=/usr/arm-linux-gnueabi/lib  
 Thread model: posix  
 gcc version 4.7.2 (Debian 4.7.2-4)   

그럼 마지막으로 cross 컴파일된 각종 라이브러리를 자동으로 관리 해줄 xapt를 설치하자.

 # apt-get install pdebuild-cross dpkg-cross xapt  

xapt는 설치할 아키텍쳐와 설치할 패키지를 다음과 같이 지정하여 실행할 수 있다.

 # xapt update  
 # xapt -a armel -m libpng12-0  

위의 과정은 libpng12-0의 armel 아키텍쳐로 cross 컴파일된 버전을 설치하는 명령어이다.

댓글 없음:

댓글 쓰기