Makefile常用命令
# 下面用来定义变量并赋值
# := 和 = 一样的吗?
# 这里?=代表如果变量已经赋值了,不要重新赋值,而是保留原来的值
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常用命令的更多相关文章
- LTIB常用命令1
下面再写一点ltib的常用命令参数吧,虽然觉得对其编译内核和文件系统流程有了一定了解,但是对其命令参数用过的还不是很多,可以说是不甚了解,下面介绍一些,希望有用: 首先一个比较有用的命令参数就是hel ...
- Makefile 常用函数表
Makefile 常用函数表 一.字符串处理函数1.$(subst FROM,TO,TEXT)函数名称:字符串替换函数—subst.函数功能:把字串“TEXT”中的“FROM”字符替换为“TO”.返 ...
- linux 常用命令 和 nginx(反响代理、负载均衡)安装和配置
(1)linux常用命令 [1]在光标前输入内容:i [2]删除输入方式下所输入的文本:Ctrl+u [3]文件保存退出:wq [4]文件不保存退出:q [5]文件强制退出:q! [6]常规删除文件 ...
- Cygwin下编译的程序不使用Cygwin.dll即可运行的命令 及常用命令简介
cc -mno-cygwin foo.c 1.$ ps PS的相关用法: QuoteUsage ps [-aefl] [-u uid]-f = show process uids, ppids-l = ...
- linux常用软件安装,常用命令
jdk [root@localhost]# tar -zxvf jdk-8u144-linux-x64.tar.gz [root@localhost]# vi /etc/profile 在profil ...
- Nginx安装及常用命令
一.选定源码目录 cd /usr/local/src 可以是任何目录,本文选定的是/usr/local/src 二.安装依赖库 yum install gcc yum install pcre-dev ...
- linux 常用命令--------雪松整理
linux 常用命令--------雪松整理 博客: http://hi.baidu.com/quanzhou722/blog错误在所难免,还望指正!========================= ...
- Linux 系统运维常用命令
1 文件管理2 软件管理3 系统管理4 服务管理5 网络管理6 磁盘管理7 用户管理8 脚本相关9 服务配置==================================------------ ...
- 常用命令 tcl & shell
TCL 常用命令: 1. 当前时间 [exec date +%m%d_%H%M] (实际是调用shell命令 date),比如在 icc 中保存cell 时可以用:save_mw_cel ...
- linux下常用命令备忘
转自:Linux 命令集锦 linux下查看监听端口对应的进程 # lsof -i:9000 # lsof -Pnl +M -i4 如果退格键变成了:"^h". 终端连接unix删 ...
随机推荐
- 在链表上实现 Partition 以及荷兰国旗问题
在链表上实现 Partition 以及荷兰国旗问题 作者:Grey 原文地址: 博客园:在链表上实现 Partition 以及荷兰国旗问题 CSDN:在链表上实现 Partition 以及荷兰国旗问题 ...
- 关于解决Failed on cp file to /system - Cross-device link 报错
前言 在adb shell中移动 android_server时候遇到了这个报错 解决办法 采用 cp 命令代替 mv 命令
- label studio 结合 MMDetection 实现数据集自动标记、模型迭代训练的闭环
前言 一个 AI 方向的朋友因为标数据集发了篇 SCI 论文,看着他标了两个多月的数据集这么辛苦,就想着人工智能都能站在围棋巅峰了,难道不能动动小手为自己标数据吗?查了一下还真有一些能够满足此需求的框 ...
- windows error LNK2019
温馨提示,请使用ctrl+F进行快速查找 ws2_32.lib error LNK2001: 无法解析的外部符号 __imp_htons error LNK2001: 无法解析的外部符号 __imp_ ...
- vite安装使用流程
安装vite 使用npm npm create vite@latest 使用yarn yarn create vite 使用pnpm pnpm create vite 还有一些选择配置比如使用那种框架 ...
- 数电第7周周结_by_yc
一.通用双向移位寄存器: 功能描述: 4位的双向移位寄存器,含控制输入端(ctrl).串行输入端(Dsl.Dsr).4个并行输入端和4个并行输出端,要求实现5种功能:异步置零.同步置数.左移.右移 ...
- web项目的开发--第一天
如何分析需求.如何设计.编码实现.测试. 用ssm架构实现CRM项目代码编写. CRM项目: 关键是养成好的编程思想和编程习惯. 技术架构 视图层(view): 展示数据,跟用户交互. html,cs ...
- 【Java SE进阶】Day11 网络编程、TCP应用程序
一.网络编程入门 1.软件架构 C/S:QQ.迅雷 B/S 共同点:都离不开网络的支持 网络编程:在一定的协议下,实现两台计算机通信 2.网络通信协议 通信协议:需遵守的规则,只有遵守才能通信 主要包 ...
- SQL一文入门助记
什么是SQL SQL(Structured Query Language)是用于操作数据库的语言.一个博客有许多网站,一个游戏要储存许多游戏的账号密码,这些都离不开数据库操作. 关系型数据库与NoSQ ...
- k8s驱逐篇(5)-kube-controller-manager驱逐
kube-controller-manager驱逐 概述 kube-controller-manager驱逐主要依靠NodeLifecycleController以及其中的TaintManager: ...