2016-05-22 12 views
2

Meine Projektstruktur wie folgt aussieht:ein Makefile für ARM-Projekt schreiben

. 
├── build 
├── src 
| ├── rbpi 
| | └── gpio.h 
| ├── boot.c 
| ├── boot.s 
| └── kernel.c 
└── linker.ld 

Dies ist eine einfache Raspberry Pi-Kernel, die eine LED blinken macht! ich zur Zeit eine einfache BAT-Datei mit folgendem Inhalt verwenden, es zu bauen:

arm-none-eabi-gcc -g -O0 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7 -nostartfiles -Wl,-T,linker.ld src/kernel.c src/boot.c src/boot.s -o build/kernel.elf 
arm-none-eabi-objcopy build/kernel.elf -O binary build/kernel7.img 

Da ich mehrere Dateien zu diesem Projekt hinzufügen wird, würde ich jede Datei zu meiner „buildscript“ anzuhängen.
Wenn möglich, würde ich gerne eine makefile verwenden.

Wie sollte mein Makefile aussehen, wenn ich die folgenden "Regeln" möchte?

  • vor der Kompilierung, reinigen Sie alle *.elf und *.img Dateien aus dem Verzeichnis build.
  • Kompilieren Sie alle *.c und *.s Dateien aus dem Verzeichnis src.
  • Die kernel.elf Datei in das Verzeichnis build ausgeben.
  • Verwenden Sie das Linker-Skript linker.ld.
  • Führen Sie nach der Kompilierung objcopy aus, um eine Binärdatei zu generieren.

Antwort

2

Ein typisches Makefile aussehen kann ... Warten Sie eine Dokumentation über GNU gibt es hier Stellen mit einem schönen einfachen Makefile: http://www.gnu.org/software/make/manual/make.html#Simple-Makefile

für Sie also ein einfaches kann beginnen:

SRC := $(wildcard src/*.c src/*.s) 
CFLAGS := -g -O0 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7 -nostartfiles -Wl,-T,linker.ld 

all: build/kernel.img 

build/kernel.elf: $(SRC) 
    arm-none-eabi-gcc $(CFLAGS) $(SRC) -o [email protected] 


%.img: %.elf 
    arm-none-eabi-objcopy $< -O binary [email protected] 

clean: 
    rm -f build/*.elf build/*.img 

(Vorsicht, Rezepte mit einem Tab starten, nicht vier Räume wie hier, ist es wichtig für Make Ihre Datei zu verstehen, so dass die Kopieren-Einfügen wird nicht funktionieren.)

Sie müssen Elf und Img-Dateien vor dem Kompilieren nicht wirklich entfernen, das ist die GNU Make-Rolle, um zu wissen, ob sie entsprechend den Änderungszeiten der Datei neu aufgebaut werden muss oder nicht.

Hier ist sie, arbeiten:

$ tree 
. 
├── build 
├── Makefile 
└── src 
    ├── boot.c 
    ├── boot.s 
    └── kernel.c 

$ make 
arm-none-eabi-gcc -g -O0 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7 -nostartfiles -Wl,-T,linker.ld src/boot.c src/kernel.c src/boot.s -o build/kernel.elf 
arm-none-eabi-objcopy build/kernel.elf -O binary build/kernel.img 

$ tree 
. 
├── build 
│   ├── kernel.elf 
│   └── kernel.img 
├── Makefile 
└── src 
    ├── boot.c 
    ├── boot.s 
    └── kernel.c 

$ make 
make: Nothing to be done for 'all'. 

$ touch src/boot.C# If I touch a file, make will have to rebuild evrything: 

$ make 
arm-none-eabi-gcc -g -O0 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7-a -mtune=cortex-a7 -nostartfiles -Wl,-T,linker.ld src/boot.c src/kernel.c src/boot.s -o build/kernel.elf 
arm-none-eabi-objcopy build/kernel.elf -O binary build/kernel.img 

Sie wirklich einen Blick auf die Dokumentation nehmen sollten, die wirklich schön ist: http://www.gnu.org/software/make/manual/make.html Sie nicht in der Lage sein, auf Stackoverflow für Änderungen fragen Sie benötigen tun Sie auf Ihrem Makefile, ausgehend von diesem "Bootstrap-Makefile" sollten Sie in der Lage sein, es zu ändern, um Schritt für Schritt zu lernen, mit der Dokumentation als Referenz.

+0

Vielen Dank! :) –