Home » 산딸기 가지고 놀기 » 라즈베리파이 활용강좌 : 라즈베리파이 맥에서 distcc로 크로스컴파일 하기(Raspberrypi Crosscompile on Mac OS X)

라즈베리파이 활용강좌 : Raspberry Pi Crosscompile on Mac OS X

 

Created Date: 2013.12.03

Modified Date: 2013.12.03

revision 1.0

 

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

Raspberry Pi(Raspberry Pi 뿐 아니라 다른 arm core도..) 를 사용하다보면 Compile 을 필요로 할때가 많이 있습니다.

이게 정말 귀찮은 일인데요. 무엇보다 CPU가 저사양이다 보니 속도가 어마어마 합니다.

OS, DB, openCV 등은 기본이 8시간이고 그러네요.

개인적으로는 “이런데 시간을 쓰느니 패키지 설치하고 말자” 주의 이지만 결국에는 사용하게 되더군요.

Virtual Machine 등에 Linux를 사용하는 방법도 있지만 저는 맥을 사용하는 중이라 있는것 쓰려고 맥에 바로 설치했습니다.

Linux용은 생략하겠습니다.

 

0. Apple Developer ??

 이 포스트를 실행하기 위해서는 command tool이 있어야 합니다.

그러기 위해서는 애플개발자 등록이 되어야 하는것 같습니다. (확실하진 않습니다만, 다들 로그인 하라고 합니다.)

xcode 를 설치하고 command tool 이 있어야 하고, command tool에서 작업해야 합니다.

다른 터미널프로그램은 안되는것 같습니다.

 

1. Just Run a Script.

https://github.com/ptoinson/crosstool-arm-osx

 ptoinson 이라는 분이 친절하게 스크립트를 만들어주었다. 이게 완전 “So, Cool”.

말 그대로다. “Clone it, and Just run!!”

srHanMacMini $ git clone https://github.com/ptoinson/crosstool-arm-osx.git 
srHanMacMini $ cd crosstool-arm-osx 
srHanMacMini $ bash build.sh

 실행 중 GUI 화면이 나오는데, 그냥 빠져 나오면 된다. 이미 설정이 다 되어있다.  한 가지만 더,  arm-linux-gnueabihf-g++ 파일을 어디서는 실행할 수 있게 PATH를 설정해 주자.

srHanMacMini $ cd ~ 
srHanMacMini:~ $ vi .profile
 아래의 라인을 추가하자.
 
# PATH for CrossTool 
export PATH=/Volumes/CrossTool2NG/install/arm-unknown-linux-gnueabi/bin:$PATH
 
2. Test
 HelloWorld.cpp 를 컴파일해 보자.
srHanMacMini $ vi HelloWorld.cpp
#include <iostream> 
using namespace std; 
int main () { 
 cout << "Hello World!"; 
 return 0; 
}
srHanMacMini $ arm-linux-gnueabihf-g++ HelloWorld.cpp -o HelloWorld
 HelloWord file을 osx상에서 실행하면 에러가 뜰 것이고, Raspberry Pi에 복사해서 실행하면 정상적으로 실행된다.
 
 
3. 실전
 
( 3. 부분은 참고만 하시기 바랍니다. 이를 실행하기 위해서는 Raspberry Pi의 lib등 을 PC에 복사해서 진행해야 합니다.(아마도..)
  4. 에 더 훌륭한 기능이 있으니 4. 를 사용하는게 좋은 것 같습니다. )
 
 cmake가 필요하다.
 
srHanMacMini $ brew install cmake
 
 Raspberry Pi 용 Toolchain file을 제공하고 있다.
 
srHanMacMini:~ $ mkdir crosstest 
srHanMacMini:~ $ cd crosstest 
srHanMacMini:~ $ vi Toolchain-RaspberryPi.cmake

# this one is important
SET(CMAKE_SYSTEM_NAME Linux)
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)
# specify the cross compiler
SET(CMAKE_C_COMPILER /Volumes/CrossTool2NG/install/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER /Volumes/CrossTool2NG/install/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /Volumes/CrossTool2NG/install/arm-unknown-linux-gnueabi)
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

4. distcc 를 통한 Raspberry Pi 에서의 Compile
 
4.1 Raspberry Pi Side
 의존성의 설치
pi@raspberrypi~$ wget https://toolbox-of-eric.googlecode.com/files/libiberty.tar.gz 
pi@raspberrypi~$ sudo tar -xvf libiberty.tar.gz 
pi@raspberrypi~$ cd libiberty 
pi@raspberrypi~$ sudo ./configure 
pi@raspberrypi~$ sudo make 
pi@raspberrypi~$ sudo make install 
 distcc 설치
pi@raspberrypi~$apt-cache show distcc 
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
 아래의 명령어로 현재 gcc를 어떤 것을 사용하는지 보자.
pi@raspberrypi~$which gcc
/usr/bin/gcc
 distcc는 어디에 있는지 보자.
pi@raspberrypi~$which distcc
/usr/local/bin/distcc
 위의 /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에 대한 옵션을 넣을 것이다. DISTCC_HOSTS에는 OSX의 IP를 입력한다.
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.10/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 
 4.2 OSX Side
 distcc 설치
srHanMacMini $ brew install distcc 
 gcc Link 환경 설정
srHanMacMini $ cd /Volumes/CrossTool2NG/install/arm-unknown-linux-gnueabi/bin 
srHanMacMini $ ln -s arm-linux-gnueabihf-gcc gcc 
srHanMacMini $ ln -s arm-linux-gnueabihf-gcc cc 
srHanMacMini $ ln -s arm-linux-gnueabihf-c++ c++ 
srHanMacMini $ ln -s arm-linux-gnueabihf-cpp cpp 
srHanMacMini $ export PATH=/Volumes/CrossTool2NG/install/arm-unknown-linux-gnueabi/bin:$PATH 
srHanMacMini $ which gcc
 /Volumes/CrossTool2NG/install/arm-unknown-linux-gnueabi/bin/gcc
 4.3 Running Make
OSX에서 실행 명령이다. 16개의 쓰레드를 생성하여 대기하고, 192.168.0.101 IP 의 접속에만 응답하도록 하였다.
필자는 192.168.0.0/24 를 적어서 동일 망 내의 모든 Raspberry Pi를 연결하였다.
 srHanMacMini $ distccd --daemon --jobs 16 --allow 192.168.0.101 --verbose --log-stderr --no-detach
Raspberry Pi 에서는 기본 명령어로 컴파일 하면 되겠다. 작업시간을 체크하기 위해 time 명령어를 추가했다.
pi@raspberrypi~$ time cmake . 
pi@raspberrypi~$ time make -j8
컴파일 시간을 체크해보았다. mysql cluster source로 테스트 하였다.
cmake 의 완료시간은 6-7분으로 차이가 없었다.
make 의 완료시간은 파이 단독으로 컴파일할 때 295m45.290s, 1대의 파이를 컴파일 할 때 28m21.637s, 4대의 파이를 컴파일 할 때 32m36.566s 가 걸렸다.
결과적으로 10배의 시간이 절약되었다.

2 Replies to “라즈베리파이 활용강좌 : 라즈베리파이 맥에서 distcc로 크로스컴파일 하기(Raspberrypi Crosscompile on Mac OS X)”

  1. Yoonseok Pyo 댓글:

    꾀 늦은시간인데 수고 많으십니다. ^^

    1. 팬더골드 댓글:

      ㄷ ㄷ ㄷ 제가 할 말이네요..
      미리 써둔거고 회식 다녀와서 조금 손보고 올린거에요..^^

Comments are closed.

산딸기마을 포스트 검색

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

산딸기마을 기부하기

산딸기마을 방문자 현황

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