Makefile

Makefile是什么

一般来说,程序编译需要把源文件编译成中间代码文件,在Windows下是.obj文件,UNIX下是.o文件,即Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫做链接(Link)

Makefile是linx系统下简化编译指令的文件。

例如:vcs是一个编译verilog文件的软件,编译时需要使用 vcs -full64 test.v -l readme.log指令。

其中-full64是装的是64位的软件,test.v是测试的verilog代码,-l readme.log是将编译指令写入readme.log文件中。

如果在该目录下没有Makefile文件,则每次编译都要敲如此长的指令,很不方便。如果使用Makefile,则只 需要输入make vcs 则可以进行编译。

在工作目录创建Makefile,编辑

.PHONY:vcs

vcs:
	vcs -full64 test.v -l readme.log

在终端敲入 make vcs就可以实现vcs -full64 test.v -l readme.log指令。

Makefile基本语法

显示规则

目标文件:依赖文件

​	指令


其中目标文件是编译生成的文件,依赖文件是源文件,第二行的指令需要用Tab键

例如

edit:main.o
	cc -o edit main.o

main.o:main.c defs.h
	cc -c main.c
	
claen:
	rm main.o 

上述第一行是我们希望最后生成的edit执行文件,edit是由object文件生成,object再由源代码生成,clean是删除中间文件object。其中clean使用了一个伪目标,不是为了生成clean,而是单纯执行下面的指令。更为稳健的做法是:

.PHONY:clean
clean:
	rm main.o

通过.PHONY声明clean是一个伪目标,不是一般的规则。

常用:makefile中也有类似于C语言中宏定义的使用,例如:

object = main.o kbd.o command.o disply.o
$(object)

其中$(object) = main.o kbd.o command.o disply.o

将生成的中间文件保存到另一个文件夹中

DIR = ./debug
$(DIR)edit:$(main.o)
	cc -o $(DIR)edit $(DIR)main.o

其中DIR是保存的路径,在每个文件前都要加上路径。

常用函数

搜索文件函数wildcard

SOURCE = $(wildcard *.c)
#把当前目录下所有.c文件存入变量SOURCE

字符串替换函数patsubst

OBJS = $(oatsubst %.c,%.o,$(SOURCE))
#把SOUCE中.c文件换成.o存入到OBJS中

注意:如果文件不是命名为makefile或者Makefile,则使用时是用指令make -f filename

posted @ 2021-03-14 15:37  习惯科夫  阅读(126)  评论(0编辑  收藏  举报