Makefile百科簡介:一個工程中的源文件不計其數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作,因為 makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。
在進行工程管理時往因為編譯工具或源文件類型,數目多少等等的原因,需得重復編寫代碼
那如何生成一個通用的Makefile呢? 如下例:
# CORTEX-A9 PERI DRIVER CODE
# VERSION 2.0
# ATHUOR Je_Cortex
# MODIFY DATE
# 2014.05.28 Makefile
CROSS_COMPILE = arm-none-eabi-
#定義一個變量,CROSS_COMPILE ,變量值arm-none-eabi-
#交叉編譯工具的前綴
NAME =led
#定義一個變量NAME,變量值 led
#生成的文件名稱
#================================================================#
CFLAGS += -g -O0 -mabi=apcs-gnu -mfpu=neon -mfloat-abi=softfp -fno-builtin /
-nostdinc -I ./common/include #告訴編譯器不鏈接gnu 內建庫,鏈接當前路徑下的./common/include
# += 變量的原值后面追加
# CFLAGS 是makefile的默認變量,作為gcc的選項
# 對變量CFLAGS,追加值
# -E -S -c -o -g -D -i -I -l -L
LD = $(CROSS_COMPILE)ld
#定義一個變量 LD =arm-none-eabi-ld
CC = $(CROSS_COMPILE)gcc
#定義一個變量 CC =arm-none-eabi-gcc
OBJCOPY = $(CROSS_COMPILE)objcopy
#定義一個變量 OBJCOPY =arm-none-eabi-objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
##定義一個變量 OBJDUMP =arm-none-eabi-objdump
#================================================================#
OBJSss := $(wildcard start/*.S) $(wildcard common/src/*.S) $(wildcard *.S)/
$(wildcard start/*.c) $(wildcard common/src/*.c) /
$(wildcard usr/*.c) $(wildcard *.c)
#$(wildcard start/*.S) : 按指定內容(start目錄下,所有以.S結尾的指令)進行文件搜索,返回搜到的文件名
OBJSs := $(patsubst %.S,%.o,$(OBJSss))
#定義變量OBJSs,變量的值為:start.o _udivsi3.o _umodsi3.o uart.c PRintf.c led.c
#$(patsubst %.S,%.o,$(OBJSss)) 按照指定的規則(對變量OBJSss的值.S 替換成.o)對字符內容進行替換
OBJS := $(patsubst %.c,%.o,$(OBJSs))
#定義變量OBJS,變量的值為:start.o _udivsi3.o _umodsi3.o uart.o printf.o led.o
#================================================================#
%.o: %.S
$(CC) $(CFLAGS) -c -o $@ $<
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
all:clean $(OBJS)
$(LD) $(OBJS) -T map.lds -o $(NAME).elf
$(OBJCOPY) -O binary $(NAME).elf $(NAME).bin
$(OBJDUMP) -D $(NAME).elf > $(NAME).dis
#all:clean $(OBJS) 清除所有.o文件,防止修改.h后不編譯
#$(LD) $(OBJS) -T map.lds -o $(NAME).elf
# arm-none-eabi-ld start.o _udivsi3.o _umodsi3.o uart.o printf.o led.o -T map.lds -o led.elf
#根據鏈接腳本,鏈接生成elf
#$(OBJCOPY) -O binary $(NAME).elf $(NAME).bin
# arm-none-eabi-objcopy -O binary led.elf led.bin 二進制格式轉換
#$(OBJDUMP) -D $(NAME).elf > $(NAME).dis
# arm-none-eabi-objdump -D led.elf > led.dis
#=================================================================#
clean:
rm -rf $(OBJS) *.elf *.bin *.dis *.o
#=====================================
新聞熱點
疑難解答