linux系统make命令内容,Linux系统Makefile文件语法

makefile文件语法

规则格式

目标:依赖文件集合

命令1

命令2

注意:每条命令需要以TAB键开头

变量

= :赋值符,注意变量真实值取决于引用变量的最后一次有效值

:= :赋值符,注意变量真实值只会使用前面定义好的

?= :赋值符,如果变量赋值了,就不做操作,如果未被赋值,等于引用值

+= :变量追加

自动化变量

$@ --代表目标文件(target)

$^ --代表所有的依赖文件(components)

$< --代表第一个依赖文件(components中最左边的那个)。

$? --代表当前目标所依赖的文件列表中比当前目标文件还要新的文件。

$* --不包括后缀名的当前依赖文件的名字

makefile的函数

用法:

${函数名 参数集合} 或是 $(函数名 参数集合)

函数subst : 函数用于字符串的替换

此函数的功能是将字符串 中的内容替换为

$(subst < from > ,< to >,< test >)

函数 patsubst:函数用于完成模式字符串替换

此函数功能是查找test文件中是否有patten ,如果有用replacement替换

$(patsubst < pattern > ,< replacement >,< test >)

函数dir :函数用于获取目录

此函数功能是从nams中提取出目录部分

$(dir< names*** > )

函数nodir :函数用于获取文件名

此函数功能是从nams中提取出目录部分

$(nodir< names*** > )

函数foreach:函数用于完成循环

此函数功能是将list中变量逐个取出,放入参数 var 中,再执行Texe内操作,执行输出再组成字符串输出

$(foreach < var >,< list >,< text >)

函数wildcard:作用类似于通配符%,只是%适用于规则中,而定义变量与函数使用时,需使用wildcard函数

此函数功能是类似通配符%,获取后缀为.c的文件名集合

$(wildcard *.c)

注意事项:

1.通配符%:例如 %.o – 代表着本文件夹下后缀以.o的文件集合

%.s --代表着本文件夹下后缀以.s的文件集合

2. makeflie语法类似于字符串

makefile文件示例:

CROSS_COMPILE ?= arm-linux-gnueabihf- //先进行判断,再赋值操作

TARGET ?= bsp

CC := $(CROSS_COMPILE)gcc

LD:= $(CROSS_COMPILE)ld

OBJCOPY := $(CROSS_COMPILE)objcopy

OBJDUMP := $(CROSS_COMPILE)objdump

INCDIRS := imx6ul \ //头文件

bsp/clk \

bsp/led \

bsp/delay

SRCDIRS:= project \ //源文件

bsp/clk \

bsp/led \

bsp/delay

INCLUDE:= $(patsubst %, -I %, $(INCDIRS)) //函数patsubst进行字符串替换 将头文件路径加入 -I后进行替换

//获取源文件夹下所有.s文件并且加上路径

SFILES:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) //函数foreach进行循环操作,将SRCDIRS当作参数放入dir中,再执行wildcard获取文件夹下的.s文件 */

//获取源文件夹下所有.c文件并且加上路径

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

//去掉SFILES中的路径

SFILENDIR:= $(notdir $(SFILES)) //函数notdir将变量中去掉路径

//去掉CFILES中的路径

CFILENDIR:= $(notdir $(CFILES))

//临时生成文件

//将SFILENDIR中的.S文件后缀替换成.O,并且添加路径 obj/

SOBJS:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) //此处中(SFILENDIR:.S=.o)是将.s文件替换成.o

//将SFILENDIR中的.c文件后缀替换成.O,并且添加路径 obj/

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

//将SOBJS COBJS组合

OBJS:= $(SOBJS) $(COBJS)

//指定文件搜索路径,如果没有只会在当前文件夹内搜索

VPATH:= $(SRCDIRS)

//声明

.PHONY: clean

$(TARGET).bin : $(OBJS)

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

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

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

$(SOBJS) : obj/%.o : %.S //静态模式 表示将所有的.S文件编译生成 .o文件,并且存放在obj文件夹下

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

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

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

clean:

rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

详细易懂的Linux makefile教程 一、概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统命令makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmakeLinux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。 在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。 二、关于程序的编译和链接 —————————— 在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。 ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值