make和Makefile提要
参考:https://www.gnu.org/software/make/manual/
make
命令
- 目标与需求条件
target:prereq1 prereq2 #说明:target常见是executable or object files.
<tab>commands
...
.PHONY: clean
clean:
-rm -rf $(target) *.o
Makefile
内容
Makefile里主要包含了五种东西:显式规则、隐式规则、变量、指示和注释。
这里参见gnu官方make手册3.1节
- 显式规则:显式写出来的
- 隐式规则:make自己推导出来的。详细参见官方.
main.o : defs.h
生成 main.o 所以会自动推导出有 main.c ,自动执行
cc -c main.c -o main.o
完整例子:
objects = main.o kbd.o \
command.o display.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
.PHONY: clean
clean :
-rm edit $(objects)
- 变量:
指示directive :包括,
1包含另一个Makefile,类似于C的include一样
include foo *.mk $(bar) #包含进所有的mk文件和bar变量代表的文件。 #另外 -include filenames... 表示当文件不存在时继续而不报错。
2判断某块是否有效,类似于C的预编译
#ifdef
一样libs_for_gcc = -lgnu normal_libs = foo: $(objects) ifeq ($(CC),gcc) $(CC) -o foo $(objects) $(libs_for_gcc) else $(CC) -o foo $(objects) $(normal_libs) endif
3多行字面值的变量
- 注释#
变量与宏
- 用户定义变量
- 环境变量
- 自动变量
赋值:
- :=
- ?=
- !=
- +=
取出宏值:$()
命令结果:“两个反斜点包裹