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

# := 和 = 一样的吗?

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

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)

Makefile常用命令的更多相关文章

  1. LTIB常用命令1

    下面再写一点ltib的常用命令参数吧,虽然觉得对其编译内核和文件系统流程有了一定了解,但是对其命令参数用过的还不是很多,可以说是不甚了解,下面介绍一些,希望有用: 首先一个比较有用的命令参数就是hel ...

  2. Makefile 常用函数表

    Makefile  常用函数表 一.字符串处理函数1.$(subst FROM,TO,TEXT)函数名称:字符串替换函数—subst.函数功能:把字串“TEXT”中的“FROM”字符替换为“TO”.返 ...

  3. linux 常用命令 和 nginx(反响代理、负载均衡)安装和配置

    (1)linux常用命令 [1]在光标前输入内容:i [2]删除输入方式下所输入的文本:Ctrl+u  [3]文件保存退出:wq [4]文件不保存退出:q [5]文件强制退出:q! [6]常规删除文件 ...

  4. Cygwin下编译的程序不使用Cygwin.dll即可运行的命令 及常用命令简介

    cc -mno-cygwin foo.c 1.$ ps PS的相关用法: QuoteUsage ps [-aefl] [-u uid]-f = show process uids, ppids-l = ...

  5. linux常用软件安装,常用命令

    jdk [root@localhost]# tar -zxvf jdk-8u144-linux-x64.tar.gz [root@localhost]# vi /etc/profile 在profil ...

  6. Nginx安装及常用命令

    一.选定源码目录 cd /usr/local/src 可以是任何目录,本文选定的是/usr/local/src 二.安装依赖库 yum install gcc yum install pcre-dev ...

  7. linux 常用命令--------雪松整理

    linux 常用命令--------雪松整理 博客: http://hi.baidu.com/quanzhou722/blog错误在所难免,还望指正!========================= ...

  8. Linux 系统运维常用命令

    1 文件管理2 软件管理3 系统管理4 服务管理5 网络管理6 磁盘管理7 用户管理8 脚本相关9 服务配置==================================------------ ...

  9. 常用命令 tcl & shell

    TCL 常用命令: 1. 当前时间  [exec  date  +%m%d_%H%M]   (实际是调用shell命令 date),比如在 icc 中保存cell 时可以用:save_mw_cel   ...

  10. linux下常用命令备忘

    转自:Linux 命令集锦 linux下查看监听端口对应的进程 # lsof -i:9000 # lsof -Pnl +M -i4 如果退格键变成了:"^h". 终端连接unix删 ...

随机推荐

  1. Android网络请求(2)

    Android网络请求(2) 在android网络开发中,除get请求外常见的还有post.put.delete这三种,接下来我们将详细讲解这三种请求及参数 GET请求 我们使用过get请求了,对于我 ...

  2. NOI2011真题:兔兔与蛋蛋游戏

    NOI2011真题:兔兔与蛋蛋游戏 题目描述 这些天,兔兔和蛋蛋喜欢上了一种新的棋类游戏. 这个游戏是在一个 n行 m 列的棋盘上进行的.游戏开始之前,棋盘上有一个格子是空的,其它的格子中都放置了一枚 ...

  3. C温故补缺(一):数据类型和基本类型占位

    数据类型 基本类型:就是算术类型,包括整型和实型 枚举类型:一组离散的整数 void类型:无可用值类型 派生类型:指针(*),数组([]),结构体(struct),共用体(union),函数(fun( ...

  4. c3 linearization详解

    MRO MRO 全称方法解析顺序(Method Resolution Order),在多重继承和多继承存在的时候,寻找属性及方法的顺序. 深度优先(DFS)与广度优先(BFS) python2 所用的 ...

  5. .NET周报【11月第4期 2022-11-30】

    国内文章 .NET 7 的 AOT 到底能不能扛反编译? https://www.cnblogs.com/huangxincheng/p/16917197.html 在B站,公众号上发了一篇 AOT ...

  6. Spring03:案例转账功能(事务问题)、动态代理解决、AOP

    今日内容--核心2AOP 完善Account案例 分析案例中的问题 回顾之前讲过的技术--动态代理 动态代理的另一种实现方式 解决案例中的问题 AOP的概念 Spring中的AOP相关术语 Sprin ...

  7. 直播报名|资深云原生架构师分享服务网格在腾讯 IT 业务的落地实践

    云原生在近几年的发展越来越火热,作为云上最佳实践而生的设计理念,也有了越来越多的实践案例,而一个个云原生案例的背后,是无声的巨大变革. 腾讯云主办首个云原生百科知识直播节目--<云原生正发声&g ...

  8. APP异常测试点汇总

    在测试APP时异常测试是非常必要的. 安装卸载中的异常测试 一.安装 安装过程中设备重启 安装过程中息屏 安装过程中断网 安装过程中切换网络 安装过程中收到短信提醒 安装过程中收到来电提醒 安装过程中 ...

  9. 浅谈 C++ 模板 & 泛化 (妈妈再也不用担心我不会用 std::sort 了)

    基础复习 先上个对 int 类型数组的插入排序: void insertionSort_01(int* seq, int firstIndex, int lastIndex) { for (int j ...

  10. 基于SqlSugar的开发框架循序渐进介绍(24)-- 使用Serialize.Linq对Lambda表达式进行序列化和反序列化

    在上篇随笔<基于SqlSugar的开发框架循序渐进介绍(23)-- Winform端管理系统中平滑增加对Web API对接的需求>中介绍了基于一个接口,实现对两种不同接入方式(直接访问数据 ...