Makefile初步-2
2014年04月03日 Linux

接上文,假如有如下一个Makefile其中一部分是这样的:

1
2
obj: utils.o display.o edit.o interface.o save.o
gcc –std=c99 –g utils.o display.o edit.o interface.o save.o -o main

而且obj的依赖还会不停的变动,增加或者减少,更可能的是这一组依赖还会出现在文件中的其他地方,命令规则的参数也可能有很长一串,那想想,每次都要写这么多的文件名/命令字符串,的确是个很麻烦的事,而且还容易出错,更不容易查错。make已经为我们想到了替代方式,就是用一个变量来替代这一组长长的文件名列表/参数选项列表,在make规则中只使用这个变量来代替那一组文件列表,这样既能减少错误,还能减少工作量。

通常使用变量的使用是OBJ = XXOO OOXX或者FLAG = ZZZZ等形式,在引用的时候使用$(美元符)加以引用,如$(OBJ),这样儿在引用的时候,就像C语言的宏替换类似,变量所代表的名称列表就会被展开到,对应的位置,如上面的例子就可以写成:

1
2
3
4
5
6
7
8
OBJ = utils.o display.o edit.o interface.o save.o
CFLAGS = -std=c99
CC = gcc
main: main.c $(OBJ)
$(CC) $(FLAGS) main.c –o main
.PHONY:clean
clean:
rm $(OBJ) main

这样就可以避免多处引用的时候出现写错的情况。

关于简单的自动推导,就是make工具有一个默认规则,给出目标和依赖,如果没有生成的命令,那么就会默认按照cc –c XXX.c –o XXX.o的形式,自动生成对应的目标文件。那么,在Makefile初步-1中所写的文件,就可以变成这样:

1
2
3
4
5
6
7
8
9
OBJ = utils.o display.o

main: main.c $(OBJ)
utils.o: utils.h utils.c
display.o: display.c display.h

.PHONY: clean
clean:
rm -f $(OBJ) main

虽然能省不少打字的工夫,但是还是写明生成规则比较好,因为有助于后期的维护。这就是Makefile中简单的变量和自动推导规则。