Systems/Unix2010.10.27 09:17
autoconf를 통해 만들어진 소프트웨어를 cross-compiling하는 것은 생각보다 단순합니다. ./configure를 실행할 때 ./configure --target=mip64-linux 뭐 이런식으로 타겟 시스템 이름을 적어주면 됩니다. 물론 이때는 시스템에 크로스 컴파일링을 위한 mip64-linux-gcc 등이 깔려 있어야 합니다. 적어주지 않으면 그 때는 target 시스템은 host 시스템과 동일하게 간주되므로, 크로스컴파일링이 되지 않습니다.

문제는 컴파일하려는 대상 프로젝트가 다른 autoconf 프로젝트에 dependency를 가지고 있을 때인데, 이런 경우에는 피의존 프로젝트부터 순차적으로 크로스 컴파일링을 해야 합니다. 주의해야 할 점은 부모 프로젝트 (의존하는 프로젝트)가 자식 프로젝트(피의존 프로젝트)가 설치되어 있는지를 미리 찾아보고, 시스템에 설치되어 있지 않는 경우에는 configuration을 아예 포기한다는 점인데요. 이를 편리하게 우회하기 위해서는 약간의 꽁수를 부릴 필요가 있습니다.

먼저 피의존 프로젝트를 그냥 컴파일해서 설치합니다. 그러면 아마 /usr/local 밑에 해당 프로젝트가 깔릴 겁니다.

그런 다음에 피의존 프로젝트를 크로스 컴파일 해서 설치합니다. 이 때 prefix는 /usr/local이 아닌 다른 임의의 디렉토리로 지정합니다.

그런 다음 크로스 컴파일된 피의존 프로젝트의 바이너리를 /usr/local/lib과 /usr/local/bin 밑에 적절히 복사합니다.

그런 다음 부모 프로젝트를 크로스 컴파일합니다. 이 떄 prefix는 역시 /usr/local이 아닌 다른 임의의 디렉토리로 지정합니다.

만일 부모-자식 관계가 2단계 이상 길어지는 경우에는 위의 과정을 recursive하게 반복해주어야 합니다. 그러니 부모 프로젝트를 컴파일 할 때도 '그냥 컴파일'과 '크로스 컴파일'을 두 번 다 해주어야 합니다. 그래야 그 부모 프로젝트에 의존하는 '조부모' 프로젝트가 컴파일 될 수 있죠.

이런 삽질은 autoconf가 /usr/local 밑에 설치된 프로젝트를 자동으로 detect하고, 그 detection 과정을 override하기가 까다롭다는 점 때문에 발생합니다.

아무튼 위의 절차를 계속 반복하다 보면 크로스 컴파일 자체도 기계적인 과정이 되기 때문에, 아무리 큰 프로젝트라도 한 반나절 정도면 대충 크로스컴파일 할 수 있습니다.

물론 컴파일할 프로젝트들이 autoconf로 잘 packaging 되어 있다는 가정 하에서.
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^