Build Root

Embed Size (px)

Citation preview

Seminrio Linux Embarcado 2011

Linux from Scratch com BuildrootSergio Prado Agosto/2011

Quem sou eu?

Mais de 14 anos de experincia em desenvolvimento de software para sistemas embarcados, em diversas arquiteturas de CPU (ARM, PPC, MIPS, x86, 68K), atuando em projetos com Linux embarcado e sistemas de tempo real. Scio da Embedded Labworks, onde atuo com consultoria e desenvolvimento de sistemas embarcados. Blog pessoal sobre Linux e Sistemas Embarcados em www.sergioprado.org.

Introduo

No blog: Sergio, eu estava comeando a estudar Linux embarcado, mas apareceu uma dvida, onde fica o main()?

Introduo

Linux e a revoluo do software livre

Liberdade Inovao

Comunidade

Colaborao

Flexibilidade

Introduo

Milhares de aplicaes de cdigo aberto disponveis!

Sugesto de Leitura: The Cathedral & The Bazaar Eric S. Raymond

Introduo

Criou-se uma situao onde temos centenas de milhares de pequenas solues procurando por um grande problema...

Introduo

E ento, para resolver os nossos grandes problemas, comeamos a usar Linux em dispositivos embarcados...

O desafio: integrar tudo isso

O desafio: integrar tudo isso

u-boot.bin

uImage

rootfs.jffs2

O desafio: integrar tudo isso

Soluo 1: Usar uma distribuio pronta

Debian, por exemplo, esta disponvel para diversas arquiteturas como x86, ARM, MIPS e PPC. Mas, e se no suportar sua plataforma? Mas, e se voc precisar customizar? Falta flexibilidade!

O desafio: integrar tudo isso

Soluo 2: Fazer tudo na unha

Fai fundo! E boa sorte! http://www.linuxfromscratch.org/

S no esquece de colocar uns 3 meses a mais no planejamento do seu projeto...

O desafio: integrar tudo isso

Soluo 3: Usar um sistema de build (buildsystem) Em 50 minutos, voc consegue gerar um sistema Linux completo!

O Sistema de Build

Atividades principais (pode depender da ferramenta)

Compilar e gerar o toolchain. Compilar e gerar a imagem do bootloader. Compilar e gerar a imagem do kernel. Compilar bibliotecas e aplicaes, resolver dependncias e gerar o sistema de arquivos (rootfs).

Conhecendo o Buildroot

http://www.buildroot.net

Desenvolvido pelos mantenedores da uClibc, e ficou durante um bom tempo sem nenhum mantenedor. Desde 2009, a partir da verso 2009.02, liberado a cada 3 meses.

Conhecendo o BuildrootImplementa um sistema automtico de build atravs de um conjunto de Makefiles:

Gera o toolchain. Gera a imagem do bootloader. Gera a imagem do kernel. Compila bibliotecas e aplicaes. Gera o rootfs.

Nosso projetoEmulando Atari com Linux embarcado

O kit mini2440FriendlyARM mini2440

ARM920T 400MHz 64MB RAM At 1G de Flash NAND USB, Ethernet, LCD Serial, E2PROM, etc

Nosso projetoDividiremos em 3 etapas:

1a. etapa: Sistema bsico com Linux embarcado. 2a. etapa: Adicionar o emulador Stella e suas dependncias. 3a. etapa: Ajustes no sistema de arquivos.

Iniciando com o BuildrootRequisitos

Toolchain (ARM, uClibc). Bootloader para a mini2440. Kernel para a mini2440. Rootfs com o emulador Stella.No boot, iniciar automaticamente o emulador. Emulador configurado de fbrica (joystick, ler ROMs do carto SD, etc).

1a. fase: Buildroot bsico

Baixar e descompactar o Buildroot em um diretrio de desenvolvimento:$wgethttp://buildroot.uclibc.org/downloads/buildroot2011.02.tar.bz2 $tarjxfvbuildroot2011.02.tar.bz2 $cdbuildroot2011.02/

1a. fase: Buildroot bsicoEstrutura bsica de diretrios

1a. fase: Buildroot bsicoComo configurar e compilar? $makemenuconfig $make

Parecido com o kernel do Linux. Pode-se usar tambm make xconfig ou make gconfig para configurar. Configurao salva em um arquivo .config no diretrio principal.

1a. fase: Buildroot bsico

1a. fase: Configurando a CPUO que iremos configurar aqui?

Informaremos ao buildroot que iremos compilar para uma CPU de arquitetura ARM920T.

1a. fase: Configurando a CPU

1a. fase: Configurando a CPU

1a. fase: ToolchainO que iremos configurar aqui?

Escolher a verso da biblioteca do sistema (o buildroot s suporta a uClibc). Escolher a verso do GCC. Escolher a verso e o local dos headers do kernel.

1a. fase: Toolchain1 2

3

1a. fase: Toolchain

1a. fase: Toolchain

1a. fase: Toolchain

1a. fase: BootloaderO que iremos configurar aqui?

Baixar e preparar o U-boot. Selecionar no Buildroot o bootloader U-Boot. Configurar informaes de compilao do U-boot.

1a. fase: BootloaderBaixar e preparar o U-Boot$gitclonegit://repo.or.cz/ubootopenmoko/mini2440.git $tarcjfvuboot.tar.bz2mini2440 $cpuboot.tar.bz2/dl

1a. fase: Bootloader

1a. fase: Bootloader2 1

3

1a. fase: KernelO que iremos configurar aqui?

Habilitar a gerao do kernel. Configurar a verso do kernel. Configurar o nome do arquivo de config do kernel. Configurar o formato da imagem a ser gerada. Baixar os fontes do kernel da mini2440.

1a. fase: Kernel1 2

3

1a. fase: Kernel

Baixar o kernel da mini2440 (linux-2.6.tar.bz2) e copiar para a pasta dl/ do buildroot.Baixar diretamente o tarball: http://www.sergioprado.org/wp-content/plugins/download-monitor/download.php?id=4 Baixar o repositrio git e gerar o tarball: https://github.com/sergioprado/Mini2440-Kernel

1a. fase: RootfsO que iremos configurar aqui?

Por enquanto, vamos manter habilitados os pacotes padro. Habilitar gerao do formato ext2 (facilita testes via NFS). Habilitar gerao do formato jffs2 e configurar informaes da memria flash.

1a. fase: Rootfs

1a. fase: Rootfs

1

2

1a. fase: Compilando

Salvar, sair e compilar: $make

E vai tomar um cafezinho!

1a. fase: 40 minutos depois$lsloutput/ total32 drwxrxrx33spradosprado40962011050923:42build drwxrxrx4spradosprado40962011050923:41host drwxrxrx2spradosprado40962011050923:42images lrwxrwxrwx1spradosprado1242011073011:04staging drwxrxrx2spradosprado40962011050923:18stamps drwxrxrx17spradosprado40962011050923:19target drwxrxrx10spradosprado40962011050923:11toolchain

1a. fase: ~45 minutos depois

$lsloutput/images/ total37340 rwrr1spradosprado157726722011080410:45rootfs.ext2 rwrr1spradosprado72066322011080410:47rootfs.jffs2 rwrr1spradosprado129331202011080410:47rootfs.tar rwxrxrx1spradosprado2489322011080410:33uboot.bin rwrr1spradosprado20682762011080410:44uImage

1a. fase: Gravando imagensOs procedimentos para gravar as imagens geradas dependem do seu hardware. Para o kit FriendlyARM mini2440, seguir este artigo: http://www.sergioprado.org/2010/08/30/mini2440linux-com-u-boot-e-emdebian/

2a. fase: Adicionando o StellaO que iremos fazer aqui?

Configurar o Buildroot com os pr-requisitos do Stella:

Linux 2.6 (OK!). Toolchain com GNU C++ (precisamos habilitar). SDL V1.2.10 ou maior (precisamos habilitar).

Adicionar o pacote do Stella no Buildroot.

2a. fase: Habilitando suporte C++

1

2a. fase: Habilitando suporte SDL1

2a. fase: Adicionando pacote Stella

Objetivo: uma opo para habilitar o Stela dever estar disponvel em:PackageSelectionforthetarget> Games> [*]stella

2a. fase: Adicionando pacote Stella

A configurao dos pacotes suportados pelo Buildroot ficam no diretrio packages, portanto criaremos um novo diretrio para o Stela em:$mkdirppackages/games/stella

2a. fase: Adicionando pacote Stella

Dentro deste diretrio precisamos ter pelo menos estes arquivos:

Config.in: Informaes do pacote stella.mk: Instrues para compilao

Alm destes, podemos criar arquivos que podero ser usados na compilao, como Makefiles e arquivos de patch.

2a. fase: Adicionando pacote Stella

#packages/games/stella/Config.in configBR2_PACKAGE_STELLA bool"stella" dependsonBR2_PACKAGE_SDL&&BR2_PACKAGE_LIBPNG help AmultiplataformAtari2600VCSemulator. http://stella.sourceforge.net/

2a. fase: Adicionando pacote Stella############################################################# # #packages/games/stella/stella.mk # ############################################################# STELLA_VERSION:=3.2.2 STELLA_SOURCE:=stella$(STELLA_VERSION)src.tar.gz STELLA_SITE:=http://downloads.sourceforge.net/project/stella/stella/ (STELLA_VERSION)/ STELLA_INSTALL_STAGING=YES STELLA_DEPENDENCIES=sdlsdl_imagesdl_soundzliblibpng STELLA_PKG_DIR:=../../../package/games/stella defineSTELLA_CONFIGURE_CMDS (cd$(@D);./configuredisablegldisabledebuggerdisablewindowed CXX="$(TARGET_CXX)"CXXFLAGS="$(TARGET_CXXFLAGS)") cp$(@D)/$(STELLA_PKG_DIR)/config.mak$(@D) patchp1d$(@D)0){ button=(sample.pressure>0)?1:0; button