# 下面用来定义变量并赋值

# := 和 = 一样的吗?

# 这里?=代表如果变量已经赋值了,不要重新赋值,而是保留原来的值

CROSS_COMPILE ?= arm-linux-gnueabihf-

TARGET ?= key

# 配置一些编译工具

# CC用来编译汇编.S文件和C语言.c文件, 从而得到.o目标文件

# LD用来链接.o目标文件为.elf文件

# OBJCOPY用来去除.elf文件中符号表,重定位表和调戏信息等,从而得到.bin文件

# OBJDUMP用来反编译.elf文件, 得到.dis汇编代码

CC := $(CROSS_COMPILE)gcc

LD := $(CROSS_COMPILE)ld

OBJCOPY := $(CROSS_COMPILE)objcopy

OBJDUMP := $(CROSS_COMPILE)objdump

# \代表并接到一行内,注意\只能是行末, 等价写法就是

# INCDIRS := imx6ul bsp/clk bsp/led bsp/delay (后面继续)

INCDIRS := imx6ul \

      bsp/clk  \

      bsp/led \

      bsp/delay \

      bsp/beep \

      bsp/gpio \

      bsp/key

SRCDIRS := target \      

      bsp/clk  \

      bsp/led \

      bsp/delay \

      bsp/beep \

      bsp/gpio \

      bsp/key

#  patsubst函数 用法就是

# %代表INCDIRS中每个空格分隔的字符串,

# 现在把 INCDIRS中的 任意字符串 % 替换为 字符串 -I %

# 例如这里imx6ul bsp/clk bsp/led bsp/delay (等) 就变为了-I imx6ul -I bsp/clk -I bsp/led -I bsp/delay (等)

INCLUDE := $(patsubst %, -I %, $(INCDIRS))

# foreach函数 $(dir) 代表 $(SRCDIRS)中么个空格分割的字符串

# wildcard 函数代表按通配符寻找 $(dir)目录下的所有文件

# 下面会得到SFILES是类似 aaa/bbb.S  ccc/ddd.S

# 下面会得到CFILES是类似 aaa/bbb.c  ccc/ddd.c

SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))

CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

# 下面通过notdir函数去除目录路径

# 会得到类似bbb.S, ddd.S和 bbb.c, ddd.c等

SFILENDIR := $(notdir $(SFILES))

CFILENDIR := $(notdir $(CFILES))

# 下面用patsubst函数来替换,注意 $(SFINENDIR:.S=.o)的写法使得

# 前一个%代表 SFINENDIR中的每个xxx.S, 后一个%对应代表xxx.o

SOBJS := $(patsubst %, obj/%  $(SFINENDIR:.S=.o))

COBJS := $(patsubst %, obj/%  $(CFINENDIR:.c=.o))

OBJS := $(SOBJS) $(COBJS)

# VPATH用于在依赖文件中使用了%.xxx 就去VPATH指定的路径搜索相关文件

VPATH = $(SRCDIRS)

# 代表clean是一个伪目标,以免Makefile同级目录下有一个clean文件导致make clean不会执行

.PHONY clean:

# $^代表依赖集合 $@代表目标

# -Timx6ul.lds指定imx6ul.lds文件所描述的链接配置来链接.o目标文件

# OBJCOPY中的 -S 代表过滤掉.elf中的符号表和重定位表

$(TARGET).bin : $(OBJS)

  $(LD) -Timx6ul.lds -o $(TARGET).elf $^

  $(OBJCOPY) -O binary -S $(TARGET).elf $@

  $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

# $<代表依赖集合中的第一个依赖文件

# 这里通过$(SOBJS)指定了目标文件的集合

$(SOBJS) : obj/%.o : %.S

  $(CC) -Wall -nostdlib -c -O2 -o $@ $<

$(COBJS) : obj/%.o : %.c

  $(CC) -Wall -nostdlib -c -O2 -o $@ $<

clean:

  rm -rf $(TARGET).bin $(TARGET).elf $(TARGET).dis $(OBJS)

最新文章

  1. docker pull certification error
  2. html5全局属性
  3. 项目管理10000 hours – 瞎扯谈系列
  4. ios - 文件保存路径的获取
  5. 总结一下SQL的全局变量
  6. struts2属性Struts2中属性接收参数中文问题和简单数据验证
  7. 一个开源音乐播放器,低仿QQ音乐!
  8. (Map)利用Map,完成下面的功能:&#160; 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该&#160;年没有举办世界杯,则输出:没有举办世界杯。&#160; 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。&#160;附录&#160;(Map)在原有世界杯Map&#160;的基础上,增加如下功能:&#160;读入一支球队的名字,输出该球队夺冠的年份列表。&#160;例如,读入“巴西”,应当输出&#160;1958&#160;1962&#160;1970&#160;1
  9. 利用MSF溢出攻击讲解
  10. absolut绝对定位的非绝对定位用法
  11. vertical-align:middle的居中细节调整
  12. 使用python爬取MedSci上的期刊信息
  13. angular中路由的实现(针对新手)
  14. 主机设置ss代理,虚拟机共享代理
  15. Windows 7 蓝屏代码大全 &amp; 蓝屏全攻略
  16. python之正则表达式和re模块一
  17. 在桌面右键创建html,css,js文件
  18. Linux c codeblock的使用(四):创建自己的静态函数库
  19. Python Django 之 直接执行自定义SQL语句(二)
  20. 使用java进行excel读取和写入

热门文章

  1. 【Java并发005】原理层面:volatile关键字全解析
  2. 如何利用C++使Windows蓝屏
  3. 第2-4-3章 规则引擎Drools基础语法-业务规则管理系统-组件化-中台
  4. 解决Emma中文乱码
  5. 使用python玩转二维码!速学速用!⛵
  6. supervisor安装与监控nginx
  7. VMware ESXi 8.0 SLIC &amp; Unlocker 集成网卡驱动和 NVMe 驱动 (集成驱动版)
  8. python 之字符串的使用
  9. Error: Could not get apiVersions from Kubernetes
  10. python实现单向循环链表与双向链表