目录
1、=和:=的区别
2、Makefile $@, $^, $<
3、“order-only”依赖 “|”的用法
4、wildcard使用
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1、=和:=的区别。
(1)“=”
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
(2)“:=”
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2、Makefile $@, $^, $<
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
如一个目录下有如下文件:
$ ls
hello.c hi.c main.c Makefile
按照 Makefile 规则规规矩矩的写:
main: main.o hello.o hi.o
gcc -o main main.o hello.o hi.o
main.o: main.c
cc -c main.c
hello.o: hello.c
cc -c hello.c
hi.o: hi.c
cc -c hi.c
clean:
rm *.o
rm main
改为用上述符号进行替代:
main: main.o hello.o hi.o
gcc -o $@ $^
main.o: main.c
cc -c $<
hello.o: hello.c
cc -c $<
hi.o: hi.c
cc -c $<
clean:
rm *.o
rm main
beyes@debian:~/makefile_test/semicolon/real$ make
cc -c main.c
cc -c hello.c
cc -c hi.c
gcc -o main main.o hello.o hi.o
beyes@debian:~/makefile_test/semicolon/real$ ls
hello.c hello.o hi.c hi.o main main.c main.o Makefile
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3、“order-only”依赖的使用举例:
LIBS = libtest.a
foo : foo.c | $(LIBS)
$(CC) $(CFLAGS) $< -o $@ $(LIBS)
make在执行这个规则时,如果目标文件“foo ”已经存在。当“foo.c”被修改以后,目标“foo ”
将会被重建,但是当“libtest.a ”被修改以后。将不执行规则的命令来重建目标“foo ”。
就是说,规则中依赖文件$(LIBS)只有在目标文件不存在的情况下,才会参与规则的执行。当目
标文件存在时此依赖不会参与规则的执行过程。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4、wildcard使用
在 Makefile 有这样一个变量定义:“objects = *.o ”。它表示变量“objects”的值是字符串“*.o”(并不是期
望的空格分开的.o 文件列表)。
当需要变量“objects”代表所有.o 文件列表示,需要使
用函数“wildcard”
objects = $(wildcar *.o)
例1:
objects = *.o
foo : $(objects)
cc -o foo $(CFLAGS) $(objects)
如果工作目录下有".o"文件,则"foo"会按照规则进行重建。
但是,如果工作目录下没有".o"文件,在执行make的时候就会报错,这时就需要将变量用wildcard来定义:
objects = $(wildcar *.o)
###############################################################
例2:
“$(patsubst %.c,%.o,$(wildcard *.c))”
表示使用“wildcard”函数获取工作目录下的.c 文件列表;之后将列表中所有文件名的后缀.c 替换为.o
#sample Makefile
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////