Home » 산딸기 가지고 놀기 » 라즈베리파이 활용강좌 : 라즈베리파이 우분투에서 distcc로 크로스컴파일 하기(Raspberry Pi Crosscompile on Ubuntu)

라즈베리파이 활용강좌 : 라즈베리파이 우분투에서 distcc로 크로스컴파일 하기

Raspberry Pi Crosscompile on Ubuntu

 

Created Date: 2013.12.05

Modified Date: 2014.05.28

revision 1.2

 

안녕하세요 산딸기마을 팬더골드 입니다.

직전에 OSX 용 Crosscompile 을 포스트( RASPBERRYPI CROSSCOMPILE ON MAC OSX )하면서, Linux용은 생략할려고 했는데 필요할까봐 적어놔 봅니다.

 

1. Ubuntu에 설치

 

  필자는 Ubuntu를  OSX용 가상머신인 Parellels에 설치하였다. Ubuntu 설치 후, Lan 설정을 공유기의 대역와 맞추도록 하였다. 공유기는 192.168.0.1, Ubuntu는 192.168.0.48, Raspberry Pi는 192.168.0.10x 이다.

그리고, OSX는 amd64, Ubuntu도 amd64 버전으로 깔려있다. Ubuntu를 i386으로 했더니 에러가 발생하였다. 방법이 있는것도 같으나, 그냥 맞춰서 까는게 낫지 않나 싶다.

필요한 의존성 패키지를 설치하자.

parallels@ubuntu $ sudo apt-get update; sudo apt-get upgrade -y
parallels@ubuntu $ sudo apt-get install bison cvs flex gperf texinfo automake libtool gawk libncurses5-dev g++ subversion

  아래의 디렉토리 명 들은 적당히 바꾸길 바란다. 특히 parallels 계정의 home directory는 자신의 home 에 맞게 바꿔야 한다. 

parallels@ubuntu $ mkdir -p ~/src/RaspberryPi/toolchain 
parallels@ubuntu $ cd ~/src/RaspberryPi/toolchain 
parallels@ubuntu : ~/src/RaspberryPi/toolchain $ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.17.0.tar.bz2 
parallels@ubuntu : ~/src/RaspberryPi/toolchain $ tar xjf crosstool-ng-1.17.0.tar.bz2 
parallels@ubuntu : ~/src/RaspberryPi/toolchain/crosstool-ng-1.17.0 $ cd crosstool-ng-1.17.0
parallels@ubuntu : ~/src/RaspberryPi/toolchain/crosstool-ng-1.17.0 $ mkdir -p ~/local/crosstool-ng 
parallels@ubuntu $ ./configure --prefix=/home/parallels/local/crosstool-ng
parallels@ubuntu : ~/src/RaspberryPi/toolchain/crosstool-ng-1.17.0 $ ./configure --prefix=$HOME/local/crosstool-ng
parallels@ubuntu : ~/src/RaspberryPi/toolchain/crosstool-ng-1.17.0 $ make 
parallels@ubuntu : ~/src/RaspberryPi/toolchain/crosstool-ng-1.17.0 $ make install 
parallels@ubuntu : ~/src/RaspberryPi/toolchain/crosstool-ng-1.17.0 $ export PATH=$PATH:$HOME/local/crosstool-ng/bin/
parallels@ubuntu : ~/src/RaspberryPi/toolchain/crosstool-ng-1.17.0 $ unset LD_LIBRARY_PATH
parallels@ubuntu : ~/src/RaspberryPi/toolchain/crosstool-ng-1.17.0 $ mkdir -p ~/src/RaspberryPi/staging
parallels@ubuntu $ cd ~/src/RaspberryPi/staging/

  Menuconfig tool 을 사용하여보자.

parallels@ubuntu : ~/src/RaspberryPi/staging $ ct-ng menuconfig
  •  Paths and misc options -> Try features marked as EXPERIMENTAL 선택                                     -> Prefix Directory (NEW) ->  ${HOME}/local/x-tools/${CT_TARGET}
  • Target options -> Target architecture -> arm
  • Operating System -> Target OS -> linux
  • Binary utilities -> binutils version -> 2.21.1a
  • C compiler -> Show Linaro versions (EXPERIMENTAL) 선택-> gcc version -> linaro-4.7-2012.10 (EXPERIMENTAL)                 -> C++ 선택
    * cross tool-NG 1.18.0 이상버전의 경우, gcc version (linaro-4.8-2013.06-1) → ” linaro-4.7-2013.06-1 ” 로 변경 할 것.

 

 Cross-tools-NG 를 build하자.

parallels@ubuntu : ~/src/RaspberryPi/staging $ time ct-ng build

 arm용 gcc를 사용하기 위해 PATH설정을 하자.

parallels@ubuntu : ~/src/RaspberryPi/staging $ cd $HOME/local/x-tools/arm-unknown-linux-gnueabi/bin 
parallels@ubuntu : ~/src/RaspberryPi/staging $ export PATH=$PATH:$HOME/local/x-tools/arm-unknown-linux-gnueabi/bin

 ct-ng 설치가 완료되었다. 간단한 c소스로 컴파일 하여 보자.

parallels@ubuntu $ cd ~
parallels@ubuntu $ vi hello.c
#include <stdio.h>
 
int main(){
    printf(“Hello World\n”);
    return 0;
}
parallels@ubuntu $ arm-unknown-linux-gnueabi-gcc hello.c -o helloworld
parallels@ubuntu $ file helloworld
 Hello: ELF 32-bit LSB executable, ARM ...

 

2. Ubuntu, Raspbian에 distcc 설치

2.1 Ubuntu, Raspbian 양쪽 모두 진행

의존성의 설치
pi@raspberrypi~$ wget https://toolbox-of-eric.googlecode.com/files/libiberty.tar.gz 
pi@raspberrypi~$ tar -xvf libiberty.tar.gz 
pi@raspberrypi~$ cd libiberty 
pi@raspberrypi~$ ./configure 
pi@raspberrypi~$ make 
pi@raspberrypi~$ sudo make install 
 distcc 설치
 
pi@raspberrypi~$ cd ~
pi@raspberrypi~$ apt-cache show distcc 
 distcc의 3.1버전에서는 DISTCC_IO_TIMEOUT 값이 300seconds 로 고정되어 있다고 한다. 그래서 IO Time out 이 발생하는 버그가 있다. 3.2 버전을 사용하기를 권고하는 것 같다. source code로 compile 설치하자.
 
pi@raspberrypi~$ sudo apt-get install subversion autoconf automake python python-dev 
pi@raspberrypi~$ svn checkout http://distcc.googlecode.com/svn/trunk/ distcc-read-only 
pi@raspberrypi~$ cd distcc-read-only 
pi@raspberrypi~$ ./autogen.sh 
 GUI 환경에서 리소스 상태를 보기 위해서는 libgtk가 필요하다.
pi@raspberrypi~$ sudo apt-get install libgtk2.0-dev 

 gtk를 사용하기 위한 configure 로 compile 해보자.

pi@raspberrypi~$ ./configure --with-gtk && make && sudo make install
P.S : ubuntu 14.04LTS 의 경우, compile 을 진행 시, 아래와 같은 compile error 를 만날 수 있다. 
         이는 Arm 계열의 SoC 와의 문제라는 내용을 발견하게 되어 configure 명령어를 사용 시 –disable-Werror 옵션을
         추가 함으로써 해결을 하였다.
cc1: all warnings being treated as errors
make: *** [lzo/minilzo.o] Error 1
 
아래의 명령어로 현재 gcc를 어떤 것을 사용하는지 보자.
pi@raspberrypi~$ which gcc
/usr/bin/gcc
 distcc는 어디에 있는지 보자.
pi@raspberrypi~$which distcc
/usr/local/bin/distcc
2.2 Raspbian 에 진행
 위의 /usr/bin 의 gcc를 사용하는 것을 distcc로 사용하도록 바꿔보자.
 
pi@raspberrypi~$ sudo ln -s /usr/local/bin/distcc /usr/local/bin/gcc 
pi@raspberrypi~$ sudo ln -s /usr/local/bin/distcc /usr/local/bin/cc 
pi@raspberrypi~$ sudo ln -s /usr/local/bin/distcc /usr/local/bin/g++ 
pi@raspberrypi~$ sudo ln -s /usr/local/bin/distcc /usr/local/bin/c++ 
pi@raspberrypi~$ sudo ln -s /usr/local/bin/distcc /usr/local/bin/cpp
export PATH=/usr/local/bin:$PATH
 user가 사용하는 gcc의 위치가 바뀌었다.
pi@raspberrypi~$ which gcc
/usr/local/bin/gcc
 이후에도 항상 사용하기 위해서는 .bashrc에 적어두는 것이 좋다.
 추가로 DISTCC에 대한 옵션을 넣을 것이다.
pi@raspberrypi~$ vi .bashrc
export PATH=/usr/local/bin:$PATH 
# The remote machines that will build things for you. Don't put the ip of the Pi unless 
# you want the Pi to take part to the build process. 
# The syntax is : "IP_ADDRESS/NUMBER_OF_JOBS IP_ADDRESS/NUMBER_OF_JOBS" etc... 
# The documentation states that your should set the number of jobs per machine to 
# its number of processors. I advise you to set it to twice as much. See why in the test paragraph. 
# For example: 
export DISTCC_HOSTS="192.168.0.48/16"  
# When a job fails, distcc backs off the machine that failed for some time. 
# We want distcc to retry immediately 
export DISTCC_BACKOFF_PERIOD=0 

# Time, in seconds, before distcc throws a DISTCC_IO_TIMEOUT error and tries to build the file 
# locally ( default hardcoded to 300 in version prior to 3.2 ) 
export DISTCC_IO_TIMEOUT=3000 

# Don't try to build the file locally when a remote job failed 
export DISTCC_SKIP_LOCAL_RETRY=1 
bash를 적용하기 위해 console창을 재접속한다.
 
2.3 Ubuntu 에 진행
 
 ubuntu에서는 gcc를 arm gcc로 사용하도록 링크시켜보자.

parallels@ubuntu $ cd $HOME/local/x-tools/arm-unknown-linux-gnueabi/bin
parallels@ubuntu $ sudo ln -s arm-unknown-linux-gnueabi-gcc gcc 
parallels@ubuntu $ sudo ln -s arm-unknown-linux-gnueabi-cc cc 
parallels@ubuntu $ sudo ln -s arm-unknown-linux-gnueabi-g++ g++ 
parallels@ubuntu $ sudo ln -s arm-unknown-linux-gnueabi-c++ c++ 
parallels@ubuntu $ sudo ln -s arm-unknown-linux-gnueabi-cpp cpp
path를 설정하여 어디서는 gcc를 사용하도록 하자.
export PATH=$HOME/local/x-tools/arm-unknown-linux-gnueabi/bin:$PATH
 user가 사용하는 gcc의 위치가 바뀌었다.
parallels@ubuntu $ which gcc
/home/parallels/local/x-tools/arm-unknown-linux-gnueabi/bin/gcc

3. distcc로 Compile

 ubuntu에서 distccd 를 실행하여 파이의 접속을 대기한다.
parallels@ubuntu $ distccd --daemon --jobs 16 --allow 192.168.0.0/24 --verbose --log-stderr --no-detach
 대기 IP를 192.168.0.0/24 로 설정해서 동일 대역대의 모든 아이피가 접속하도록 하였다.
 
 파이에서 컴파일을 진행한다.
 
 테스트 해본 mysql cluster 를 컴파일 하는 과정은 다음과 같았다. 특별한 옵션 없이 Raspberry Pi 단일 컴파일 명령어로 실행하면 된다.
pi@raspberrypi~$ cmake .
pi@raspberrypi~$ make -j8

 

[참고사이트]

http://jeremy-nicola.info/portfolio-item/cross-compilation-distributed-compilation-for-the-raspberry-pi/

http://www.kitware.com/blog/home/post/426

산딸기마을 포스트 검색

공동제작 공동프로젝트 무상후원 기관

산딸기마을 기부하기

산딸기마을 방문자 현황

Flags Countries Visits Page views
South Korea 626063 1845660
United States 10882 26091
Japan 5011 13204
Germany 2755 5151
India 1897 2902
Canada 1729 4640
United Kingdom 1596 2642
Australia 1240 2901
Russia 1219 1677
China 1077 2239
Total Pageviews: 1936700