文件名默认:Makefile 使用其他文件名的话,用make -f <filename> 指定

Makefile 是一堆规则的集合,每个规则做一个特定的事情,类比npm package.json脚本

规则格式如下。

<target>: <prerequisites...>
<commands>

"target" 是必备的。prerequisites 和 commands是可选的,但是必须有一个。

执行make的时候,如果不指定一个target,会默认运行Makefile中的第一个target

make默认会在执行command之前输出要执行的command,你可以看到正在干什么。
这背离了“success should be silent”的unit信条。但是不这样你很难知道make正在做什么。
好在可以在command之前加上@,来防止这些输出。

每一行的command都在独立的shell中运行,所以如果设置了一个变量,在下一行的command中,无法获得这个变量!

如,Makefile中有如下target

var-lost:
	@export foo=bar;
	@echo "foo=[$$foo]"
% make var-lost

得到结果为

    foo=[]

可以修改为如下,使之变为一行shell command

var-kept:
	@export foo=bar; \
	@echo "foo=[$$foo]"
% make var-kept

得到结果为

    foo=[bar]

下面是一些特殊的变量(automatic variables):

以上面举例执行make var-kept。则$@为 var-kept

$< 为target的依赖列表中的第一项,如:

A:B
 echo $<

make A执行的时候 输出B

依赖列表的所有项 ,不只第一个。不论什么原因,如果一个值出现多次,在$^中这个值只会有一个,如:

A:B C D B
 echo $^

make A执行的时候 输出B C D

依赖列表里所有比target新的项。如在链接某个target的依赖里,某个依赖项修改了,\(?可获得这个修改了的依赖,没有修改的不会出现在\)?中

make 中的脚本不同与bash 变量赋值是 := 不同于bash中的=

    srcfiles := $(shell echo src/{00..99}.txt)

.PHONY: clean 防止碰巧有个文件叫clean,不能make clean


本站的Makefile如下 之前下面的command部分在一个叫deploy的脚本中,改为用make的好处是,用vimwiki编辑完后,在vim中直接调用make命令就好了, 当然得先执行Vimwiki2HTML命令,在提交文件

deploy:
	git add -A; git commit -m "deploy"; git push
push:
	git add -A; git commit -m "push"; git push

.PHONY: deploy push