Yocto - do_populate_sdk()

markyang92·2022년 3월 24일
0

yocto

목록 보기
34/53
post-thumbnail

do_populate_sdk()

  • SDK 생성

    • do_populate_sdk(), do_populate_sdk_ext()를 통해 SDK를 쉽게 구성할 수 있다.
      • /build/tmp/deploy/sdk/*.sh로 만들어 지고, 해당 파일만 있다면 개발자는 Cross-compile 환경을 쉽게가져갈 수 있다.
  • SDK(Software Development Kit): 개발과 디버깅을 하기 위한 파일과 toolchain 모음
    • toolchain: compiler, linker, debugger, 외부 라이브러리 헤더, utility, apps..
  1. Custom Source, lib(usb|gl)과 같은 외부 라이브러리런타임 빌드에 사용된다.
    1.1. Custom Source: 라이브러리 헤더 파일을 이용해 빌드
    1.2. 실행될 때 바이너리는 특정 위치로 이동 될 수 있다.
  2. 빌드 시점에서 사용되는 파일들은 포키 SDK의 일부로, sysroot에 있다.
  3. native toolchain: 포키가 bitbake를 이용해 task를 실행할 때, 타깃을 위한 바이너리를 컴파일하고 링크하기 위해 툴체인이 필요하다. 이러한 툴체인은 빌드 시스템 내부에서 사용되기 때문에, 내부 툴체인이라 부른다.
  4. 포키는 외부에서 사용할 수 있는 툴체인을 만들 수 있다. 설치된 환경과 무관하게 컴퓨터에 설치할 수 있는 SDK패키지를 만든다. 추가로 설치된 툴체인은 내부 툴체인과 호환가능하다. 툴체인 외에도 SDK는 목적에 맞게 헤더와 라이브러리 파일을 제공할 수 있다.

  • 이미지 기반 SDK만들기
$ bitbake core-image-full-cmdline -c populate_sdk
  • 이 명령으로 core-image-full-cmdline 이미지 레시피 기반을 둔 SDK가 만들어진다.
    SDK는 여기서 MACHINE의 아키텍처로 생성된다.
  • 빌드 된 후, 바이너리 스크립트가 생성된다.
    • native: x86_64
    • MACHINE: quemuarm64
    • 경로: ${TMPDIR}/deploy/sdk/poky-glibc-x86_64-core-image-full-cmdline-aarch64-qemuarm64-toolchain-3.1.13.sh
      이 생성된 스크립트는 사용하기 전에 설치해야한다.


sdk/*.sh

poky-glibc-x86_64-'image'-aarch64-qemuarm64-toolchain.3.1.13.sh

  • 위 이미지에서 만든, ${TMPDIR}/deploy/sdk/poky-glibc-x86_64-core-image-full-cmdline-aarch64-qemuarm64-toolchain-3.1.13.sh를 실행한다.
  • 이 예제에서 설치되는 디렉토리는 /opt/poky/3.1.13이다. 하지만 원하는 디렉토리를 설정 할 수도 있다.

  • 설치가 완료되면, 설치된 디렉토리(/opt/poky/3.1.13)에 아래의 파일 및 디렉토리가 생성된다.
install filedescription
1. environment-setup-aarch64-poky-linux툴체인을 사용하기 위해 필요한 모든 환경 변수의 설정을 위해 사용
2. site-config-aarch64-poky-linux툴체인 생성에 사용되는 변수들을 담고 있는 파일
3. sysrootsSDK 생성을 위해 사용된 이미지 rootfs 디렉토리의 복사본
다음과 같은 하위 디렉토리는 바이너리, 헤더, 라이브러리 파일들을 포함한다.
  • aarch64-poky-linux: ARM 머신을 위한 파일들 포함
  • x86_64-pokysdk-linux: x86_64 머신 호환 파일들 포함
4. version-armv5te-poky-linux-gnueabi버전과 타임스탬프 정보

  • environment-setup-aarch64-poky-linuxsource 명령어로 현재 쉘에 적용 시켜 보자.
$ source ./environment-setup-aarch64-poky-linux
$ echo ${CC}
aarch64-poky-linux-gcc  -march=armv8-a+crc -fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/opt/poky/3.1.13/sysroots/aarch64-poky-linux
$ echo ${LD}
aarch64-poky-linux-ld  --sysroot=/opt/poky/3.1.13/sysroots/aarch64-poky-linux
$ echo ${LDFLAGS}
-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -fstack-protector-strong -Wl,-z,relro,-z,now
  • 엄청나게 쉽게, 툴체인이 환경변수로 적용되어있다.
  • 커스텀 애플리케이션을 빌드하기 위해 SDK를 사용해본다.
  • hello_world.c를 예로 들어, ARM 아키텍처를 타깃으로 빌드한다.
$ source /opt/poky/2.4/environment-setup-armv5e-poky-linux-gnueabi
$ ${CC} hello_world.c -o hello_world

생성된 바이너리가 원하는 타깃 이키텍처에 맞게 생성됐는지 확인 하려면 다음과 같이 입력한다.

$ file hello-world
hello-world: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0,
BuildID[sha1]=ce9b7..., not stripped

일반적으로 이용하는 또다른 프로젝트는 리눅스 커널이다. 리눅스 커널은 LD 유틸리티를 이용해 링킹을 하기 때문에 GCC를 사용해 정의한 기본 값으로 unset을 사용해 LDFLAGS 변수를 재설정해야한다. 리눅스 커널 소스코드를 빌드하려면 다음 명령을 이용하면된다.

$ source /opt/poky/2.4/environment-setup-armv5e-poky-linux-gnueabi
$ unset LDFLAGS
$ make defconfig
$ make zImage
  • Yocto 프로젝트 확장(Extensible) SDK(eSDK)를 사용하면 개발자가 프로젝트 개발 기간동안 기존 SDK 환경을 업데이트하고 확장할 수 있기 때문에 분산된 개발을 할 수 있다. eSDK를 잘 사용하려면, sstate-cache 미러와 eSDK서버와 같은 인프라 설정이 필요하다.

cmake

$ find /opt/poky/2.4/ -iname "*cmake*" 2> /dev/null
/opt/poky/2.4/sysroot/<arch>/usr/share/cmake/OEToolchainConfig.cmake
  • project
$ tree ./cmake-hello-world
CMakeLists.txt
main.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(cmake-hello-world-cpp)
add_executable(${PROJECT_NAME} "main.cpp")

main.cpp

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello World!" << endl;
    return 0;
}

build

$ mkdir build
$ cd build
$ cmake -DCMAKE_TOOLCHAIN_FILE=/opt/poky/2.4/sysroot/<arch>/\
usr/share/cmake/OEToolchainConfig.cmake ..

build!
$ make

meta-toolchain

  • 범용적 SDK: meta-toolchain
  • SDK를 만드는 다른 방법은 크로스컴파일러, 디버그 도구, 기본 헤더와 라이브러리를 포함하는 범용적 SDK를 만드는 것이다. 이를 meta-toolchain이라고 부른다.
    보통 커널, 부트로더의 개발과 디버그를 위해 이용한다.
    이를 만들기 위해선, 아래의 명령을 사용한다.
$ bitbake meta-toolchain
  • qemuarm 머신을 위한 결과:
    • build/tmp/deploy/sdk/poky-eglibc-x86_64-meta-toolchain-aarch64-toolchain-3.1.13.sh에 의해 생성된다.
    • 설치 과정은 이미지 기반의 SDK와 동일하다.
  • 이 SDK가 유용하지만, 애플리케이션 용도에 맞는 커스텀 이미지를 만들고 이를 기반으로 SDK를 만드는 것을 권장한다.

타깃에서 애플리케이션 개발

  • Embedded System에서 어쩔 수 없이 개발을 해야하는 경우.. 혹은 디버깅을 해야하는 경우!
  1. Target시스템에서 외부 툴체인을 이용해 개발 이미지를 만드는 것이다.
    1.1. 개발 이미지.h 파일과, 라이브러리 링크 로 구성된다.
    1.2. 개발 이미지는 커스텀 애플리케이션을 위한 빌드 환경을 제공하고, 커스텀 툴체인이나 Yocto 프로젝트 외부 툴체인과 함께 사용될 수도 있다.
    1.3. 아래의 구문으로 이미지에 기능을 넣을 수 있다.
    참고로 dev-pkgs는 모든 ${PN}-dev 패키지를 이미지에 설치한다.
    IMAGE_FEATRUES += "dev-pkgs"
    1.4. local.conf 에서 기능을 넣고 싶은 경우 아래와 같이 한다.
    EXTRA_IMAGE_FEATRUES += "dev-pkgs"
  1. 생성 결과 이미지는 헤더 파일들과 추가 라이브러리 링크를 포함하고, 이는 커스텀 애플리케이션 개발에 이용할 수 있다.
    2.1. 커스텀 애플리케이션은 이 루트 파일 시스템이미지를 이용해 개발하고, 이 이미지 자체는 매번 재생성할 필요가 없다.

native build

  • native build 는 포키 환경설정을 통해 SDK이미지를 만들 수 있다.

    • 이 이미지는 툴체인과 개발용 패캐지(헤더, 라이브러리)를 포함한다. 즉, 이를 이용해 실제 환경에서 커스텀 애플리케이션을 빌드, 실행, 테스트, 디버깅할 수 있다.

    개발 도구를 이미지에 포함시키기 위해서는 tools-sdk 기능을 IMAGE_FEATURES에 포함(물론 local.conf에서 포함할 경우 EXTRA_IMAGE_FEATRUES 사용)


nativesdk-packagegroup-sdk-host.bb

openembedded-core 레이어에서 meta/recipes-core/packagegroups/nativesdk-packagegroup-sdk-host.bb 가 가장 뼈대가 되는 native-sdk 인데,

사용할 이미지에서 이거 .bbappend 쳐서 RDEPENDS로 패키지 넣고 뺄 것


meta-environment.bb

openembedded-core 레이어에서 meta/recipes-core/meta/meta-environment.bbpopulate_sdk로 설치되는 쉘 설정 등을 할 수 있다.

  • before do_install after do_compile

toolchain_create_sdk_env_script

  • in openembedded-core/meta/classes/toolchain-scripts.bbclass
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글