Makefile

来自百合仙子's Wiki
跳转到导航 跳转到搜索

自动变量

$*
不包含扩展名的目标文件名称
$+
所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$<
第一个依赖文件的名称
$?
所有时间戳比目标文件晚的依赖文件,并以空格分开
$@
目标文件的完整名称
$^
所有不重复的依赖文件,以空格分开
$%
如果目标是归档成员,则该变量表示目标的归档成员名称

来源:Makefile文件的书写 - xinchao's Blog

示例

.PHONY: all clean

targets=$(patsubst %.ui, %.py, $(wildcard *.ui))

all: $(targets)

%.py: %.ui
	pyside-uic $< > $@

clean:
	-rm $(targets)

环境判断

区分Windows和其它系统,可使用[1]

ifneq ($(COMSPEC)$(ComSpec),)
  ## in windows
else 
  ## in linux/etc
endif

从数组生成多个目标

[2]

.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]

外部链接

参考资料