makefile 学习的点滴总结-(2)

目录

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)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

posted @ 2013-11-26 10:17  tony7373  阅读(160)  评论(0编辑  收藏  举报