首页 > 技术文章 > Makefile 管理

Je-Cortex 2015-09-23 13:10 原文

      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
#=====================================

推荐阅读