티스토리 뷰

Yocto를 이용하여 임베디드 리눅스 시스템을 개발하는 경우 개발중인 소스 코드를 recipe에 포함해서 이미지를 만들려고 할 때 어떻게 하는 것이 좋을지 고민된다. 가장 쉬운 방법은 일단 bitbake 빌드를 한 후 tmp/work 내의 해당 패키지의 소스를 수정하여 bitbake compile 부터 재실행하는 것이다. 하지만 이와 같이 수정해서 빌드 하는 방식은 여러모로 편하지 만은 않다. 특히나 잘못해서 동일한 recipe가 업데이트 되거나 bitbake compile 이전(patch, fetch, configure, …) task를 실행하면 수정한 코드가 모두 사라지는 심각한 상황이 될 수도 있다. 아니면 recipe의 SRC_URI를 매번 수정하여야 하는데 이 방법도 아직 최종 검증이 안된 코드를 git commit하여야 하거나, 매번 변경시마다 configure, compile을 다시 하여야 하는 불편함이 있다. 


이와 같은 경우를 위하여 제공되는 기능이 EXTERNALSRC 이다. 관련 설명은 Yocto Project Devleopment Manual의 아래 절에 나와 있다. 

5.16 Building Software from an External Source


사용법은 간단한다. linux_imx kernel 패키지를 개발중인 경우를 예를 들어 보면 아래와 같다. 

Build/conf/local.conf 에 아래와 같이 추가해 주면 된다. 


INHERIT += "externalsrc"

EXTERNALSRC_pn-linux-imx = "/home/aqwerf/project/linux-imx“

EXTERNALSRC_BUILD_pn-linux-imx  = "/home/aqwerf/project/linux-imx”


INHERIT는 externalsrc.bbclass를 추가한 것이고, 이 경우 해당 패키지의 fetch, unpack, patch task는 사용하지 않도록 되어 소스가 overwrite되거나 삭제되지 않도록 한다. 보통은 위와 같은 EXTERNALSRC, EXTERNALSRC_BUILD 둘 모두를 동일 디렉토리를 참조하도록 하여 빌드하면 된다. 

EXTERNALSRC는 빌드를 위한 yocto project 외부의 소스 디렉토리를 가리킨다. Bitbake 빌드 시 EXTERNALSRC는 S로 적용된다. EXTERNALSRC_BUILD는 compile 용 디렉토리로 외부 빌드를 하는 경우 EXTERNALSRC와 동일한 디렉토리를 지정하는 것이 편리할 수 있다. 이는 Bitbake 빌드 시 B에 적용된다. 


이와 같이 local.conf를 수정하고 bitbake를 수행하면 configure, compile task는 위의 지정된 외부 소스를 이용하여 수행된다. 물론 주의할 점은 이와 같이 하여도, 소스를 수정하고 ‘bitbake linux_imx’를 수행하여도 아무런 동작도 하지 않는다. Bitbake는 각 task(configure, compile, install 등)의 의존성을 관리하는 것이지, 해당 task의 소스 파일의 의존성은 알 수 없기 때문이다. 그러므로 다음과 같이 force 옵션을 주어 빌드하여야 한다. 


$ bitbake linux_imx -f -c compile && bitbake linux_imx


댓글
댓글쓰기 폼