Makefile
跳转到导航
跳转到搜索
自动变量
$*
- 不包含扩展名的目标文件名称
$+
- 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$<
- 第一个依赖文件的名称
$?
- 所有时间戳比目标文件晚的依赖文件,并以空格分开
$@
- 目标文件的完整名称
$^
- 所有不重复的依赖文件,以空格分开
$%
- 如果目标是归档成员,则该变量表示目标的归档成员名称
来源:Makefile文件的书写 - xinchao's Blog
示例
.PHONY: all clean
targets=$(patsubst %.ui, %.py, $(wildcard *.ui))
all: $(targets)
%.py: %.ui
pyside-uic $< > $@
clean:
-rm $(targets)
环境判断
ifneq ($(COMSPEC)$(ComSpec),)
## in windows
else
## in linux/etc
endif
从数组生成多个目标
.PHONY: all clean
languages = Haskell OCaml Rust Rust_parallel \
C++98 C++98_omp C++14 C++14_boost C D Go \
NodeJS NodeJS_async CoffeeScript CoffeeScript_parallel \
Java Chicken Racket FreePascal Erlang CommonLisp_opt
all: $(languages)
.PHONY: $(languages)
$(languages): %:
$(MAKE) -C $*
clean:
for d in $(languages); do $(MAKE) clean -C "$$d"; done
问题处理
不要删除中间文件
make 默认会删除自动规则中生成的中间文件。设置 .SECONDARY
为空可以禁用之。[3]
外部链接
- Makefile文件的书写 - xinchao's Blog
- 第 22 章 Makefile基础
- 在Makefile中自动生成依赖
- Makefile 1 to 1 - leavor's Blog - It‘s logical
- The one line you should add to every makefile | John Graham-Cumming
- Makefile 为特定目标指定选项
- 调试Makefile的工具——remake | 我的站点
- 自动处理Make的依赖关系
- lindenb/makefile2graph: Creates a graph of dependencies from GNU-Make; Output is a graphiz-dot file or a Gexf-XML file.
- mtime comparison considered harmful - apenwarr