Makefile简介
Makefile
是一种特殊格式的文件,被make
工具使用来管理软件的构建过程。Makefile
定义了一组规则和依赖关系,告诉make
如何编译和链接程序。
Makefile语句
TARGET: PREREQUISTS
COMMAND
Makefile
的语句由上述三部分组成,例如target: hello prerequists: hello.c command: gcc hello.c -o hello
hello: hello.c
gcc hello.c -o hello
Makefile变量
-
递归展开方式变量
这一类型的定义由
=
进行定义,此时是严格的文本替换。例如:xs = mh ns = $(xs) all:; echo $(ns)
在执行语句时,首先,
echo $(ns)
会替换为echo $(xs)
然后才会替换成echo mh
。这就是递归的进行替换。 -
直接展开方式变量
这一类型的定义由
:=
进行定义,在变量定义时就展开。ns := $(xs) xs = mh
此时由于
ns
是直接展开的,如果xs
定义在后面,此时ns
会直接变为空,无法完成对xs
变量的引用。
Makefile伪目标
伪目标使用.PHONY
进行声明,其后的值如share
,此语句表明share
并不是真正的目标,只执行后续的命令,而不生成目标。
.PHONY: shared
shared: # 不生成shared目标文件
ls
Makefile实例
CC = gcc
APP = webserver
SRCS-y := reactor.c webserver.c websocket.c
all: shared
.PHONY: shared build
shared: build/$(APP)-shared
ln -sf $(APP)-shared build/$(APP)
build/$(APP)-shared: $(SRCS-y) | build
$(CC) $(SRCS-y) -o $@
build:
@mkdir -p build
注意
-
Makefile
在vscode
中使用时可能会报错"make: *** No rule to make target '@mkdir', needed by 'build'. Stop."
原因:
vscode
中的tab
可能默认为四个空格解法:将
tab
修改为非四个空格