1.Makefile
Makefile是一个工程管理文件,简化编译的流程,完成自动化编译的过程
在Makefile中,会把编译的过程分为两步,先生成.o文件,再对.o文件链接,生成可执行文件
Makefile由变量、函数、和规则构成
2.引入Makefile中的变量
3.make工具
4.第一版Makefile
5.第二版Makefile
6.第三版的Makefile---->引入通配符
7.引入内置函数
8.Makefile的分析案例
# CORTEX-A53 PERI DRIVER CODE
# VERSION 2.0
# ATHUOR www.hqyj.com
# MODIFY DATE
# 2019.04.12 Makefile
# SHELL=C:/Windows/System32/cmd.exe
# 指定交叉编译工具链前缀变量
CROSS_COMPILE = arm-linux-gnueabihf-
#指定文件名字变量
NAME = interface
#=============================================================================#
#-g:编译时添加gdb调试信息 -marm: 将程序编译生成arm指令集 -Wall:编译时显示所有警告信息
#-O0:编译时添加优化等级 -O0:不优化 -O1:一级优化
#-fno-builtin: 不使用linux操作系统,提供内置函数
#-nostdinc: 不可以包含linux操作系统提供的头文件
#-I:指定头文件路径
CFLAGS += -g -marm -Wall -O0 -mabi=apcs-gnu -mfpu=neon -mfloat-abi=softfp -fno-builtin \
-nostdinc -I./common/include -I./include
#LD:链接命令
LD = $(CROSS_COMPILE)ld
#CC:编译命令
CC = $(CROSS_COMPILE)gcc
#NM:查看符号表信息
NM = $(CROSS_COMPILE)nm
#OBJCOPY:生成二进制文件
OBJCOPY = $(CROSS_COMPILE)objcopy
#OBJDUMP:生成反汇编文件
OBJDUMP = $(CROSS_COMPILE)objdump
#============================================================================#
#wildcard是Makefile中内置函数
#功能:将指定目录下,指定文件以字符串格式进行展开,并用空格隔开
#参数:指定目录指定要展开文件
#返回值:展开后的结果
OBJSss := $(wildcard start/*.S) $(wildcard common/src/*.S) $(wildcard *.S)\
$(wildcard start/*.c) $(wildcard common/src/*.c) \
$(wildcard src/*.c) $(wildcard *.c)
#patsubst是Makefile中内置函数
#功能:将指定目录下某种格式,替换成另外一种格式
#参数:1)源字符串格式 2)目标字符串格式 3)指定替换目录
#返回值:替换后的结果
OBJSs := $(patsubst %.S,%.o,$(OBJSss))
OBJS := $(patsubst %.c,%.o,$(OBJSs))
%.o: %.S
@echo " AS $@"
@# $(CC): 使用arm-linux-gnueabihf-gcc命令
@$(CFLAGS): 指定编译参数
@#-c:只编译不链接 $<:第一个依赖 $^:所有依赖 -o: 起别名 $@:目标
@#将所有的.s文件根据指定参数,编译生成.o文件
@$(CC) $(CFLAGS) -c $< -o $@
%.o: %.c
@echo " CC $@"
@$(CC) $(CFLAGS) -c $< -o $@
all:clean $(OBJS)
@echo " LD Linking $(NAME).elf"
@#将所有的.o文件,根据map.lds,通过LD链接生成.elf文件
@$(LD) $(OBJS) -T map.lds -o $(NAME).elf
@echo " OBJCOPY Objcopying $(NAME).bin"
@#将.elf文件,通过OBJCOPY生成.bin文件
@$(OBJCOPY) -O binary $(NAME).elf $(NAME).bin
@echo " MAP Generating $(NAME).map"
@#将.elf文件符号表信息,重定向到.map文件
@$(NM) $(NAME).elf > $(NAME).map
@echo " OBJDUMP Objdumping $(NAME).dis"
@#将.elf文件,通过OBJDUMP生成反汇编文件,并且重定向到.dis文件
@$(OBJDUMP) -DS $(NAME).elf > $(NAME).dis
distclean clean:
@rm -rf $(OBJS) *.elf *.bin *.dis *.map
@echo " CLEAN complete."
huyue:
@echo $(OBJSss)
@echo $(OBJSs)
@echo $(OBJS)
install:
sudo cp $(NAME).bin /mnt/hgfs/share/