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

# := 和 = 一样的吗?

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

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. Windows自带管理工具

    exe类notepad 记事本 control 控制面板 mstsc 远程桌面连接explorer 资源管理器 taskmgr 任务管理器resmon 资源监视器 perfmon 性能监视器reged ...

  2. Day29 Linux相关命令的使用

    今日内容 基本概念 安装 基本命令 在linux上安装软件 jdk mysql jdk Nginx的安装 一.概述 1.Unix linux基于Unix,Unix由贝尔实验室在1969年开发 一开始由 ...

  3. 【Day01】Spring Cloud入门-架构演进、注册中心Nacos、负载均衡Ribbon、服务调用RestTemplate与OpenFeign

    〇.课程内容 课程规划 Day1 介绍及应用场景 Day2 组件介绍及 广度 Day3 设计思想.原理和源码 Day4 与容器化的容器(服务迁移.容器编排) 一.业务架构的演进 1.单体架构时代 缺陷 ...

  4. bug处理记录:java.util.UnknownFormatConversionException: Conversion = 'Y'

    1. 报错: java.util.UnknownFormatConversionException: Conversion = 'Y' at java.util.Formatter$FormatSpe ...

  5. 同步异步、mutiprocessing创建进程process模块及进程对象的多种方法、消息队列Queue

    目录 同步异步 阻塞与非阻塞 综合使用 创建进程的多种方式之multiprocess.process模块 进程间数据隔离 进程的join方法 IPC机制 生产者 消费者模型 进程对象的多种方法 守护进 ...

  6. Nmap脚本

    Nmap的脚本默认存放在Nmap的安装路径的scripts文件夹下Nmap的脚本主要分为以下几类 Auth:负责处理鉴权证书(绕过鉴权)的脚本 Broadcast:在局域网内探查更多服务的开启情况,如 ...

  7. Jenkins&&gitlab2

    Jenkins  slave 添加jenkins slave节点: jenkins slave节点创建工作目录与基本环境配置,如果jenkins slave节点需要clone代码和执行java 代码编 ...

  8. TortoiseGit (小乌龟安装配置及使用)

    TortoiseGit 使用教程 (图文详解) 第一步 下载Git:下载地址:https://gitforwindows.org 第二步 下载TortoiseGit 以及 汉化包 (安装教程这里就不详 ...

  9. 体验一个前端视图层的mvvm的框架Knockoutjs(双向绑定,模板..)..解放您的双手,不再处理那么多的dom操作..快速实现视图层数据与UI的交互处理

    笔者之前对于类似前端展示的,可能都是自己开发js对象,集合外加dom事件进行处理..  近期看到相关资料,了解了Knockoutjs这个框架,下面来段代码: <script type=" ...

  10. [C++标准模板库:自修教程与参考手册]关于vector

    什么是vector 可以这样认为,vector就是一个动态的数组,其中的元素必须具备assignable(可赋值)和copyable(可拷贝)两个性质. vector的一些重要的性质 vector支持 ...