2016-05-22 3 views
2

Моей структура проекта выглядит следующим образом:Дать Makefile для ARM проекта

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

Это простая малина пи ядро, которое делает LED мигает! В настоящее время я использую простой файл летучей мыши со следующим содержанием, чтобы построить его:

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 

Поскольку я добавлять новые файлы в этот проект, я бы добавить все файлы в мой «buildscript».
Если возможно, я хотел бы использовать makefile.

Как должен выглядеть мой make-файл, если мне нужны следующие «правила»?

  • Перед компиляцией, очистить все *.elf и *.img файлы из каталога build.
  • Скомпилируйте все *.c и *.s файлы из каталога src.
  • Выведите файл kernel.elf в каталог build.
  • Используйте сценарий компоновщика linker.ld.
  • После компиляции запустите objcopy для создания двоичного файла.

ответ

2

Типичный Makefile может выглядеть ... Подождите, есть документация о GNU Make здесь с хорошей простой Makefile: http://www.gnu.org/software/make/manual/make.html#Simple-Makefile

Так что для вас простой, чтобы начать может быть:

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 

(Будьте осторожны, рецепты должны начать с язычком, а не четыре пространства, как здесь, это важно для макияжа, чтобы понять ваш файл, поэтому копирование-вставка не будет работать.)

Вам не нужно удалять файлы elf и img перед компиляцией, это роль GNU Make, чтобы знать, нужно ли ее перестраивать или нет в зависимости от времени изменения файла.

Вот он, работает:

$ 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 

Вы должны действительно взглянуть на документацию, которая действительно хорошо: http://www.gnu.org/software/make/manual/make.html вы не сможете спросить на StackOverflow для любой модификации вы должны будете сделайте это в своем make-файле, начиная с этого «bootstrap makefile», вы сможете изменить его, чтобы учиться поэтапно, с документацией в качестве ссылки.

+0

Большое спасибо! :) –

Смежные вопросы