教程

Make 命令教程 使用 Make 构建网站

动态参数

脚本

1
2
3
4
.PHONY: test

test:
	echo '${ok}'

调用

make ok=123

结果

1
2
3
➜  ~ make ok=123123
echo '123123'
123123

实践

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
# 介绍

value = 1

.PHONY: Gramma
# 如果Make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标。
Gramma: gone
	# 这是测试

gone:
	@# 这是测试2
	# 由于在构建过程中,需要了解当前在执行哪条命令,所以通常只在注释和纯显示的echo命令前面加上@
	@echo TODO

.PHONY: clean

2.txt: 1.txt
	cat 1.txt > 2.txt

1.txt: gin-xterm
	touch 1.txt
	echo "123" > 1.txt

gin-xterm: var-kept
	pwd
	git clone https://github.com/lflxp/gin-xterm.git

var-kept: var-kept-three
	export foo=bar; echo "foo=[$$foo]"
	export xo=90; \
	echo $$xo

.ONESHELL:
var-kept-three:
	export xy=ooo; 
	echo $$xy

.PHONY: install
install: 2.txt gotty.txt Gramma

gotty.txt: 989
	touch gotty.txt

989: 
	export xo=90; \
	echo $$xo
	echo "989"

.PHONY: wildcard

wildcard: 
	@echo 解释:通配符(wildcard)用来指定一组符合条件的文件名。Makefile 的通配符与 Bash 一致,主要有星号(*)、问号(?)和 [...] 。比如, *.o 表示所有后缀名为o的文件。
	ls -l *.txt

txt = Hello world
txttest: 
	@echo $(txt)
	@echo $(value)

.PHONY: envtest
envtest: now change 

now: 
	pwd
	cd /tmp; \
	pwd
	pwd

change: a b c d
	pwd

# 同时构建多个目标文件
a b c d:
	@echo $@指代当前目标,就是Make命令当前构建的那个目标。比如,make foo的 $@ 就指代foo
	@echo $< 指代第一个前置条件。比如,规则为 t: p1 p2,那么$< 就指代p1
	@echo $? 指代比目标更新的所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,其中 p2 的时间戳比 t 新,$?就指代p2。
	@echo $^ 指代所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,那么 $^ 就指代 p1 p2
	@echo $* 指代匹配符 % 匹配的部分, 比如% 匹配 f1.txt 中的f1 ,$* 就表示 f1
	@echo $(@D)$(@F) 分别指向 $@ 的目录名和文件名。比如,$@是 src/input.c,那么$(@D) 的值为 src ,$(@F) 的值为 input.c。
	@echo $(<D)$(<F) 分别指向 $< 的目录名和文件名
	touch $@
	# cp $< $@
	echo '$(@D) $(@F)'

# 判断
ifeq ($(CC),gcc)
	libs=$(libs_for_gcc)
else
	libs=$(normal_libs)
endif

LIST = one two three
list:
	@echo 循环
	for i in $(LIST); do \
		echo $$i; \
	done
	echo '$(subst ee,EE,feet on the street)'

clean:
	rm -f a b c d
	rm -f *.txt
	rm -rf gin-xterm/