Makefile三个版本的编写、以及分析案例

1.Makefile

Makefile是一个工程管理文件,简化编译的流程,完成自动化编译的过程
在Makefile中,会把编译的过程分为两步,先生成.o文件,再对.o文件链接,生成可执行文件
Makefile由变量函数、和规则构成

2.引入Makefile中的变量

Makefile三个版本的编写、以及分析案例_第1张图片

Makefile三个版本的编写、以及分析案例_第2张图片

3.make工具

Makefile三个版本的编写、以及分析案例_第3张图片

4.第一版Makefile

Makefile三个版本的编写、以及分析案例_第4张图片

5.第二版Makefile

Makefile三个版本的编写、以及分析案例_第5张图片

6.第三版的Makefile---->引入通配符

Makefile三个版本的编写、以及分析案例_第6张图片

7.引入内置函数

Makefile三个版本的编写、以及分析案例_第7张图片

Makefile三个版本的编写、以及分析案例_第8张图片

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/

你可能感兴趣的:(linux)