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