[dockcross] Docker를 이용한 크로스 컴파일 툴체인 이용하기 Develop Tip

라즈베리파이 버전3 모델B는 CPU 아키텍쳐가 ARM 버전 7 (ARMv7) 이었습니다.

좀 더 구체적으로 어떤 임베디드 장비가 있었는데,

$ cat /proc/cpuinfo

를 해 보았더니 CPU type이 유사하여
라즈베리 파이에서 

$ cat hello.c
#include <stdio.h>
main()
{
        printf("Hello world for dockcross!n");
        return 0;
}

와 같은 파일을 컴파일러가 있는 라즈베리파이에서 정상적으로 컴파일 하여,

$ gcc -o hello hello.c

그 hello를 임베디드 시스템에 복사하여 실행하였더니 
안되는 것이었습니다.

이리 저리 해 보다,

$ gcc -static -o hello hello.c

와 같이 static 으로 build를 하여 build한 libc 라이브러리가 통째로 들어가
설령 다른 버전의 libc 가 깔려있어도 실행이 되는 것이었습니다.

크로스 컴파일을 안해도 되니 얼마나 다행이었는지 모르겠다고 생각했습니다.

그런데 이번에 갑자기 장비가 다른 것으로 바뀌어 동일하다고 생각하였던
CPU가 ARMv7에서 ARMv5로 변경된 것이었습니다.

아주 슬프게도 어렵게 build 해 놓았던 CPython과 다른 C 소스가 모두 안 돌아
가는 것이었습니다.

급하게 다시 크로스 컴파일을 할 생각을 하니 경험도 없고 눈이 꼭꼭 감겼습니다.

하지만 호랑이굴에 잡혀가도 정신을 똑바로 차리라고 했다고,
구글신께 간청하니 다음과 같은 행운이 보여주셨습니다.

이 기회를 빌어 dockcross 를 만든 분께 감사인사 드립니다.

지원되는 크로스 컴파일 환경을 보니,

우왕! 안드로이드 ARM 을 포함하여 ARM, PPC 등등 (심지어 윈도우 까지) 만들어 놓은 것이었습니다.

다음은 간단히 사용 방법입니다.

위의 Hello 를 ARMv5에서 돌려보려면,

다음과 같이

$ cat build_armv5.sh
#!/bin/bash
ARCH=armv5
docker run --rm dockcross/linux-${ARCH} > dockcross-linux-${ARCH}
chmod +x dockcross-linux-${ARCH}
dockcross-linux-${ARCH} bash -c '$CC hello.c -o hello'

만들어 실행하면 아주 잘 만들어 졌습니다.

문제는 CPython 2.7.13 을 소스째 만들어 보는 것인데,
이전에 했던 시행착오와 비슷하여 몇가지 문제를 제외하고
기본적인 파이썬 스크립트는 잘 동작하였습니다.

해당소스를 참조하시는데,
build_python2.sh 를 특정 폴더에서 실행시키는데,
config.site와 Modules.Setup 파일을 같은 곳에 위치시키면 됩니다.

미리 $HOME/opt 를 만들어 놓습니다.
크로스 컴파일 된 결과는 위의 폴더에 만들어 집니다.

만들어진 dockcross-linux-armv5 스크립트에서 
EXTRA_VOLUMES 를 추가하여 위의 폴더를 /opt 로 만들고
모든 .Configure 에서 --prefix /opt 식으로 지정하였습니다.

이렇게 어려운 build 과정을 맥이나 윈도우 리눅스 상관없이 docker 만 설치되어 있으면
자동화 할 수 있다니... 정말로 DevOps 가 이제는 손에 잡히는 것 같습니다.


어느 분께는 도움이 되셨기를...

덧글

  • KHT 2018/10/09 00:39 # 삭제 답글

    찾고있던 글이였습니다. 맨 마지막 줄의 어느분이 저였네요. 정말감사합니다 ^^
  • 지훈현서아빠 2018/10/09 13:26 #

    도움이 되셨다니 저의 보람입니다~ ^^
댓글 입력 영역

구글애드텍스트